访问限制:由于对所需库..\jre\lib\rt.jar的限制,无法访问。

76

我正在尝试修改一些以前的旧代码,并且遇到了以下类型的错误:

访问限制:由于对所需库 ..\jre\lib\rt.jar 的限制,类型 Headers 中的方法 create(JAXBRIContext,Object) 不可访问。

针对这些导入语句:

import com.sun.xml.internal.bind.api.JAXBRIContext;
import com.sun.xml.internal.ws.api.message.Header;
import com.sun.xml.internal.ws.api.message.Headers;
import com.sun.xml.internal.ws.developer.WSBindingProvider;

一直在寻找这个错误的含义以及如何解决它,但始终没有找到明确的答案。一些帖子似乎表明我已经包含了一些JAR文件,这些实现了现在作为核心Java发行版的一部分可用的类,但就我所看到的,我包含的JAR文件中没有包含上述类的不同/旧版本。

有人能告诉我这个错误是什么意思以及我该如何修复它吗?

感谢您提前的帮助,

Olli


10个回答

130

我遇到了类似的问题,我认为警告的原因是Eclipse试图阻止您使用安装在工作区JRE中但不属于公共Java API的内部 com.sun 包。

正如Justin在他的答案中所说,改变编译器设置可以隐藏这个警告。一个更加精细的方法是修改您的构建路径以明确允许访问相关的包:

  1. 打开Java Build Path项目属性窗口的Libraries选项卡。
  2. 展开JRE System Library条目。
  3. 选择“Access rules”并点击Edit按钮。
  4. 在弹出的对话框中点击Add按钮。
  5. 对于新的访问规则,将解析设置为Accessible,模式设置为"com/sun/xml/internal/**"

添加此访问规则后,您的项目应该可以在没有这些警告的情况下构建。


1
嗯,奇怪的是对我没用,但那是在RAD 8而不是Eclipse中...下面的那个当然有效,虽然原因不明(只需添加/删除JRE)。 - bcmoney
2
+1 为添加特定访问规则而不是禁用所有警告。你太棒了! - rjha94
这个设置能保存吗? - khatchad
1
@Hervian 这些警告的意义在于 - 这些类可能随时发生变化。如果可能的话,您应该避免使用这些内部类,而是使用公共API。尽管如此,其中许多类是OpenJDK的一部分,并且多年来一直没有更改,所以...这取决于您的判断。 - Alex
有没有可能以某种方式添加显式依赖项,例如在使用Maven时的pom文件中,以解决这个风险?我想不太可能 - 向rt.jar添加显式依赖项听起来很奇怪。但是,无法(安全地)访问已知存在于某些jar中的类似乎令人沮丧。 - Hervian
显示剩余3条评论

79

已经有优秀的答案在这里提供了 这里,请参考。

以下是摘要:

  1. 进入项目属性中的“Build Path”设置。
  2. 删除JRE System Library。
  3. 重新添加它:选择“添加库”,然后选择JRE系统库。默认选项适用于我。

在更新到较旧的jdk之后,对我有用。 - Casey Murray
谢谢!在Eclipse Kepler上对我有用。将Jetty 9分发中的servlet-api-3.1.jar包含到我的项目中似乎引起了问题。或者可能是run jetty run插件。不管怎样,只要它能工作就好了。 - faizal
1
@AdityaSingh 这个方法的有效性在于你的不同jar文件中有多个类。移除并重新添加JRE库将使正确的类成为第一个。如果你想要一种根本性的解决方案,请确保排除具有相同类的jar文件。请参考接受的答案此处的问题。 - Ashish Kumar

41

虽然不是真正的解决方案,但我在查找解决方法时发现建议的方法是告诉Eclipse这些不是错误。您可以通过转到属性--> Java编译器--> 错误警告--> 已弃用和受限制的API--> 禁止引用(访问规则)来进行更改,将其从错误更改为警告或忽略。


这也起作用了!最简单的方法似乎是按照@Abimbola的建议执行此操作或添加/删除。 - bcmoney
也对我有用,但我不禁想知道为什么首先会出现这个警告。 - mister270

15

我已经用以下步骤解决了这个问题:扩展你的项目,右键单击 "JRE系统库" > 属性 > 选择第三个选项 "工作区默认JRE" > 确定。希望这也能帮到你。


顺便提一下,如果你正在使用Maven并且没有设置以下内容:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>,那么每次执行Maven > Update时都会重置。 - ACV

8
在Eclipse中: 项目 -> 属性 -> Java Build Path -> 库 删除现有的JRE系统库,然后添加库 -> JRE系统库 ->下一步 -> 确定。 错误将被消除。

5

当我的插件依赖于另一个项目时,我遇到了同样的问题,该项目在其清单文件中导出了一些包。我没有改变访问规则,而是通过将所需的包添加到其Export-Package部分来解决了这个问题。这使得包合法可见。Eclipse实际上在“访问限制”错误标记上提供了此修复。


1
在执行Java程序的Eclipse环境中,按照以下步骤操作:
  1. 在Eclipse菜单栏上方点击Project。
  2. 点击属性。
  3. 选择库,点击现有库右侧的删除按钮。
  4. 重复上述过程,现在点击添加库,然后选择JRE系统库并点击确定。

0
我刚把项目的"facet"改成了1.7,然后它就正常工作了。

0

我回答这个问题是因为我有一种不同的方法来解决这个问题,与其他答案不同。当我重构我要导出的插件的名称时,我遇到了这个问题。最终我必须确保修复/更改以下内容。

  1. 产品文件的依赖关系,
  2. 插件.xml的依赖关系(并确保它不是使用导入包对话框隐式导入的)。
  3. 运行配置插件选项卡。Run As..->Run Configurations->Plug-ins tab. 取消选中旧插件,然后单击Add Required Plug-ins。

这对我有效,但你的结果可能会有所不同。


-2

前往Buildpath

移除现有的JRE并添加包含Jdk1.6的新JRE库,然后完成操作 现在清理所有项目并重新构建

我认为这样可以解决您的错误


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接