更新spring boot jar包中的BOOT-INF/lib目录下的jar包

更新spring-boot jar包中的BOOT-INF/lib目录下的jar包

场景

需要更新lib目录下某个jar包的配置文件

失败的解决方法

用解压软件依次打开spring-boot jar包(设为a.jar)、BOOT-INF/lib目录下的jar包(设为b.jar),然后修改配置文件后保存回a.jar包中,这样操作在通过java -jar运行a.jar包时会导致以下错误:
java.lang.IllegalStateException: Unable to open nested entry b.jar. It has been compressed and nested jar files must be stored without compression

错误原因

保存修改后lib下的b.jar时压缩软件对b.jar进行了压缩,导致b.jar包损坏

解决方案

  • a.jar包所在文件夹新建BOOT-INF文件夹,再在BOOT-INF下新建lib文件夹;
  • 复制BOOT-INF/lib下的b.jar包到以上新建的lib文件夹下;
  • 修改b.jar包配置文件并保存;
  • a.jar所在的文件夹运行jar -uf0 a.jar BOOT-INF/lib/b.jar命令,即可将修改后b.jar无压缩地添加a.jar的指定路径中。

备注

在jar -uf0命令中,

  • u 指更新现有的归档文件,
  • f 指定归档文件名 / 为压缩包指定名字,
  • 0 仅存储,不压缩,只是打包;不使用任何 ZIP 压缩
    jar命令
EXCEPTION:java.lang.IllegalStateException: java.util.concurrent.ExecutionException: java.lang.UnsatisfiedLinkError: Unable to load library '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so': Native library (tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so) not found in resource path ([jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/classes!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/platform-service-common-1.0.0-SNAPSHOT.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-boot-2.5.12.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/logback-classic-1.2.11.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/logback-core-1.2.11.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/log4j-to-slf4j-2.17.2.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/log4j-api-2.17.2.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/jul-to-slf4j-1.7.36.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/jakarta.annotation-api-1.3.5.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/snakeyaml-1.28.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-context-support-5.3.18.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-beans-5.3.18.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-context-5.3.18.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-data-redis-2.5.10.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-data-keyvalue-2.5.10.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-data-commons-2.5.10.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-tx-5.3.18.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-oxm-5.3.18.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/spring-aop-5.3.18.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-INF/lib/lettuce-core-6.1.8.RELEASE.jar!/, jar:file:/home/app/dp-craft-process.jar!/BOOT-I
03-11
<think>好的,我现在要解决用户的问题,他在BOOT-INF/lib目录下没有找到相关的jar。首先,我需要回顾之前的对话,确认之前的建议是什么。之前用户遇到了ClassNotFoundException,尤其是找不到SpringApplication类,我建议检查打方式和启动脚本的路径设置。现在用户进一步说明BOOT-INF/lib目录下没有相关jar,这说明打过程中依赖项没有被正确含进去。 接下来,我需要分析可能的原因。用户使用Spring Boot的话,通常是通过spring-boot-maven-plugin来打,生成的可执行jar应该含所有依赖在BOOT-INF/lib里。如果这个目录下没有相关的jar,那说明打配置有问题。可能的情况括:插件未正确配置、打命令错误、或者项目结构有问题。 然后,我需要考虑如何引导用户解决这个问题。首先应该检查pom.xml文件中的插件配置,确认是否使用了spring-boot-maven-plugin,并且配置是否正确。然后,用户可能需要重新运行打命令,比如mvn clean package,并检查构建日志是否有错误。另外,用户可能错误地打成了普通的jar而不是fat jar,这时候需要确认打命令和插件配置是否正确。 同时,用户提到在之前的解决方案中提到了-Dloader.path的设置,可能用户试图通过外部依赖来运行,但如果没有正确配置,还是需要确保jar本身含依赖。这时候需要建议用户优先修复打问题,而不是依赖外部路径,因为后者可能引入更多复杂的问题,比如路径错误或版本冲突。 另外,用户可能对Maven或Gradle的构建过程不太熟悉,可能需要给出具体的配置示例,比如如何在pom.xml中添加插件配置,或者如何执行打命令。同时,需要提醒用户在打后检查生成的jar文件结构,确认BOOT-INF/lib是否存在,并含所需的spring boot依赖。 还有可能用户的项目是多模块项目,导致依赖没有被正确打进去,这时候需要检查父pom的配置,确保子模块正确继承了插件配置。或者用户可能手动排除了某些依赖,导致它们没有被含进去,需要检查是否有exclude配置。 此外,用户可能使用了不正确的打方式,比如没有使用repackage目标,导致生成的jar含依赖。这时候需要明确说明正确的插件配置和打命令。同时,可能需要建议用户清理本地Maven仓库中的旧依赖,避免缓存导致的问题。 最后,总结解决方案,分步骤指导用户检查配置、重新打、验证jar结构,并给出具体的命令和示例,确保用户能够一步步操作。同时,强调优先使用Spring Boot默认的打方式,避免外部路径配置带来的问题,尤其是在打不完整的情况下,外部路径可能无法正确加载所有依赖。</think>$\boxed{问题定位}$ 当`BOOT-INF/lib`目录缺少依赖JAR时,表明**Spring Boot的打插件未能正确将依赖库打到可执行JAR中**。这是典型的"thin jar"(非可执行jar)问题,导致运行时无法加载Spring Boot核心类。 --- ### $\boxed{根本原因}$ $$问题核心 = 打配置错误 + 依赖未嵌入JAR$$ 1. **Maven/Gradle插件未正确配置** - 未使用`spring-boot-maven-plugin`(或Gradle的`bootJar`任务) 2. **打命令错误** - 执行了`mvn package`但未触发Spring Boot的`repackage`目标 3. **依赖作用域冲突** - 可能误将依赖标记为`provided`或`test` 4. **多模块项目配置问题** - 父POM未正确传递插件配置到子模块 --- ### $\boxed{解决方案}$ #### 步骤1:检查Maven插件配置 确保`pom.xml`含以下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> <!-- 关键!生成可执行fat jar --> </goals> </execution> </executions> </plugin> </plugins> </build> ``` #### 步骤2:执行正确打命令 ```bash # 清理并重新打(必须含repackage过程) mvn clean package -DskipTests ``` #### 步骤3:验证JAR内容 ```bash # 查看JAR结构(应BOOT-INF/libjar tvf target/lcm-metadata-shell-*.jar | grep BOOT-INF/lib ``` #### 步骤4:检查依赖作用域 确保所有Spring Boot依赖的`scope`未设置为`provided`: ```xml <!-- 错误示例(会导致依赖不打JAR--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <scope>provided</scope> </dependency> ``` --- ### $\boxed{操作示例}$ 假设项目结构为: ``` my-project/ ├── pom.xml └── src/ └── main/ └── java/ ``` **正确打流程**: ```bash # 1. 清理旧构建 mvn clean # 2. 打(观察控制台输出是否含repackage) mvn package -DskipTests # 3. 检查生成文件 ls -l target/*.jar # 应有2个jar: # - lcm-metadata-shell-1.0.0.jar.original(原始jar,不含依赖) # - lcm-metadata-shell-1.0.0.jar(可执行fat jar) ``` --- ### $\boxed{特殊情况处理}$ **若使用Gradle**: ```groovy plugins { id 'org.springframework.boot' version '3.1.5' // 必须含此插件 id 'io.spring.dependency-management' version '1.1.3' } // 确保执行bootJar任务而非普通jar tasks.named('jar') { enabled = false // 禁用普通jar生成 } ``` --- ### $\boxed{验证方法}$ 1. **解压JAR验证结构**: ```bash unzip -l lcm-metadata-shell-*.jar | grep SpringApplication.class # 应输出类似: # BOOT-INF/classes/com/yourpackage/ShellApplication.class # BOOT-INF/lib/spring-boot-3.1.5.jar ``` 2. **直接运行测试**: ```bash java -jar lcm-metadata-shell-*.jar # 成功启动则说明依赖已正确打 ``` --- ### $\boxed{注意事项}$ 1. **避免手动管理依赖** Spring Boot的fat jar机制应自动含所有传递依赖,无需手动指定`loader.path` 2. **中文路径问题** 如果路径含中文(如之前的`-Dloader.path=杰克`),建议改为全英文路径 3. **版本一致性** 检查Spring Boot父POM版本与依赖版本是否匹配: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.5</version> <!-- 必须与子依赖一致 --> </parent> ``` --- ### $\boxed{总结}$ | 问题现象 | 解决方案 | 验证指标 | |---------|---------|---------| | `BOOT-INF/lib`为空 | 1. 检查插件配置<br>2. 使用`mvn clean package`重新打 | 解压JAR可见依赖库 | | 启动时`ClassNotFoundException` | 确保生成的是带`BOOT-INF`结构的fat jar | `java -jar`直接运行成功 | 建议优先使用Spring Boot默认打方式,仅在特殊场景下(如依赖分离部署)才需要配置`-Dloader.path`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值