`
guhanjie
  • 浏览: 300511 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAR打包的误区:第三方包的嵌套打包

    博客分类:
  • Java
 
阅读更多

今天弄明白一个关于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包一起打包。

 

 

 

 

 

 

 

 

 

分享到:
评论
2 楼 jjiale 2017-01-11  
很有帮助 
1 楼 关西平次君 2016-12-30  
不错!

相关推荐

    ant 涉及第三方包问题 打包第三方包 或者添加第三方包

    ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三方包 ant 涉及第三方包问题 打包第三方包 或者添加第三...

    Fatjar打包第三方包

    Fatjar,又称为“胖Jar”,指的是将所有依赖库(包括第三方jar包)一起打包到单个JAR文件中的方法。这样做可以使得最终用户无需担心类路径配置问题,只需双击运行这个“胖”JAR即可。 在MyEclipse和Eclipse中,打包...

    myeclpse7.5fatjar第三方包打包到压缩包

    "myeclipse7.5fatjar第三方包打包到压缩包"这个标题指的就是使用MyEclipse 7.5版本的集成开发环境,结合fatjar插件,将项目及其依赖的第三方库打包成一个压缩包的过程。 MyEclipse 7.5是一款功能强大的Java EE集成...

    eclipse 打包 jar 碰到的问题(包含第三方包)

    这篇博客“eclipse 打包 jar 碰到的问题(包含第三方包)”主要讨论了在Eclipse中处理这种问题的方法。 首先,问题的症结在于如何正确地将项目依赖的第三方库包含到JAR文件中。通常,我们创建的Java项目会引用一些...

    打包可执行程序引用了第三方包)

    标题 "打包可执行程序引用了第三方包" 指的是在软件开发过程中,开发者经常会使用到外部的开源库或第三方组件来实现特定功能。这些组件可能来自不同的编程语言的包管理器,如Python的pip、Java的Maven、Node.js的npm...

    创建jar并引入第三方包

    本文将详细介绍如何在MyEclipse中创建JAR文件并包含第三方包。 首先,理解JAR(Java Archive)文件是一种归档格式,用于集合多个Java类文件、资源文件和元数据。JAR文件通常用于分发Java应用程序或库,可以被Java...

    java+swing打包jar转成exe 轻松加载第三方包

    这个过程涉及到将Java的JAR文件转换为Windows平台上的EXE文件,并且还需要处理第三方库的集成。以下是使用exe4j进行此操作的详细步骤和注意事项: 1. **准备阶段**: - 确保你的JAR文件、ICO图标、第三方库(存放...

    myeclipse打包jar文件包含第三方jar包(文档+工具)

    `FatJar`是一个第三方插件,适用于`Eclipse`和`MyEclipse`,它的主要功能是帮助开发者将所有项目依赖的库文件(即第三方JAR包)打包进最终的可执行JAR中。这样,当用户运行这个单一的JAR文件时,不需要额外配置类...

    解决第三方包导入冲突

    然而,在某些情况下,可能会遇到"第三方包导入冲突"的问题,这主要是因为两个或更多的库依赖于相同但版本不同的类或者方法,导致编译或运行时出错。本篇将深入探讨如何解决这类问题。 首先,当遇到包冲突时,一个...

    excel第三方包

    本文将详细讨论“excel第三方包”这一主题,主要聚焦于Apache POI项目及其相关组件,以及另一个流行的库JXL。 Apache POI是Apache软件基金会的一个开源项目,专门用于处理Microsoft Office格式的文件,尤其是Excel...

    android 生成aar/jar包包含第三方jar包没有第三方jar包怎么办

    里面涉及到一个第三方的包,这时候我生成aar/jar包给对方使用的时候,调用不到第三方包的代码,只可以调用我写的类的代码. 问题 我就去网上去寻找,aar/jar包生成包含第三方等问题.网上也有很多答案,我随便发一个别人的...

    myeclpse7.5fat jar 将第三方包导入项目

    在Java开发中,"fat jar"(也称为"uber jar")是一种打包方式,它将所有依赖库(包括第三方库)合并到一个单独的JAR文件中,使得开发者可以轻松地分发和运行整个应用程序,而无需关心项目的依赖关系。在本教程中,...

    jdk引入第三方jar

    在Java开发过程中,引入第三方JAR包是常见的操作,它能帮助我们快速利用已有的库功能,节省开发时间和精力。本篇文章将详细讲解如何在Java项目中导入并使用第三方JAR包,以及与之相关的工具和实践技巧。 首先,我们...

    spring切面AOP所使用的jar包

    在Spring AOP中,主要涉及到两个重要的库:aspectjweaver.jar和aspectjrt.jar,这两个jar包在实现AOP功能时起着至关重要的作用。 1. **aspectjweaver.jar**: 这个jar包是AspectJ Weaver的实现,它是AspectJ编译器...

    Spring使用AOP的三个jar包

    3. `aopalliance-1.0.0.jar`:作为AOP框架间的桥梁,定义了通用接口,使不同框架的拦截器可以互相协作。 在实际开发中,你可以根据需求选择合适的织入方式(如Spring的代理模式或AspectJ的字节码织入),并结合这三...

    springMVC jar依赖包全

    3. **数据访问**: - `spring-jdbc.jar`:提供JDBC抽象层,简化数据库操作。 - `spring-tx.jar`:事务管理支持,可实现声明式事务处理。 4. **视图解析**: - `spring-expression.jar`:Spring表达式语言(SpEL...

    Eclipse RCP中使用第三方包

    使用第三方包在Eclipse RCP中非常简单,只需要将jar文件添加到classpath中,并在Runtime页面中配置classpath,然后我们就可以使用第三方库中的类和方法来实现某些功能。 知识点: 1.Eclipse RCP是什么? 答:...

    flink安装所需要的第三方jar

    标题中的“flink安装所需要的第三方jar”指的是在部署和运行Apache Flink项目时,除了Flink自身的基础库之外,可能还需要依赖的一些外部JAR包。这些JAR包通常包含了Flink与其它系统的交互所需的组件,比如Hadoop。在...

    android第三方包

    "Universal Image Loader"(简称UIL)就是一款专为Android设计的高效、强大的第三方图片加载库。这个库由Sergey Tarasevich开发,旨在解决Android原生API在处理图片时的性能和内存管理问题。 Universal Image ...

    spring boot 第三方jar包抽离方案

    通过修改`spring-boot-maven-plugin`的配置,可以排除不需要打包进jar的第三方jar包。可以按maven坐标排除,也可以按组ID排除。在父工程的`etcloud-parent`中定义插件配置,子工程引用父工程配置并可覆盖自定义设置...

Global site tag (gtag.js) - Google Analytics