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

Java17编译生成Java8兼容Jar包的Maven配置问题求助

解决Java 17编译生成Java 8兼容Jar并处理sun.security.action依赖问题

一、修正Maven编译插件配置

你的核心问题在于:--add-exports是Java 9+的编译选项,和旧版source/target=1.8参数冲突;同时旧版本的maven-compiler-plugin对Java 17的支持不完善。按以下配置修改:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version> <!-- 升级到支持Java 17的版本 -->
    <configuration>
        <release>8</release> <!-- 替代source/target,确保字节码完全兼容Java 8 -->
        <compilerArgs>
            <arg>--add-exports</arg>
            <arg>java.base/sun.security.action=ALL-UNNAMED</arg>
        </compilerArgs>
        <fork>true</fork> <!-- 必须开启,让编译器独立进程接收参数 -->
    </configuration>
</plugin>

说明:

  • release参数是Java 9+编译器引入的,比source/target更可靠,能同时保证语法特性和API的兼容性。
  • 移除了重复的--add-exports参数,导出整个sun.security.action包即可,无需单独指定类。
  • fork=true确保编译参数能传递给独立的Java 17编译器进程,避免参数被忽略。

二、IntelliJ IDEA配套设置

  1. 项目SDK与语言级别

    • 打开File → Project Structure
    • 在Project标签页:
      • SDK选择Java 17
      • Language level选择8 - Lambdas, type annotations etc.
    • 切换到Modules标签页,确保每个模块的Language level也设置为8。
  2. IDE编译委托(关键)

    • 打开Settings → Build, Execution, Deployment → Build Tools → Maven → Runner
    • 勾选Delegate IDE build/run actions to Maven,让IDE完全使用Maven的编译配置,避免IDE自己编译时出现参数不兼容问题。
  3. IDE编译参数补充(可选)
    如果IDE仍提示找不到sun.security.action包,可手动添加编译参数:

    • 打开Settings → Build, Execution, Deployment → Compiler → Java Compiler
    • 在Additional command line parameters中输入:--add-exports java.base/sun.security.action=ALL-UNNAMED

三、推荐方案:替换sun内部API

sun.security.action.GetPropertyAction是Oracle不推荐使用的内部API,未来Java版本可能移除。建议用Java 8标准API替代:

原代码:

import sun.security.action.GetPropertyAction;
import java.security.AccessController;

// ...
String propertyValue = AccessController.doPrivileged(new GetPropertyAction("your.property.name"));

替换为:

import java.security.AccessController;
import java.security.PrivilegedAction;

// ...
String propertyValue = AccessController.doPrivileged((PrivilegedAction<String>) () -> System.getProperty("your.property.name"));

替换后无需配置--add-exports参数,代码兼容性和稳定性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:13:39