由于对所需库rt.jar的限制而导致对类的访问限制?


824

我试图在不重新创建存根的情况下编译由IBM的WSDL2JavaJava5上创建的Java 1.4代码,并在Eclipse中看到此错误。 我假设生成的存根应该只要运行时可用就可以编译。
jars

Access restriction: The type QName is not accessible due to restriction on required library C:\Program Files\Java\jdk1.5.0_16\jre\lib\rt.jar

完整的班级名称是 javax.xml.namespace.QName

这到底是怎么回事?这是我要用香肠重构猪的情况吗?我最好重新创建存根吗?


1
我不明白,为什么不只是在其他地方编译它并在目标(因此我想)1.4环境中运行它呢?
蒂姆·布斯(TimBüthe)2009年

最终的目标环境是jdk5上的jboss4.2。
萨尔

2
关于“受保护”状态:在StackOverflow中,什么都没有说“谢谢”或“我也”;)
OscarRyz 2010年

6
请参阅最投票最多的答案。...忽略此页面其余部分的96%。搜索: “内尔斯贝克曼”,2月1日在'10 4:09

1
对我有用的是将JRE系统库从执行环境(或工作区默认值)编辑/更改Alternate JRE(我选择了相同的Java版本)。您还必须确保(1)“ 订单和导出”选项卡中的订单正确,(2)Java编译器设置(与所选Java版本相同)中的正确合规性级别。
ADTC 2014年

Answers:


1884

还有另一个解决方案也可以。

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

之所以可行,是因为您在不同的jar文件中有多个类。删除并重新添加JRE库将使正确的类成为第一位。如果需要基本解决方案,请确保排除具有相同类的jar文件。

对我来说,我有:javax.xml.soap.SOAPPart在三个不同的罐子:axis-saaj-1.4.jarsaaj-api-1.3.jarrt.jar


1
是Eclipse错误还是我们无意中解决了该限制(违反许可条款)?如果是Eclipse错误,那么是否存在错误?
docwhat 2011年

@Doctor我从来没有将它用于任何特别重要的代码,所以我没有进一步调查...如果您发现任何问题,请告知我们。
Nels Beckman

3
@ URL87如果右键单击项目文件夹,请转到“构建路径...”,“配置构建路径”,“库”(选项卡),您应该看到“添加库”作为右侧的按钮之一。 。这对我也很有吸引力,很好的回答
Alexei Blue

8
在最新版本的Eclipse下,更好的解决方案不是删除JRE系统库,而是转到“订购和导出”选项卡,然后将JRE系统库移到底部(实际上是删除和添加它的作用,但是您没有这样做)无需删除和添加即可)。
user1676075 2013年

1
这是2018年,Eclipse版本是5.0。此错误/问题仍然存在。非常感谢@NelsBeckman。自发布3/4年后,您的回答对我有所帮助。
Aravamudhan

120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html最适合我。

在Windows上: Windows->首选项-> Java->编译器->错误/警告->不推荐使用和受限制的API->禁止引用(访问规则):->更改为警告

在Mac OS X / Linux上: Eclipse->首选项-> Java->编译器->错误/警告->不推荐使用和受限制的API->禁止引用(访问规则):->更改为警告


62
这可能有效,但这不是适当的解决方案。您需要了解为什么首先存在访问限制。它还将隐藏所有将来可能发生的情况,这可能更重要!
阿德里安·穆阿特

1
@AdrianMouat几乎无关紧要。如果我希望它消失,我希望它消失。但可以肯定的是-不应该针对非公共API进行编码,不。
stolsvik '12

3
@stolsvik-您迷失了我;您是说问题存在的原因无关紧要吗?
Adrian Mouat

1
我在一个方法上有这个问题。我想象使用替代的JDK(例如OpenJDK是更好的选择)。那说一回,它“可能很酷”。不在生产代码中。不是为了持续的设计工作。我无法告诉您,有多少人日因为这种cr骇客而迷失了。

5
@AdrianMouat-很有道理。我不愿意在核反应堆中做类似的事情-控制室中的热量过多?因此,请禁用所有警告。第二天成为头条新闻。:P
大卫·布莱恩

67

我遇到了同样的问题。我在以下网站找到了答案:http : //www.17ext.com
首先,删除JRE系统库。然后,再次导入JRE系统库。

我不知道为什么。但是它解决了我的问题,希望它可以为您提供帮助。


10
嗯,显然您在几个月前以与我相同的方式回答了这个问题。不知道为什么我当时看不到你的答案……
Nels Beckman

34

我的猜测是,您试图用您库中的一个替换Java 5附带的标准类。

根据许可协议的条款,这是不允许的,但是AFAIK直到Java 5才强制实施。

我以前用QName看到过,我通过从我的jar中删除类来“修复”了它。

编辑 http://www.manpagez.com/man/1/java/关于“ -Xbootclasspath:”选项的注释

“不应部署使用此选项来覆盖rt.jar中的类的应用程序,因为这样做会违反Java 2 Runtime Environment二进制代码许可证。”

http://www.idt.mdh.se/rc/sumo/aJile/Uppackat/jre/LICENSE

“ Java技术限制。您不得通过在JPI中创建其他类来修改Java平台接口(“ JPI”,标识为“ java”包或“ java”包的任何子包中包含的类)。在JPI中添加或修改JPI中的类。如果您创建其他类和相关的API,则(i)扩展Java平台的功能,并且(ii)向第三方软件开发人员公开为了开发调用此类附加API的附加软件,您必须立即广泛发布此类API的准确规范,供所有开发人员免费使用。您不得创建或授权被许可人创建附加类,接口,或以任何方式标识为“ java”,“ javax”,“ sun”或Sun在任何命名约定名称中指定的类似约定的子包。”


2
而已。路径中的其中一个jar包含QName类。找 。-name“ * .jar” -print -exec解压缩-t {} \; | grep“ QName”找到了它。
萨尔

1
您能否提供有关不允许替换Java附带的类的参考?我在许可协议中发现的所有限制都是与分发Java本身(而不是Java程序)相关的限制,但是我花了很长时间才找到。
阿德里安·穆阿特

25

我也一直遇到这个错误,但是我的项目是使用Maven和tycho编译器(这是一组OSGi插件)在命令行上构建的。经过大量筛选,但还是在Eclipse中而不是在命令行中解决了同样的问题,之后我在Tycho开发人员论坛上找到了一条消息,回答了我的问题,它使用配置pom.xml忽略了有关访问限制的编译器警告:

<plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>tycho-compiler-plugin</artifactId>
    <version>${tycho.version}</version>
    <configuration>
        <compilerArgument>-warn:+discouraged,forbidden</compilerArgument>
    </configuration>
</plugin>

Tycho FAQ中可以找到更多信息。这花了我AGES的时间来解决,因此我想我可以通过发布此答案来帮助其他尝试从命令行修复这些访问限制错误的人。


13
  • 转到项目属性中的“构建路径”设置。 Windows -> Preferences -> Java Compiler
  • 删除JRE系统库
  • 添加另一个具有“完全匹配”的JRE
  • 清理并再次构建您的项目。它为我工作。

13

我也有这个问题。显然,我在构建路径中将JRE设置为1.5而不是1.6。


1
这里同样的问题。就我而言,使用Maven(如果未指定)默认为1.5。
Greg Haskins

请记住将其放入您的POM中,以便在更新时不会变回原样。<properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </ properties>
Philip Rego,

8

除了Nels Beckman的解决方案之外,我还有以下提示:

在“ 配置构建路径”下,我必须重新排列“ 订单和导出”下的条目顺序

另外,作为Eclipse PDE开发人员,我需要重新排列依赖关系的顺序MANIFEST.MF,将有问题的程序包添加到列表的第一位。

通过使用这些拨盘,以及在两者之间运行Project> Clean,我能够解决这些警告。


8

对我来说,我如何解决它:

  • 转到当前项目的构建路径

在图书馆下

  • 选择“ JRE系统库 [jdk1.8xxx]”
  • 点击编辑
  • 并选择“工作区默认JRE(jdk1.8xx)” 备用JRE
  • 点击完成
  • 点击确定

在此处输入图片说明

注意:确保在Eclipse / Preferences(不是项目)/ Java / Installed JRE中,确保jdk指向JDK文件夹而不是JRE C:\ Program Files \ Java \ jdk1.8.0_74

在此处输入图片说明


我的已经设置为1.7 ... 79,所以我感到恐慌。但是我只是再次选择它,单击“应用”,错误消失了。ew。
Marvo '18年

哇。这也对这里有所帮助-从“执行环境”更改为“备用JRE”。如果有人对此有任何逻辑解释..(这里发生在将项目龙头Java从1.5(在.settings配置文件中为5.0)更改为1.8之后。在全局首选项中从错误更改为警告(请参见其他答案)没有help:仍然是错误。它是关于从包com.sun.image.codec。*中使用的旧的Sun类的信息)
hyphan

6

抱歉,更新旧的POST。我收到了报告的问题,并按以下说明解决了问题。

假设您使用的是Eclipse + m2e maven插件,如果遇到此访问限制错误,请右键单击出现错误的项目/模块->属性->构建路径->库->替换JDK / JRE到在Eclipse工作区中使用的JRE。

我按照上述步骤操作,问题已解决。


足够公平,但是您基本上已经复制了内尔斯·贝克曼(Nels Beckman)接受的答案的措辞。
史蒂芬·沃尔夫

5

如果您确定自己应该能够访问给定的类,那么这可能意味着您向项目中添加了几个jar,其中包含名称(或路径)相同但内容不同的类,并且它们相互掩盖了(通常是旧的自定义build jar包含第3方库的内置旧版本)。

例如,当您添加一个实现的jar时:

a.b.c.d1
a.b.c.d2

而且还有仅实现的较旧版本:

a.b.c.d1
(d2 is missing altogether or has restricted access)

一切在代码编辑器中都可以正常工作,但是如果“旧”库使新的库黯然失色,则编译过程将失败-d2突然发现“丢失或无法访问”,即使该库在那里。

解决方案是检查编译时库的顺序,并确保具有正确实现的库优先。


4

转到项目属性中的Java Build Path。删除现有的JRE系统库,然后再次添加,即“添加库”->“ JRE库”-选择“ jre->”完成。最后,选择订单和导出选项卡,选择JRE Lib并移至顶部。而已。


3

只需更改项目的构建路径库的顺序即可。右键单击项目>构建路径>配置构建路径>选择顺序并导出(Tab)>更改条目的顺序。我希望将“ JRE系统库”移到底部将可以工作。它对我来说是如此。简单容易.... !!!


3

就我而言,构建路径JRE与执行环境上已安装的JRE之间不匹配。我进入项目>属性> Java编译器。底部有一个警告消息。

我单击了“安装的JRE”,“执行环境”,“ Java构建路径”链接,并将JDK版本更改为1.7,警告消失了。


0

解决方案是通过构建路径添加正确的JRE系统,但是您的日食仍然可能有错误。要解决这个问题,请转到Java Build path-> Order and Export,然后将您的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.