构建可执行Jar时如何删除其BOOT-INF/lib目录下的指定文件
问题原因
- Ant 原生的
<delete>标签仅支持操作本地文件系统的普通文件/目录,无法直接读取、修改zip/jar这类压缩包内部的路径。 - 第一个配置能生效,是因为
${project.basedir}/target/classes/xyz.jar/并非已打包完成的压缩包,而是Spring Boot可执行Jar构建过程中生成的临时解压目录,该路径属于普通文件系统结构,因此可以直接删除内部文件。 - 第二个配置指向的
${project.basedir}/target/lib/xyz.jar是已经构建完成的压缩包,系统不存在xyz.jar/abc.whl这类实体文件路径,因此删除操作不生效。
正确实现方案
方案1(推荐):在打包压缩前执行删除
调整maven-antrun-plugin的执行阶段为prepare-package(该阶段在最终Jar包压缩生成前执行),直接对Spring Boot生成的临时展开目录执行删除,后续打包会自动把删除后的结构压入最终Jar包,配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>prepare-package</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <!-- 直接操作临时展开目录内的文件,按实际需要调整路径 --> <delete file="${project.build.directory}/classes/BOOT-INF/lib/abc.whl" /> </tasks> </configuration> </execution> </executions> </plugin>
方案2:操作已打包完成的Jar包
如果必须修改已生成的Jar包,需要先解压、删除目标文件后重新打包,配置示例:
<tasks> <!-- 1. 解压目标Jar到临时目录 --> <unzip src="${project.basedir}/target/lib/xyz.jar" dest="${project.build.directory}/temp-jar" /> <!-- 2. 删除临时目录内的指定文件 --> <delete file="${project.build.directory}/temp-jar/BOOT-INF/lib/abc.whl" /> <!-- 3. 重新打包为Jar --> <zip destfile="${project.basedir}/target/lib/xyz.jar" basedir="${project.build.directory}/temp-jar" /> <!-- 4. 清理临时目录 --> <delete dir="${project.build.directory}/temp-jar" /> </tasks>
内容的提问来源于stack exchange,提问作者Jijo Antony
相关产品推荐
相关产品推荐

