java项目打成jar包时引用了第三方jar

Web项目做多了,反而对单纯的java项目陌生了,今天我们在开发项目的过程中,碰到一个这样的需求:需要将java项目放到linux系统上跑起来,当然这个javaSE项目是带main方法的。我们知道在IDE里写完JavaSE项目后,运行非常简单,只要本地java环境装好了,右击main方法---->run as-->java application就行,那么放到linux上呢?目前我们想到的有两种方法:一种是打成jar包放到服务器上,用命令java -jar ****.jar执行jar包即可。另外一种也是挺常见的将java项目放到服务器上,然后写一个shell脚本执行。关于方法二,还正在尝试之中。今天我要说的是方法一操作时需要注意的。

打jar包很简单,直接在myeclipse或者eclipse里导出jar包就行。具体做法是:

右击项目------->export---->选择JAR file:

------>next----->:指定导出的jar包具体存放位置即jar包名称:

------>next--->默认:

------>选择要执行的main方法:

----->finesh,这样将JavaSE项目打成jar包就完成了,到此就可以放到服务器上执行java -jar test.jar,就执行指定的main方法了。

至此,如果你写的java项目没有引入第三方的jar包,一点问题都没有,但是一旦你引入了框架呀或者自己公司写的jar包时,问题就悄悄来了,待你执行时就会发现抛出了NoClassDeFined诸如此类的问题,也就是找不到这个类,这时候你也许会奇怪,为啥呀,明明有这个类啊,那是你的错觉,你在IDE里导入了需要的jar包,当然会有了,但问题时你现在执行的这个jar文件放到了服务器上,它里面是否包含了这个jar呢,原来我以为打成jar包时就把引入的jar包一并再次打包,现在想想应该不会吧。呵呵,具体我还没怎么去深究,今天咱们先把这个解决方法说了。

步骤一:在你服务器存放jar包的同级目录下创建一个lib目录,并且将所有需要导入的第三方jar包全放进去,一个也不要剩:

步骤二:在IDE里准备清单文件:MANIFEST.MF,即在项目的目录下,新建一个MANIFEST.MF文件,先不要问为什么,相信我,咱们先解决掉咱们问题后再说:

关于清单文件里的内容:

ManifestMain-Version:版本,1.0

Class-Path:将第三方的jar名都放进去,注意:后面要留一个空格

Main-Class:jar包要执行的main方法,记得写类的全路径,同事:后面要留一个空格。

OK了,清单文件准备完成了,继续下一步操作。

步骤三:重新打jar包,步骤和原来的一样,export---next---...但是有一点区别的是,如下需要使用自己写好的清单文件:

步骤四:jar包打好了,传到你的linux服务器上吧,记得和lib放在同一级目录下,这样执行java -jar test.jar就能顺利执行了。

今天只是说明了其中的一种解决办法,至于原理我想你在写清单文件的时候应该就理解了吧,它会去这个class-path里找到jar包解析了。

<think>我们正在讨论如何检查已构建的Java JAR文件中的依赖JAR版本。用户可能使用Maven或Gradle构建了项目,并生成了一个依赖的JAR(例如,通过maven-assembly-plugin或spring-boot-maven-plugin打的fat jar),或者是一个普通的JAR(其依赖在lib目录下)。我们需要提供方法来查看这些依赖的版本。 方法概述: 1. 使用`jar`命令解压JAR文件,然后检查内部文件(如MANIFEST.MF或pom.properties)来获取版本信息。 2. 使用专门的工具,如`jdeps`(Java自带)或第三方工具(如`mvn dependency:tree`但需要原始项目,不适用于仅有JAR的情况)。 3. 对于Spring Boot的fat jar,可以使用`java -jar <jar文件> --debug`来查看依赖树(但注意,这可能会运行应用,所以不推荐在生产环境使用,且并非所有Spring Boot版本都支持)。 4. 使用构建工具(如Maven)的插件来分析JAR,但这通常需要原始项目。 由于用户只有构建好的JAR文件,我们将重点放在无需原始项目的方法上。 具体步骤: 方法一:解压JAR文件并检查内部文件 步骤1:使用`jar`命令或任何解压工具解压JAR文件。 步骤2:在解压后的目录中,查找依赖的JAR文件(如果是一个fat jar,则依赖JAR通常位于`BOOT-INF/lib/`或`lib/`目录下)。对于普通JAR,如果依赖没有打进去,则此方法不适用(因为普通JAR依赖JAR,而是依赖外部的JAR)。 步骤3:对于每个依赖JAR,其文件名通常版本信息。如果没有,可以进一步查看依赖JAR内部的`META-INF/MANIFEST.MF`或`META-INF/maven/<groupId>/<artifactId>/pom.properties`文件。 方法二:使用`jdeps`命令(适用于分析JAR中的类依赖,但不直接显示版本) 但是,`jdeps`不会显示依赖的版本号,它只显示类级别的依赖关系。所以这个方法不直接满足需求。 方法三:对于Spring Boot的fat jar,使用内置的启动机制(不推荐,因为会启动应用): 在Spring Boot 2.3.0及更高版本中,可以使用`--debug`选项在启动打印依赖树,但这会启动应用。所以如果只是想查看依赖而不启动应用,不推荐。 方法四:使用第三方工具 例如,使用`maven-dependency-plugin`的`analyze`目标,但这需要原始项目的POM文件,所以不适用。 因此,最通用的方法是解压JAR文件并检查依赖JAR的版本。 详细步骤(方法一): 1. 创建一个临目录并进入该目录。 2. 解压目标JAR文件:`jar xf /path/to/your-application.jar` 3. 如果是普通JAR(非fat jar),则可能没有依赖JAR,需要查看MANIFEST.MF中的Class-Path来获取外部依赖的路径和版本(通常文件名中版本)。 4. 如果是fat jar(如Spring Boot),则依赖JAR位于`BOOT-INF/lib/`(对于Spring Boot)或`lib/`(其他fat jar)目录下。进入该目录。 5. 依赖JAR的文件名通常遵循`<artifactId>-<version>.jar`的格式。因此,可以直接从文件名中获取版本。 6. 如果文件名没有版本信息,则需要解压单个依赖JAR,查看其`META-INF/maven/<groupId>/<artifactId>/pom.properties`文件,该文件groupId、artifactId和version信息。 注意:如果项目使用Maven打,在fat jar中,主项目的`pom.properties`通常位于`META-INF/maven/<groupId>/<artifactId>/pom.properties`,而依赖的pom.properties则位于依赖JAR内部。 方法五:使用脚本自动提取 可以编写一个简单的shell脚本(或批处理脚本)来遍历lib目录下的所有JAR,并尝试提取版本信息。 示例脚本(Linux/macOS): ```bash # 假设已经解压了应用JAR,并且依赖在BOOT-INF/lib/目录下 cd /path/to/extracted/jar/BOOT-INF/lib/ for jarfile in *.jar; do # 尝试从文件名中提取版本 version_from_name=$(echo "$jarfile" | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+[^/]*$' || echo "unknown") if [ "$version_from_name" != "unknown" ]; then echo "JAR: $jarfile Version: $version_from_name (from filename)" else # 尝试解压pom.properties if unzip -p "$jarfile" META-INF/maven/*/*/pom.properties 2>/dev/null > pom.properties; then version=$(grep 'version' pom.properties | cut -d'=' -f2) groupId=$(grep 'groupId' pom.properties | cut -d'=' -f2) artifactId=$(grep 'artifactId' pom.properties | cut -d'=' -f2) echo "JAR: $jarfile GroupId: $groupId ArtifactId: $artifactId Version: $version (from pom.properties)" rm pom.properties else # 如果pom.properties不存在,尝试从MANIFEST.MF中获取 unzip -p "$jarfile" META-INF/MANIFEST.MF > MANIFEST.MF 2>/dev/null if [ -s MANIFEST.MF ]; then version=$(grep 'Implementation-Version\|Bundle-Version' MANIFEST.MF | head -1 | cut -d':' -f2 | tr -d '[:space:]') echo "JAR: $jarfile Version: $version (from MANIFEST.MF)" rm MANIFEST.MF else echo "JAR: $jarfile Version: unknown" fi fi fi done ``` 注意:这个脚本是一个示例,可能需要根据实际情况调整。 方法六:使用专门的工具,如`jdependency`(一个Java库)或`tattletale`(一个用于分析JAR依赖的工具),但这些工具可能需要额外的设置。 总结:对于大多数情况,解压JAR文件并检查依赖JAR的文件名或内部属性文件是最直接的方法。 相关问题: 1. 如何解压JAR文件? 2. 如果JAR文件是Spring Boot的可执行JAR,结构有什么不同? 3. 如何在没有版本信息的情况下确定JAR的版本? 4. 有哪些工具可以自动化分析JAR文件的依赖树? 我们将按照上述方法详细说明。</think>要检查已构建的Java JAR文件中的依赖JAR版本,可通过以下方法逐步操作: ### 方法1:检查文件名(最快速) 依赖JAR通常按`<artifactId>-<version>.jar`格式命名: 1. 解压主JAR文件: ```bash jar xf your-application.jar ``` 2. 进入依赖目录(根据打工具不同): - Maven Shade/Assembly插件:`/lib/`目录 - Spring Boot:`/BOOT-INF/lib/`目录 3. 直接查看文件名中的版本信息: ``` spring-core-5.3.18.jar # 版本为5.3.18 jackson-databind-2.13.1.jar # 版本为2.13.1 ``` ### 方法2:检查内部属性文件 若文件名无版本信息: 1. 解压目标依赖JAR: ```bash jar xf dependency-library.jar ``` 2. 查看`META-INF/maven/<groupId>/<artifactId>/pom.properties`文件: ```properties # pom.properties示例 groupId=com.fasterxml.jackson.core artifactId=jackson-databind version=2.13.1 ``` ### 方法3:查看MANIFEST.MF 1. 解压主JAR后检查: ```bash unzip -p your-application.jar META-INF/MANIFEST.MF ``` 2. 查找`Class-Path`条目(普通JAR适用): ``` Class-Path: lib/gson-2.8.9.jar lib/commons-lang3-3.12.0.jar ``` ### 方法4:使用分析工具 - **JD-GUI**(图形化工具): 直接打开JAR文件查看`pom.properties` - **命令行扫描**: ```bash # 查找所有pom.properties文件 find . -name "pom.properties" -exec grep "version" {} \; ``` ### 不同打方式的路径差异 | 打方式 | 依赖路径 | |------------------------|-----------------------| | 标准JAR(带lib目录) | `/lib/` | | Spring Boot Fat Jar | `/BOOT-INF/lib/` | | Maven Shade Plugin | `/`(根目录合并) | | Maven Assembly Plugin | `/lib/` | > ⚠️ 注意:若依赖通过`<scope>provided</scope>`声明,则不会JAR中,需检查构建配置[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值