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


76

我正在尝试修改一些旧版代码,而后得到以下错误:

访问限制:由于必需的库.. \ jre \ lib \ rt.jar的限制,无法访问标头类型的方法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类都不包含上述类的不同/旧版本。

任何人都可以告诉我该错误的全部原因以及如何解决此问题?

感谢您的事先帮助,

奥利


Answers:


129

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

就像Justin在回答中所说的那样,更改编译器设置会隐藏警告。一种更细粒度的方法是修改您的构建路径,以明确允许访问有问题的软件包:

  1. 打开“ Java构建路径”项目属性窗口的“库”选项卡。
  2. 展开“ JRE系统库”条目。
  3. 选择“访问规则”,然后单击“编辑”按钮。
  4. 在出现的对话框中单击添加按钮。
  5. 对于新的访问规则,将分辨率设置为Accessible,将模式设置为"com/sun/xml/internal/**"

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


1
嗯,奇怪的是对我不起作用,但是那是在RAD 8中而不是Eclipse ...当然,下面的一个确实可以工作,莫名其妙地(只是添加/删除JRE)
bcmoney 2013年

2
+1用于添加特定的访问规则-而不是禁用所有警告。你摇滚!
rjha94

我是另一个满意的客户。这次真是万分感谢!
TonyK,2014年

是否可以保存此设置?
拉菲·

1
@Hervian这就是警告的重点-这些类随时可能更改。如果有可能,应避免使用这些内部类,而建议使用公共API。就是说,其中许多都是OpenJDK的一部分,并且多年来没有变化,因此...这是您的判断。
亚历克斯

79

很好的答案已经在这里提供。

请参阅以下摘要:

  1. 转到项目属性中的“构建路径”设置。
  2. 删除JRE系统库
  3. 加回去;选择“添加库”,然后选择JRE系统库。默认为我工作。

从较旧的jdk更新后为我工作。
Casey Murray

谢谢!在Eclipse Kepler上为我工作。将Jetty 9发行版中的servlet-api-3.1.jar包含到我的项目中显然引起了问题。或者也许是运行码头运行插件。哦,好了,只要它能起作用..
faizal

1
@AdityaSingh之所以有效,是因为您在不同的jar文件中有多个类。删除并重新添加JRE库将使正确的类成为第一位。如果需要基本解决方案,请确保排除具有相同类的jar文件。请到接受的回答这个问题。
Ashish Kumar

41

这不是一个真正的解决方案,但是在我看来,所建议的解决方案都是简单地告诉Eclipse这些不是错误。您可以通过以下方法来更改它:属性-> Java编译器->错误警告->已弃用和改写的API->禁止引用(访问规则),将其从错误更改为警告或忽略。


这也有效!最简单的事情似乎是按照@Abimbola的建议执行此操作或添加/删除。
bcmoney 2013年

同样为我工作,但我想知道为什么警告一开始就存在。
mister270

15

我已经通过以下步骤解决了这个问题:展开项目,右键单击“ JRE系统库”>“属性”,然后选择第三个选项“ Workspace default JRE”>“确定”。希望它也能帮助您


顺便说一句,如果您使用的是Maven而未设置,则每次执行Maven>更新时,此设置都会重置:<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>例如
ACV 2015年


5

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


1

在执行Java程序的Eclipse环境中,执行以下步骤:

  1. 在Eclipse菜单栏上方单击Project。
  2. 单击属性。
  3. 选择库,单击现有库,然后单击窗口右侧的“删除”。
  4. 重复该过程,现在单击添加库,然后选择JRE系统库,然后单击确定。

0

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

  1. 产品文件的依赖性,
  2. plugin.xml依赖项(并确保未使用导入的包对话框隐式导入它)。
  3. 运行配置插件选项卡。运行方式.->运行配置->插件选项卡。取消选中旧的插件,然后单击“添加所需的插件”。

这对我有用,但是您的里程可能会有所不同。


0

我只是将Project Facet更改为1.7,并且它起作用了。


-2

转到构建路径

删除现有的JRE并添加包含Jdk1.6的新JRE库并完成操作现在清理所有项目并再次构建

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.