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

Maven项目中使用sun.misc消除Access Restriction警告的方案

嘿,这个问题我太熟了——用sun.misc.Signal处理系统信号确实是调试诊断的好办法,但Eclipse和Maven的配合总是会搞出这种小麻烦。下面给你一步步解决:

一、通过修改pom.xml消除Access Restriction警告

手动改.classpath被Maven刷新覆盖是必然的,因为Maven会根据pom配置重新生成项目文件。你需要在pom里配置插件,让Maven自动帮你设置好访问规则:

针对Java 8及以下版本

用maven-eclipse-plugin直接配置访问规则,允许Eclipse访问sun.misc包:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <!-- 允许访问sun.misc下的所有类,消除Eclipse的访问限制警告 -->
                <accessRules>
                    <accessRule>
                        <path>sun/misc/**</path>
                        <access>accessible</access>
                    </accessRule>
                </accessRules>
            </configuration>
        </plugin>
    </plugins>
</build>

配置完后,执行mvn eclipse:eclipse刷新项目,警告就会消失,而且后续Maven刷新也不会再恢复。

针对Java 9及以上版本

从Java 9开始,sun.misc被移到了未公开的jdk.unsupported模块里,除了Eclipse的访问规则,还得让编译器允许访问这个模块:

<build>
    <plugins>
        <!-- 让编译器允许访问jdk.unsupported模块 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <release>11</release> <!-- 替换成你实际用的Java版本 -->
                <compilerArgs>
                    <arg>--add-modules</arg>
                    <arg>jdk.unsupported</arg>
                </compilerArgs>
            </configuration>
        </plugin>
        <!-- 同时配置Eclipse的访问规则 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <accessRules>
                    <accessRule>
                        <path>sun/misc/**</path>
                        <access>accessible</access>
                    </accessRule>
                </accessRules>
            </configuration>
        </plugin>
    </plugins>
</build>
二、两种JRE系统库的核心差异

你提到的“两种JRE系统库”,通常对应两种常见场景的区别:

1. 传统JRE(Java 8及以下)VS 模块化JRE(Java 9+)

  • 结构差异:
    • 传统JRE:以rt.jar、tools.jar这类大JAR包存在,公共API和内部API(比如sun.misc)混在一起,没有严格的隔离。
    • 模块化JRE:采用JPMS(Java平台模块系统),类被拆分到多个模块中,sun.misc属于未公开的jdk.unsupported模块,默认不允许应用访问,必须显式声明依赖。
  • 访问限制差异:
    • 传统JRE:Eclipse的警告只是提示你用了非公共API,未来可能被移除,但可以通过配置忽略。
    • 模块化JRE:从语言层面限制内部模块访问,不配置--add-modules的话,编译会直接报错,而不是仅仅警告。

2. Eclipse中“Installed JRE”VS “Execution Environment”

  • Installed JRE:直接指向本地安装的JDK/JRE目录,Eclipse会读取该JRE的实际文件结构,对于Java 8,会包含rt.jar里的所有类(包括内部API),默认不会严格限制访问。
  • Execution Environment:是Eclipse定义的标准化JRE环境(比如JavaSE-1.8),严格遵循Java官方API规范,默认屏蔽内部API,所以更容易触发Access Restriction警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:19:41