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配套设置
项目SDK与语言级别
- 打开
File → Project Structure - 在
Project标签页:- SDK选择Java 17
- Language level选择8 - Lambdas, type annotations etc.
- 切换到
Modules标签页,确保每个模块的Language level也设置为8。
- 打开
IDE编译委托(关键)
- 打开
Settings → Build, Execution, Deployment → Build Tools → Maven → Runner - 勾选
Delegate IDE build/run actions to Maven,让IDE完全使用Maven的编译配置,避免IDE自己编译时出现参数不兼容问题。
- 打开
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
相关产品推荐
相关产品推荐

