You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven Assembly插件无法复制Java Runtime Image问题求助

解决maven-assembly-plugin忽略JRT镜像目录的问题

我之前确实遇到过类似的情况——当用maven-assembly-plugin处理jlink生成的JRT镜像目录时,插件会莫名其妙跳过整个目录,没有任何错误提示,换成普通文件就正常。结合你的场景,分享几个解决方案和替代插件:

针对maven-assembly-plugin的修复尝试

1. 强制包含所有文件并开启符号链接跟随

JRT镜像目录里通常包含符号链接(Windows下可能是硬链接),而assembly插件默认可能不会处理这些链接,也可能默认的文件匹配规则漏掉了某些特殊结构的文件。修改你的windows.xml中的fileSet配置,明确指定包含所有文件并开启符号链接跟随:

<fileSet>
  <directory>target/runtime-images/win64</directory>
  <outputDirectory>app</outputDirectory>
  <followSymlinks>true</followSymlinks>
  <include>**/*</include>
</fileSet>

2. 查看更详细的调试日志

执行构建时加上-X参数(mvn package -X),这样能看到插件扫描文件时的每一步细节,比如是否有某个文件/目录被过滤规则排除,或者有隐藏的权限/属性问题导致跳过。

替代插件推荐

如果assembly插件始终无法正常处理JRT镜像,以下几个插件可以替代:

1. maven-antrun-plugin

Ant的文件复制任务对特殊文件和目录的兼容性更好,能灵活处理链接、隐藏文件等。在pom.xml中添加如下配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-jrt-image</id>
      <phase>package</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <copy todir="dist/win64/app" overwrite="true">
            <fileset dir="target/runtime-images/win64">
              <include name="**/*"/>
              <followsymlinks>true</followsymlinks>
            </fileset>
          </copy>
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

2. maven-resources-plugin

虽然它主要用于处理项目资源,但也能可靠地复制整个目录结构,适合你的场景:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-jrt-image</id>
      <phase>package</phase>
      <goals>
        <goal>copy-resources</goal>
      </goals>
      <configuration>
        <outputDirectory>dist/win64/app</outputDirectory>
        <resources>
          <resource>
            <directory>target/runtime-images/win64</directory>
            <includes>
              <include>**/*</include>
            </includes>
            <filtering>false</filtering>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>

如果你的JRT镜像是通过maven-jlink-plugin生成的,可以直接配置插件将镜像输出到dist/win64/app目录,省去后续复制步骤,这样能避免中间环节的文件处理问题。

补充说明

社区里确实有不少用户反馈maven-assembly-plugin对jlink生成的模块化镜像支持不佳,核心原因是JRT镜像的文件结构包含特殊的模块化JAR、链接文件等,assembly插件的文件扫描逻辑没有完全适配这类场景。优先尝试调整assembly的配置,不行再换替代插件,通常都能解决问题。

内容的提问来源于stack exchange,提问作者Evan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:31:18