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

Java17升级后Groovy脚本访问java.io.File私有构造方法报错求助

解决方案

核心原因

Java 17的模块系统强化了封装机制,你的Groovy脚本通过反射访问java.io.File的私有构造器,但运行该脚本的JVM进程没有添加--add-opens参数来开放模块访问权限——你之前只给maven-surefire-plugin(测试阶段)加了参数,但执行Ant脚本的是另一个JVM进程(比如maven-antrun-plugin),所以参数没生效。

方案1:给Ant脚本的运行JVM添加参数

如果你的Ant脚本是通过maven-antrun-plugin触发的,直接在插件配置里添加JVM参数:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <phase><!-- 你的脚本执行阶段,比如compile --></phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <!-- 给Ant运行的JVM添加参数 -->
        <jvmargs>
          <jvmarg>--add-opens=java.base/java.io=ALL-UNNAMED</jvmarg>
        </jvmargs>
        <tasks>
          <!-- 你的原始Ant脚本内容 -->
        </tasks>
      </configuration>
    </execution>
  </executions>
</plugin>

如果Ant脚本里是通过<groovy>任务执行的代码,也可以直接给该任务单独指定参数(需开启fork):

<groovy fork="true">
  <jvmarg value="--add-opens=java.base/java.io=ALL-UNNAMED"/>
  // 你的Groovy脚本代码
</groovy>

方案2:移除反射调用(推荐)

java.io.File的私有构造器File(String, File)其实可以用公开构造器替代,完全不需要反射。把Groovy里的反射代码:

// 原始反射代码(有问题)
def privateConstructor = File.getDeclaredConstructor(String, File)
privateConstructor.setAccessible(true)
def file = privateConstructor.newInstance(childPath, parentFile)

替换为公开构造器调用:

// 替换后的代码
def file = new File(parentFile, childPath)

或者用更现代的NIO API:

def file = Paths.get(parentFile.toPath(), childPath).toFile()

这种方式从根源上避免了模块权限问题,也更符合Java规范,不需要依赖任何JVM参数。

额外检查

确保你添加参数的插件对应正确的执行阶段:如果错误出现在编译阶段,就给maven-antrun-plugin加参数;如果出现在测试阶段,再结合maven-surefire-plugin的配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:57:01