【问题标题】:Access restriction on class due to restriction on required library rt.jar?由于对所需库 rt.jar 的限制,对类的访问限制?
【发布时间】:2010-10-26 00:02:42
【问题描述】:

我正在尝试编译 IBM 的 WSDL2Java 在 Java5 上创建的 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.4 环境中运行它?
  • 最终的目标环境是jdk5上的jboss4.2。
  • 关于“受保护”状态:在 StackOverflow 中没有说“谢谢”或“我也是”作为支持;)
  • 查看投票最多的答案...忽略本页其余部分的 96%。搜索:“Nels Beckman”,2010 年 2 月 1 日 4:09
  • 对我有用的是编辑/更改 JRE 系统库从 执行环境(或工作区默认值) 到 备用 JRE(我选择了相同的 Java 版本)。您还必须确保 (1) 在 Order and Export 选项卡中的顺序正确,(2) 在 Java Compiler 中正确的合规级别i> 设置(与选择的 Java 版本相同)。

标签: java eclipse wsdl stub wsdl2java


【解决方案1】:

还有另一种可行的解决方案。

  1. 转到项目属性中的构建路径设置。
  2. 删除 JRE 系统库
  3. 添加回来;选择“添加库” 并选择JRE 系统库。默认值对我有用。

这是因为你在不同的 jar 文件中有多个类。删除和重新添加 JRE 库将使正确的类成为第一。 如果您想要一个基本的解决方案,请确保排除具有相同类的 jar 文件。

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

【讨论】:

  • 是 Eclipse 错误还是我们不小心绕过了限制(并违反了许可条款)?如果是 Eclipse 的 bug,那么是否有 bug 归档?
  • @Doctor 我从来没有将它用于任何特别重要的代码,所以我没有进一步调查......如果你发现了什么,请告诉我们。
  • @URL87 如果您右键单击项目文件夹转到“构建路径...”、“配置构建路径”、“库”(选项卡),您应该看到“添加库”为一个右边的按钮......这对我来说也很有吸引力,很好的答案
  • 在最新版本的 Eclipse 下更好的解决方案不是删除 JRE System Library,而是转到“Order and Export”选项卡并将 JRE System Library 移动到底部(这实际上是删除并添加它,但您无需删除并添加即可)。
  • 这是 2018 年,eclipse 版本是 5.0。这个错误/问题仍然存在。非常感谢@NelsBeckman。自发布以来,您的回答在 3/4 年后对我有所帮助。
【解决方案2】:

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

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

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

【讨论】:

  • 这可能有效,但不是正确的解决方案。您首先需要了解为什么存在访问限制。它还将隐藏所有未来的案例,这可能更重要!
  • @AdrianMouat 这几乎无关紧要。如果我想让它消失,我希望它消失。但可以肯定的是 - 不应该针对非公共 API 进行编码,不。
  • @stolsvik - 你失去了我;你是说问题存在的原因无关紧要吗?
  • 我在 ONE 方法上有这个问题。我想使用替代 JDK(比如 OpenJDK 是一个更好的选择)。这就是说它“可能很酷”一次。不在生产代码中。不是为了正在进行的设计工作。我无法告诉你这种 cr-hack 浪费了多少工日。
  • @AdrianMouat - 有道理。我不想在核反应堆里做这样的事情——控制室里的热量太多了?因此,禁用所有警告。第二天成为头条新闻。 :P
【解决方案3】:

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

【讨论】:

  • 嗯,显然你回答这个问题的方式和我几个月前一样。不知道为什么我当时没有看到你的答案......
【解决方案4】:

我的猜测是您正在尝试用您拥有的库中的一个替换 Java 5 附带的标准类。

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

我以前在 QName 中看到过这个问题,我通过从我拥有的 jar 中删除类来“修复”它。

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

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

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

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

【讨论】:

  • 就是这样。路径中的一个罐子中有 QName 类。找 。 -name "*.jar" -print -exec unzip -t {} \; |grep "QName" 找到了它。
  • 您能否提供一个关于不允许替换 Java 附带的类的参考?我在许可协议中发现的只是与分发 Java 本身相关的限制,而不是 Java 程序,但我并没有找很久。
【解决方案5】:

我也遇到了这个错误,但是我的项目是使用 Maven 和 tycho 编译器(它是一组 OSGi 插件)在命令行上构建的。在大量筛选有同样问题但在 Eclipse 中而不是在命令行中修复它的人之后,我发现 a message on the Tycho developer forum 回答了我的问题,使用 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 的时间来解决,所以我想我会通过发布这个答案来帮助其他人尝试从命令行修复这些访问限制错误。

【讨论】:

    【解决方案6】:
    • 转到项目属性中的构建路径设置。 Windows -&gt; Preferences -&gt; Java Compiler
    • 删除 JRE 系统库
    • 添加另一个具有“完美匹配”的 JRE
    • 再次清理并构建您的项目。它对我有用。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 这里有同样的问题。在我的情况下,使用 Maven,如果未指定,默认为 1.5。
      • 记得把它放在你的 POM 中,这样它在更新时就不会变回来。 1.81.8
      【解决方案8】:

      除了Nels Beckman's solution,我还有以下提示:

      在 Configure Build Path 下,我不得不重新排列 Order and Export 下的条目顺序。

      此外,作为一名 Eclipse PDE 开发人员,我需要重新排列我在 MANIFEST.MF 中的依赖项的顺序,将有问题的包添加到列表的首位。

      使用这些转盘,并在其间运行 Project > Clean,我能够解决这些警告。

      【讨论】:

        【解决方案9】:

        对我来说,这是我如何解决的:

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

        在库下

        • 选择“JRE 系统库 [jdk1.8xxx]”
        • 点击编辑
        • 然后选择“Workspace default JRE(jdk1.8xx)”或 Alternate JRE
        • 点击完成
        • 点击确定

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

        【讨论】:

        • 我的已经设置为 1.7...79,所以我很恐慌。但我只是再次选择它,单击应用,错误就消失了。唷。
        • 哇。这在这里也有帮助——从“执行环境”变为“替代 JRE”。如果有人对此有任何合乎逻辑的解释..(这里是在将项目水龙头Java从1.5(.settings配置文件中的5.0)更改为1.8之后发生的。在全局首选项中从错误更改为警告(请参阅其他答案)没有帮助:仍然错误。它是关于我们使用包 com.sun.image.codec.*) 中的旧 sun 类。
        【解决方案10】:

        很抱歉更新旧的 POST。我收到了报告的问题,并按如下所述解决了它。

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

        我按照上述步骤解决了问题。

        【讨论】:

        • 很公平,但是您基本上复制了 Nels Beckman 接受的答案的措辞。
        【解决方案11】:

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

        例如当你添加一个 jar 实现:

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

        还有一个旧版本只实现:

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

        在代码编辑器中一切正常,但如果“旧”库掩盖了新库,则在编译过程中会失败 - d2 突然变成“丢失或无法访问”,即使它在那里。

        解决方案是检查编译时库的顺序,并确保具有正确实现的库排在第一位。

        【讨论】:

          【解决方案12】:

          转到项目属性中的 Java 构建路径。删除现有的 JRE 系统库 然后再次添加,即添加库-->JRE Lib--选择 jre-->完成。 最后选择 order and export 选项卡选择 JRE Lib 并移至顶部。就是这样。

          【讨论】:

            【解决方案13】:

            只需更改项目的构建路径库的顺序即可。右键单击项目>构建路径>配置构建路径>选择顺序和导出(选项卡)>更改条目的顺序。我希望将“JRE 系统库”移到底部会起作用。它对我有用。简单易行....!!!

            【讨论】:

              【解决方案14】:

              在我的例子中,构建路径 JRE 和在执行环境中安装的 JRE 不匹配。我进入了项目 > 属性 > Java 编译器。底部有一条警告信息。

              我点击了“Installed JRE”、“Execution environment”、“Java build path”链接,将JDK版本改为1.7,警告消失了。

              【讨论】:

                【解决方案15】:

                通过构建路径添加正确的 JRE 系统是解决方案,但您的 eclipse 仍然可能有错误。 要解决这个问题,请转到 Java Build path --> Order and Export 并将您的 JRE 系统库移动到顶部。这解决了我的问题。

                【讨论】:

                  猜你喜欢
                  • 2012-03-05
                  • 2010-11-08
                  • 2014-10-03
                  • 2015-07-06
                  相关资源
                  最近更新 更多