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

Gradle jlink插件createMergedModule报错:服务实现无默认构造方法

解决jlink插件创建镜像时的服务实现构造方法错误问题

看起来你遇到的核心问题是org.beryx.jlink插件自动生成的合并模块module-info.java中,包含了不符合JPMS规范的provides语句——Apache XMLBeans的两个服务实现类没有公共无参构造方法,导致编译失败。下面是几个可行的解决思路:


1. 排除插件自动生成的问题服务声明

jlink插件的mergedModule配置允许你排除特定的服务声明,避开那些不符合规范的条目。修改你的build.gradle中的jlink配置块:

jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'myapp'
    }
    mergedModule {
        // 排除有问题的服务提供声明
        excludeServices 'org.apache.xmlbeans.impl.store.PathDelegate.SelectPathInterface'
        excludeServices 'org.apache.xmlbeans.impl.store.QueryDelegate.QueryInterface'
    }
}

这样插件就不会在自动生成的module-info.java中添加这两条错误的provides语句,从而绕过编译错误。


2. 升级XMLBeans依赖版本

你当前使用的poi-ooxml:4.1.0依赖的XMLBeans版本可能没有适配JPMS规范。尝试强制升级XMLBeans到支持JPMS的版本,比如3.1.0或更高:

dependencies {
    // 其他依赖保持不变
    compile 'org.apache.commons:commons-csv:1.6'
    compile 'org.apache.poi:poi-ooxml:4.1.0'
    // 强制指定XMLBeans版本,覆盖POI带来的旧版本
    compile 'org.apache.xmlbeans:xmlbeans:3.1.0'
    // ... 其余依赖
}

新版本的XMLBeans可能已经修复了服务实现类的构造方法问题,或者添加了JPMS兼容的模块声明,这样插件自动生成的provides语句就能符合规范。


3. 手动编写合并模块的module-info.java

如果上面的方法都不生效,你可以完全接管合并模块的module-info.java编写:

  1. 先运行一次失败的构建,找到自动生成的module-info.java文件(路径是build/jlinkbase/tmpjars/myapp.merged.module/module-info.java)
  2. 复制这个文件到项目的某个目录,比如src/main/resources/custom-module-info.java
  3. 删除其中那两条错误的provides语句,或者根据需要调整其他内容
  4. 在build.gradle的jlink配置中指定使用这个自定义文件:
jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'myapp'
    }
    mergedModule {
        moduleInfoFile = file('src/main/resources/custom-module-info.java')
    }
}

这样插件就会使用你编写的module-info.java来生成合并模块,完全控制服务声明的内容。


关于你看到的「无法推导uses子句」的警告,这个通常不会导致构建失败,是插件在分析服务加载器调用时无法自动生成对应的uses语句。如果需要消除警告,可以在自定义的module-info.java中手动添加对应的uses语句,比如根据警告提示的服务接口添加:

uses com.fasterxml.jackson.databind.ser.std.StdSerializer;
// 或者根据实际服务接口添加对应的uses声明

不过如果不影响功能,这个警告可以暂时忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:17:03