打包Jar注意事项

 

一、在JDT中将工程打jar包

第一步:在JDT中选中要打jar包的工程

第二步:鼠标右击,选择Export...

第三步:选择java中的Runnable JAR file(如图)

点击“Next” 

第四步:(1)在Launch configuration:选择要打jar包的mian所在的类名;(如图)

(2)若“launch configuration”里面没有可以选择的东西,只要把你要打包成jar文件的工程运行一次。比如main方法在A类里,运行一次A就有了,这个对应MANIFEST.MF的Main-Class配置。

(3)在Export destination:选择要存放jar的名称和地址。

(4)如果要打的jar包需要调用别的jar包,请选择Library handling下面的“copy required libraries into a sub-folder next to the generated JAR”

 点击 “Finish”即可。 打完后,在Export destination目录中出现以下内容:

H:\myjars
    123.jar
    123_lib
        xwork-core-2.3.20.jar

而123.jar包含以下结构:

META-INF
    MANIFEST.MF
tt
   Tester.class
   WelcomeAction.class

特别关注下MANIFEST.MF文件:

Manifest-Version: 1.0
Class-Path: . 123_lib/xwork-core-2.3.20.jar
Main-Class: tt.Tester

 

问题:

我的java类库是用Myeclipse 8.5做的。其中导入了一些jar文件。但是打包后,运行是能运行,但一些功能都没了。看了一下,原来打成的jar文件中引用的lib中的jar没有打进去。我直接将lib放到压缩包src目录下,(和之前在MyEclipse中的目录一样)也是不能正常运行。

回答:

第三方的Jar包不能打进Jar文件,而是要放在新生成jar的同一目录(或子目录)中。如果会打包,那可能就知道 MANIFEST.MF 这个文件吧,一个 jar 要能运行的话,必须在这个文件中设置 Main-Class: 这个我想已经设置好了。如果要使用到第三方的 jar 包,同样也需要在这个文件中设置一下Class-Path。例如:

Class-Path: xxx/mysql-connector-java-x.x.x-bin.jar xxx/abcdefg.jar xxx/12345.jar

其中xxx是目录名字,随后解释。需要注意的是,多个 jar 以至少一个空格分隔开来,Class-Path: 后面必须得有一个空格,并且在这个文件的最后必须有两个空格,否则这个文件就是无效的。(MANIFEST 规范相当得死)

设置好后,把这个设有 Main-Class 和 Class-Path 的 MANIFEST.MF 文件以及 class 文件打包成 my.jar(文件名任意),需要注意的是第三方的 jar 文件不要打包打进去。

把这个 my.jar 放在一个目录下,同时在这个目录下新建一个上面提到的 xxx目录,把第三方的那些 jar 文件复制这个 xxx下,然后返回上一层 my.jar 所在目录,执行 java -jar my.jar 就能成功运行了。

另外还有一个方法不需要设置 MANIFEST.MF 的 Class-Path,不过不推荐使用,就是把第三方的 jar 文件复制到 Java 的扩展类加载路径中,也就是在 %JRE_HOME%/lib/ext 目录中。


【推荐参考文档】

[1] JAR MANIFEST, http://download.oracle.com/javase/6/docs/technotes/guides/jar/jar.html#JAR%20Manifest
[2] Java Tutorials, Adding Classes to the JAR File's Classpath, http://download.oracle.com/javase/tutorial/deployment/jar/downman.html
[3] Java Tutorials, Installed Extensions, http://download.oracle.com/javase/tutorial/ext/basics/install.html

posted @ 2015-03-22 09:50  张疯牛  阅读(469)  评论(0编辑  收藏  举报
石家庄坦图计算机科技有限公司 石家庄市丰收路220号泽润大厦17层