Quarkus构建Uber-Jar时重命名文件报错求助
Quarkus Uber-Jar构建失败:文件被占用问题处理
问题详情
构建Quarkus Uber-Jar时触发如下错误:
Failed to build quarkus application: java.nio.file.FileSystemException: C:\parent\module\target\foobartest-1.0.0-SNAPSHOT.jar -> C:\parent\module\target\foobartest-1.0.0-SNAPSHOT.jar.original: Cannot access file as it is used by another process
(注:该错误由瑞典语翻译而来)
运行环境
- Quarkus 3.19.3
- Java 21
- Windows系统下的Git Bash
- Maven
构建后target目录已生成文件:
foobartest-1.0.0-SNAPSHOT.jarfoobartest-1.0.0-SNAPSHOT-runner.jar
Uber-Jar看似已成功生成,但存在两个疑问:
- 构建过程为何要重命名
foobartest-1.0.0-SNAPSHOT.jar为.original后缀的文件? - 报错提示的文件被占用是否由构建进程自身导致?
已尝试重启Shell和电脑,确认无其他外部进程占用该文件。
临时解决方法
添加已废弃的参数skipOriginalJarRename后,构建恢复正常。修改后的POM.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>se.foo</groupId> <artifactId>foobar</artifactId> <version>1.0.0-SNAPSHOT</version> <properties> <compiler-plugin.version>3.14.0</compiler-plugin.version> <maven.compiler.release>17</maven.compiler.release> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id> <quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id> <quarkus.platform.version>3.19.3</quarkus.platform.version> <quarkus-plugin.version>3.19.3</quarkus.plugin.version> <skipITs>true</skipITs> <surefire-plugin.version>3.5.2</surefire-plugin.version> <!-- 添加废弃参数跳过原Jar重命名 --> <quarkus.package.skipOriginalJarRename>true</quarkus.package.skipOriginalJarRename> </properties> <dependencyManagement> <dependencies> ... </dependencies> </dependencyManagement> <dependencies> ... </dependencies> <build> <plugins> <plugin> <groupId>${quarkus.platform.group-id}</groupId> <artifactId>quarkus-maven-plugin</artifactId> <version>${quarkus.platform.version}</version> <extensions>true</extensions> <executions> <execution> <goals> <goal>build</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <profiles> <profile> ... </profile> </profiles> </project>
补充说明
- Quarkus重命名原Jar为
.original是为了区分标准Jar和Uber-Jar:foobartest-1.0.0-SNAPSHOT.jar.original是Maven默认生成的标准Jar,最终的Uber-Jar会覆盖原foobartest-1.0.0-SNAPSHOT.jar文件。 - 文件占用错误大概率是Windows文件锁机制导致:构建进程生成标准Jar后,可能未及时释放文件句柄,导致后续重命名操作失败。
内容的提问来源于stack exchange,提问作者user1578293
相关产品推荐
相关产品推荐

