java java java java 打包 jarjarjarjar 关键 字 :::: java java java java 打包 jarjarjarjar 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 加入如下条目 运行 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 要以 / 结尾
还剩3页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

haotian

贡献于2012-12-13

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf