今天弄明白一个关于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包一起打包。
相关推荐
ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三...
MyEclipse和Eclipse打包包含第三方jar包的插件,内含安装说明,方便快捷使用。
myeclpse7.5fatjar第三方包打包到压缩包,使用fatjar插件打包
生成swing 客户端exe文件! 加载第三方包文件
NULL 博文链接:https://dengzhangtao.iteye.com/blog/1902863
里面涉及到一个第三方的包,这时候我生成aar/jar包给对方使用的时候,调用不到第三方包的代码,只可以调用我写的类的代码. 问题 我就去网上去寻找,aar/jar包生成包含第三方等问题.网上也有很多答案,我随便发一个别人的...
myeclipse打包中引用第三方jar包的方法。
universal-image-loader,图片加载第三方包
myeclpse7.5fat jar 将第三方包导入项目
myeclipse打包jar文件的工具fatjar和详细的教程
该资源应用于java里的excel第三方包
java数据库第三方包和配置java数据库第三方包和配置java数据库第三方包和配置java数据库第三方包和配置java数据库第三方包和配置java数据库第三方包和配置java数据库第三方包和配置
flink安装所需要的第三方jar,即flink-shaded-hadoop-2-uber-2.7.5-10.0.jar
利用fat jar可以方便地对java工程进行打包,它可以将第三方包以及程序本身打成一个综合包
Spring 实现AOP需要三个第三方的jar包,分别是aspectjrt.jar,aspectjweaver.jar,aopalliance-1.0.jar
spring切面AOP所使用的jar包
python连接gbase数据库的第三方包,这个是官方提供的资源,有不同版本支持python2和python3,网上很难找到!
包括所有《机器学习实战》所有的第三方包,节省大家寻找的时间了
为了追求极致,在空闲时间开发了这个小工具,可以用来精简依赖的第三方包体积,从而使我们的JAR变瘦。 使用步骤 1)选择需要精简的JAR文件,支持拖拽。 2)填写需要精简的包前缀,指明哪些第三方包需要精简。 3)...
Java生成UUID使用的第三方包,生成UUID的第三方包,