`
反求诸己
  • 浏览: 535283 次
  • 性别: 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 要以 / 结尾

 

分享到:
评论

相关推荐

    java swing补丁工具,打包class文件,jsp,html,js,css,xml,jar等文件,同时也支持其他格式的文件打包

    分享自己做的的打包工具,希望能帮助到平时为一堆补丁文件class(自动包含class内部类),jsp,html,js,css,xml,jar等文件花费很长时间整理的朋友,有了我这个工具,似乎这一切都变得简单,你只需要选择路径,然后在...

    如何把一个java程序打包成exe文件.doc

    核心提示:首先,将编译好的程序打包成jar文件,然后做出exe,这样代码就不可见了;但是exe文件在没有安装jre的电脑上不能运行,如果要求客户再去安装jre 设置环境变量 就不雅了。我们需要将jre打包。 这几步操作...

    java程序打包方案

    让java文件的执行更痛快点,不想给其他人演示个小 软件还要在IDE里看效果现在整理出几个windows下双击就能运行java程序的方法,就是弄成.exe和.jar

    阿里云短信验证码java整理jar包

    将原有的sdk整理后重新打包,直接调用。Sample.send(AccessKeyId,AccessKeySecret, 要发送的手机号码, 签名, 模板, 验证码)

    Java GUI程序打包技术.

    我们学习java桌面应用程序技术已经是好久以前的事情了,最近朋友让做一个基于java的会员管理系统,闲来无聊,就把做...我查了一些资料,自己整理了一下,希望那些也想把java项目在window系统上安装使用的朋友有些帮助。

    html2image全部jar.rar

    在做的过程中,发现各种缺jar包,这次我一起都整理好打包。供大家学习实用。 com.lowagie.itext-master.zip core-renderer.jar itext-2.1.7-sources.jar java-html2image-master.zip nekohtml.jar Xerces-J-...

    JAVA POI 4.0 对Excel读写整理LIB以及样例工程

    针对使用JAVA POI 4.0的Jar包进行了整理,提取了必要的jar整理打包LIb,并提供了 对Excel读写整理的可运行全工程。同类POI版本最高,最便宜的

    【新手向】spring系列jar包整理

    【新手向】不会maven不要紧,Spring5.2.5系列Jar包以及mybatis整合包+mysql+oracle驱动打包压缩下载

    java打包工具

    分享自己做的的打包工具,希望能帮助到平时为一堆补丁文件class(自动包含class内部类),jsp,html,js,css,xml,jar等文件花费很长时间整理的朋友,有了我这个工具,似乎这一切都变得简单,你只需要选择路径,然后在...

    JAVA学习教程

    自己整理的Java如何打包jar包,在dos界面如何运行,如何调用不同项目不同包之间的类。

    Java学习笔记-个人整理的

    {10.2}其他Java相关}{146}{section.10.2} {11}项目}{148}{chapter.11} {11.1}ELTS}{148}{section.11.1} {12}Oracle数据库}{151}{chapter.12} {12.1}术语}{151}{section.12.1} {12.2}登录数据库}{151}{section....

    java 游戏 超级玛丽 双击直接运行

    java 游戏超级玛丽 [代码完整版]我整理了下 打包成jar了 安装jre后 双击直接可运行 网上下的分享给大家研究

    免费java权限(应用开发)框架,包含源码,全功能

    java权限后台开发框架,采用spring + srpingsecurity + springMVC + Hibernate + freemarker + jquery 等技术实现,页面及源文件打包发布程序。 完整的功能应用,包括:后台权限、人员机构、参数代码、角色权限、...

    开源Java 扫雷游戏JMine2.0

    可执行jar打包 4.加载jar内资源图片 5.代码修改 6.代码整理 7.文件夹结构整理 8.添加注释 9.有任何建议和bug报告请联系作者, Email为jerry.shen@cognizant.com或jerry_shen_sjf@yahoo....

    dubbo Admin的可视化管控台

    该项目是SpringBoot开发的需要使用maven命令打包后运行,或者直接放在idea工具中运行也可以,我这里整理出来了,给大家直接发一个小编打包好的应用,该项目的运行必须有注册中心的支持,也就是说必须先运行zookeeper...

    利用Java发送邮件(含附件)的例子

    利用Java发送邮件(含附件)的例子 1、邮件发送的配置propertity文件内容如下:(utils.properties文件放在src下面) emailsmtp=smtp.qq.comemailaddress=459104018@qq.comemailpass=******2、读取配置文件的类文件...

    jdk-6u31-windows-x64

    jar – 打包工具,将相关的类文件打包成一个文件 javadoc – 文档生成器,从源码注释中提取文档 jdb – debugger,查错工具 环境变量配置教程 安装完成后就要开始配置了。在“我的电脑”上点击右键,选择“属性”,...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    书名:《Java开发实战1200例(第I卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为...

    Java项目打war包的方法

     我们知道Java项目打war包可以在Eclipse和MyEclipse工具中自动打包,是右键,然后导出war包可以了,可是我发现我的一个项目打war包的过程中遇到点小麻烦,导出的war包打开之后,里面少了很多东西,明显有问题。...

Global site tag (gtag.js) - Google Analytics