JAR打包的误区:第三方包的嵌套打包
JAR打包的误区:第三方包的嵌套打包
http://blog.csdn.net/zwx19921215/article/details/24368099
今天弄明白一个关于JAVA项目中JAR打包的问题。
我们有时可能会把自己的项目做成第三方包给别人使用,但是同时我们自己的项目又引用了其他已有的第三方包,在打包的时候,我们经常可能自作聪明地将自己引用的第三方包全部封装在项目根目录下的某个folder下(如lib/),然后将整个项目打成JAR包,最后得意忘形地告诉使用这个包的开发人员:“你只需要在项目中引用这个包就可以了,其他什么都不需要做!
”
但是,事实是,别人导入了你的JAR包后,运行程序时仍然会报NoClassFound: xxxx的错误,也就是说你引用的其他第三方包仍然没有成功导入。
我曾经还傻乎乎地以为只要我修改JAR包里Manifest文件中的"Class-Path: lib/ *.jar"就可以了,其实我错了,一旦我导入这个包之后,ClassPath的路径实际应该是相对于我这个项目而言,而不是对该JAR包有效。
现在我给大家分析一下:
JAR包分为两种:
1. 第三方功能包,供其他开发人员使用其中的功能;
2. 项目型,类似于文件系统的一种JAVA项目打包形式,它应该是随便放到哪里都可以立即部署或者执行。
第一种类型的JAR包,我们见到很多,我上面所讲的一个例子也属于这个类型。通过观察总结发现,这种类型的包内部结构特征是纯代码,不会有类似项目的复杂文件结构,因此不适于在内部加上一个lib的folder来装你引用的第三方包,它更规范的solution应该是向需要引用它的开发人员申明“使用它需要引用哪些第三方包”。然后让开发人员将这些包引入到自己项目下。(你应该也没有看见过有哪个公用的第三方开源包内部还包含着其他的开源包的吧)
第二种类型的JAR包,是为应用程序部署使用的,比如,直接可以用"java -jar xx.jar"命令执行的可执行JAR包。针对这种情况,我们是可以将所有引用的第三方包封装在一个指定目录中,这样就可以拿着这个JAR包到处去执行而不用担心还有哪些第三方包没有引用。
分析到此,我觉得关于JAVA项目打成JAR包应该是有一个笼统的规则:
凡是你需要在自己的项目中引用的JAR,应该内部不再含有第三方Jar包,需要引用的第三方Jar包自己手动引入到自己项目中去。
凡是独立于其他项目,可以直接运行或者部署的,可以包含第三方JAR包一起打包。
原文出自:http://guhanjie.iteye.com/blog/1912769
jar包有嵌套的jar的打包成jar的方法
http://blog.csdn.net/wjy320/article/details/17921165
1.先写一个类,将其打包成jar包。
代码如下:
package com.wjy.jar;
public class GetUserName {
public String getUserName(){
return "JiYuan Wang.";
}
}
打包的包名为:GetUserName.jar
2.再新建一个工程,新建一个文件夹(lib),将GetUserName.jar复制进去。再创建一个类InvokeUserName.java调用上面jar包中的方法。
package com.wjy.test;
import com.wjy.jar.GetUserName;
public class InvokeUserName {
public String show(){
GetUserName getUserName=new GetUserName();
return "Hello I am here: "+getUserName.getUserName();
}
}
工程结构如下:

3.现在想将这个工程整个打包成jar供别的程序使用,但是会出现了jar包嵌套的情况。我试了很多方法,但是都失败了。最后发现了一个好用的插件 fatjar.使用它一步到位,成功了。
fatjar: http://sourceforge.net/projects/fjep/ 下下来后解压缩,将解压后的文件放在eclipse的plungin文件夹中,重启Eclipse即可。
右键将其打包成fatjar,打包好的jar为DllTest.jar。
4.新建一个项目,将DllTest.jar通过build path加载进来,运行即可。搞定。
package com.wjy.runJar;
import com.wjy.test.InvokeUserName;
public class RunJar {
public static void main(String args[]){
InvokeUserName init = new InvokeUserName();
System.out.println(init.show());
}
}

浙公网安备 33010602011771号