`
20921556
  • 浏览: 94367 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

java打包 jar

阅读更多
java打包 jar
关键字: java jar
发布Java应用程序时你会感到困难?好在Java提供了一系列打包和发布工具,可以显著的简化发布过程该文章提供了打包Java code的几种方法,我们将会探讨Java manifest 文件,给出用于管理JAR文件所依赖文件、估计跨平台发布所需的CLasspath的合适方法.我也会解释如何使用manifest包版本特性来确认包的兼容性...
什么是JAR文件?
在开发过程中,我们可以直接使用Java class文件来运行程序,但这并不是一个好方式,好在Java 提供了 JAR(Java Archive)文件来提供发布和运行。
jar 文件实际上是class 文件的ZIP压缩存档,这种格式被广泛使用,因此易与使用,有很多中工具可以操作这种格式的文件。也正是因为这个原因,jar文件本身并不能表达所包含应用程序的标签信息。
Manifest 因此得以出现
为了要提供存档的标签信息,jar 文件指定了一个特定目录来存放标签信息:META-INF 目录,其中我们来关注该目录中的MANIFEST.MF文件,他就是JAR的manifest文件,他包含了JAR文件的内容描述,并在运行时向JVM提供应用程序的信息,大多数JAR文件含有一个默认生成的manifest 文件,执行JAR命令或使用zip工具,都可以产生它
如果是由jar命令产生的 manifest 文件,形如:
Manifest-Version: 1.0
Created-By:1.4.0-beta
(Sun Microsystems Inc.)
这些信息没甚么用,仅仅告诉我们使用的是1.0的manifest文件,第一行定义manifest的格式,第二行说明使用 SUN 的JDK1.4的jar工具生成该文件,如果manifest文件是由其他 (如ant) 创建的,那将会出现 “Created-By: Ant 1.2” 之类的内容,如果你是自己创建manifest文件,你可以加入自己的一些相关信息.
基础格式
manifest 文件的格式 是很简单的,每一行都是 名-值 对应的:属性名开头,接着是 ":" ,然后是属性值,每行最多72个字符,如果需要增加,你可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。
所有在开头的属性都是全局的,你也可以定义特定class 或package的属性,稍后将介绍这种
把manifest文件插入JAR文件
使用 m 选项,把指定文件名的manifest文件 传入,例如
jar cvfm myapplication.jar myapplication.mf [-C]classdir
如果你使用ant来创建时,在ant 的build.xml 加入如下条目
<target name="jar">
<jar jarfile ="myapplication.jar"
manifest="myapplication.mf">
<fileset dir="classdir"
includes="**/*.class"/>
</jar>
</target>
运行Java程序
现在我们来体验一下manifest文件的作用,如果现在我们有一个Java 应用程序打包在myapplication.jar中, main class为 com.example.myapp.MyAppMain ,那么我们可以用以下的命令来运行
java -classpath myapplication.jar com.example.myapp.MyAppMain
这显然太麻烦了,现在我们来创建自己的manifest文件,如下:
Manifest-Version: 1.0
Created-By: JDJ example
Main-Class: com.example.myapp.MyAppMain
这样我们就可以使用如下的命令来运行程序了:(明显简单多了,也不会造成无谓的拼写错误)
java -jar myapplication.jar
管理JAR的依赖资源
很少Java应用会仅仅只有一个jar文件,一般还需要 其他类库。比如我的应用程序用到了Sun 的 Javamail classes ,在classpath中我需要包含activation.jar 和 mail.jar,这样在运行程序时,相比上面的例子,我们要增加一些:
java -classpath mail.jar:activation.jar -jar myapplication.jar
在不同的操作系统中,jar包间的分隔符也不一样,在UNIX用“:”,在window中使用 “;”,这样也不方便
同样,我们改写我们的manifest文件,如下
Manifest-Version: 1.0
Created-By: JDJ example
Main-Class: com.example.myapp.MyAppMain
Class-Path: mail.jar activation.jar
(加入了Class-Path: mail.jar activation.jar,用空格分隔两个jar包)
这样我们仍然可以使用和上例中相同的命令来执行该程序:
java -jar myapplication.jar
Class-Path属性中包含了用空格分隔的jar文件,在这些jar文件名中要对特定的字符使用逃逸符,比如空格,要表示成"%20",在路径的表示中,都采用“/”来分隔目录,无论是在什么操作系统中,(即使在window中),而且这里用的是相对路径(相对于本身的JAR文件):
Manifest-Version: 1.0
Created-By: JDJ example
Main-Class: com.example.myapp.MyAppMain
Class-Path: ext/mail.jar ext/activation.jar
Multiple Main Classes(多主类)
还有一种Multiple Main Classes情况,如果你的应用程序可能有命令行版本 和GUI版本,或者一些不同的应用却共享很多相同的代码,这时你可能有多个Main Class,我们建议你采取这样的策略:把共享的类打成lib包,然后把不同的应用打成不同的包,分别标志主类:如下
Manifest for myapplicationlib.jar:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: mail.jar activation.jar
Manifest for myappconsole.jar:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: myapplicationlib.jar
Main-Class: com.example.myapp.MyAppMain
Manifest for myappadmin.jar:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: myapplicationlib.jar
Main-Class: com.example.myapp.MyAdminTool
在myappconsole.jar 和 myappadmin.jar的manifest文件中分别注明各自的 Main Class
Package Versioning
完成发布后,如果使用者想了解 ,哪些代码是谁的?目前是什么版本?使用什么版本的类库?解决的方法很多 ,manifest提供了一个较好的方法,你可以在manifest文件中描述每一个包的信息。
Java 秉承了实现说明与描述分离的原则,package 的描述 定义了package 是什么,实现说明 定义了谁提供了描述的实现,描述和实现包含 名、版本号和提供者。要得到这些信息,可以查看JVM的系统属性(使用 java.lang.System.getProperty() )
在manifest文件中,我可以为每个package定义描述和实现版本,声明名字,并加入描述属性和实现属性,这些属性是
Specification-Title
Specification-Version
Specification-Vendor
Implementation-Title
Implementation-Version
Implementation-Vendor
当要提供一个类库或编程接口时,描述信息显得是很重要,见以下范例:
Manifest-Version: 1.0
Created-By: JDJ example
Class-Path: mail.jar activation.jar
Name: com/example/myapp/
Specification-Title: MyApp
Specification-Version: 2.4
Specification-Vendor: example.com
Implementation-Title: com.example.myapp
Implementation-Version: 2002-03-05-A
Implementation-Vendor: example.com
Package Version 查询
在manifest文件中加入package描述后,就可以使用Java提供的java.lang.Package class进行Package 的信息查询,这里列举3个最基本的获取package object的方法
1.Package.getPackages():返回系统中所有定义的package列表
2.Package.getPackage(String packagename):按名返回package
3.Class.getPackage():返回给定class所在的package
使用者这方法就可以动态的获取package信息.
需要注意的是如果给定的package中没有class被加载,则也无法获得package 对象
Manifest 技巧
总是以Manifest-Version属性开头
每行最长72个字符,如果超过的化,采用续行
确认每行都以回车结束,否则改行将会被忽略
如果Class-Path 中的存在路径,使用"/"分隔目录,与平台无关
使用空行分隔主属性和package属性
使用"/"而不是"."来分隔package 和class ,比如 com/example/myapp/
class 要以.class结尾,package 要以 / 结尾



更多请点击进入
Code110.com技术导航站,收录上千技术网站及多种教程/API文档,还能收录你感兴趣的它  http://www.code110.com
分享到:
评论
2 楼 zhongdao 2012-07-24  
1 楼 mingyang2013 2009-12-11  
点错了

相关推荐

    java打包jar

    Java打包JAR(Java Archive)是一项常见的开发任务,它允许我们将多个类文件、资源和配置文件集合到一个可执行的JAR文件中。这有助于简化代码分发、部署和存储,同时也支持Java的类加载机制。在Eclipse这样的集成...

    java打包jar方案的优缺点分析及解决方案

    Java打包成JAR文件是将源代码编译后的字节码和相关资源组合在一起的常见方式,便于分发和执行。以下是对三种不同打包方法的详细分析和比较: 1. **使用Eclipse插件fat.jar打包** `fat.jar`插件允许开发者将所有...

    java打包jar文件实例

    Java打包JAR(Java Archive)文件是将多个类文件、资源文件和其他相关文件组合到一个单一的可执行文件中,以便于分发和执行。在Java开发中,JAR文件通常用于封装库、应用程序或者Java小应用程序(Applet)。本实例将...

    Java 打包jar生成exe(极限精简完全攻略)

    大家都知道,通常Java程序需要JVM与OS互动才能运行于本地环境之上,所谓鱼与熊掌不可兼得,这样做虽然极大降低了程序的移植难度,却同时增加了程序的环境要求,因为无论你用什么方法,总需弄个虚拟机才能让你的Java...

    JAVA打包jar教程.rar

    这个名为"JAVA打包jar教程.rar"的压缩包包含了一整套关于如何打包Java程序为JAR文件的教程资源。以下是这个教程可能涵盖的知识点: 1. **JAR文件**:JAR是Java平台上的归档格式,用于存储多个类文件、资源文件以及...

    java打包jar.pdf

    Java打包和发布的基础是将Java代码打包成JAR(Java Archive)文件,这是一种方便管理和分发Java应用程序的方式。JAR文件本质上是多个.class文件的ZIP压缩格式,它允许开发者将相关的类、资源和元数据组织在一起,...

    java打包成jar

    ### Java 打包成 JAR 文件的详细指南 在Java开发过程中,将项目打包成一个JAR(Java Archive)文件是非常常见的做法。JAR文件不仅可以方便地进行分发与部署,还能有效地组织类文件和资源文件。根据提供的信息,本文...

    java打包jar 和exe

    【Java 打包成 JAR 和 EXE 文件】 在 Java 开发中,有时我们需要将编写的程序打包成可执行文件,以便用户能够更方便地运行。对于 Java 程序,最常见的打包方式是生成 JAR (Java ARchive) 文件,这是一种归档格式,...

    java打包jar、第三方jar包、制作成.bat批处理

    在Java开发过程中,将项目打包成JAR(Java Archive)文件是常见的操作,这使得代码可以方便地分发和执行。JAR文件本质上是一个ZIP格式的归档,包含类文件、资源文件以及元数据。本篇文章将深入探讨如何打包Java项目...

    Java程序打包成jar文件

    NULL 博文链接:https://jarg.iteye.com/blog/852885

    Java项目后台打包jar包执行报错“没有主清单属性”

    在Java开发过程中,将项目打包成可执行的jar文件是一项常见的任务,这使得代码可以方便地在不同环境中部署和运行。然而,有时在打包过程中可能会遇到一些错误,比如"没有主清单属性"。这个错误表明jar文件缺少了必要...

    将java文件打包成 jar jar命令详解

    ### Java 文件打包成 JAR 文件详解 #### 一、JAR 命令概述 JAR(Java Archive)是 Java 开发工具包 (JDK) 中的一个实用程序,用于将多个 Java 类文件和其他资源文件打包成一个 JAR 文件。JAR 文件不仅便于分发和...

    java打包为jar

    在Java开发过程中,将项目打包成可执行的JAR(Java Archive)文件是常见的操作,这使得代码可以方便地分发、部署和运行。本文将详细介绍如何将Java工程打包成可执行的JAR文件。 首先,确保你有一个完整的Java工程,...

    对java jar包实现混淆加密

    Java jar包是Java应用程序的可执行格式,它包含编译后的类文件和其他资源。为了保护源代码不被轻易反编译和理解,开发者通常会使用混淆加密技术来增强代码的安全性。本文将深入探讨如何对Java jar包进行混淆加密,...

    Java打包成jar文件,以及将jar文件导出为exe文件方法汇总[汇编].pdf

    Java 打包成 jar 文件和将 jar 文件导出为 exe 文件的方法汇总 本文档将详细介绍 Java 打包成 jar 文件和将 jar 文件导出为 exe 文件的方法汇总。Java 是一种流行的编程语言,广泛应用于软件开发、Android 应用开发...

    jarjar-方便Java打包工具,自定义修改jar包包名

    标题提到的"jarjar-方便Java打包工具,自定义修改jar包包名",这表明jarjar允许开发者对JAR内的类进行重命名,并且可以改变JAR本身的文件名。这种灵活性对于项目维护、依赖管理或解决类冲突问题非常有帮助。例如,你...

    JAVA 打包(jar\tar\zip)源码

    这里我们将深入探讨JAVA的打包机制,主要关注jar、tar和zip这三种常见的打包格式,以及如何处理它们的源码。 首先,`jar`文件是Java档案文件,它是Java平台特有的打包方式,用于收集多个类文件、相关的元数据和资源...

    java 程序打包成jar文件后 连接数据库出错(教程方法)

    在Java编程中,将程序打包成JAR文件是常见的部署方式,这使得代码可以作为一个独立的可执行单元进行分发。然而,在打包包含数据库连接的Java应用程序时,可能会遇到一些问题,尤其是涉及到像MySQL这样的外部数据库。...

    java代码的方式对java源码进行编译并打包成jar

    在Java开发过程中,将源码编译并打包成JAR(Java Archive)文件是一项常见的任务。JAR文件是Java平台特有的归档格式,它能够包含类文件、资源文件以及元数据,便于分发和执行。这里我们将详细讲解如何通过编写Java...

    Java进阶学习jar打包详解

    Java进阶学习jar打包详解 Java进阶学习jar打包详解 Java进阶学习jar打包详解 Java进阶学习jar打包详解

Global site tag (gtag.js) - Google Analytics