ChatGPT解决这个技术问题 Extra ChatGPT

访问限制:“应用程序”类型不是 API(对所需库 rt.jar 的限制)

这是代码:

package mscontroller;

import javax.swing.*;
import com.apple.eawt.Application;

public class Main {
    public static void main(String[] args)
    {
        Application app = new Application();
        app.setEnabledAboutMenu(true);

        AMEListener listener = new AMEListener();
        app.addApplicationListener(listener);
        JFrame mainFrame = new JFrame("Application Menu Example");
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

这是错误:

Exception in thread "main" java.lang.Error: Unresolved compilation
problems:   Access restriction: The type 'Application' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The constructor 'Application()' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The type 'Application' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The method
'Application.setEnabledAboutMenu(boolean)' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    AMEListener cannot be resolved to a type    AMEListener cannot be
resolved to a type

    at mscontroller.Main.main(Main.java:9)

日食说:

访问限制:“应用程序”类型不是 API(对所需库“/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”的限制)

尝试使用 Java 7 运行它。
不使用 Xcode(还)
我对java不太熟悉,这个人没有给出确切的路径。他是什么意思:com/sun/xml/internal/**
你能解释一下他所说的路径吗?谢谢!将来我将切换到 xCode 或 netbeans。上面的人说我应该尝试java 7吗?

T
Torsten

这也发生在我身上,这里给出的答案已经不令人满意,所以我自己做了研究。

背景:Eclipse 访问限制

Eclipse 有一种称为访问限制的机制,以防止您意外使用 Eclipse 认为不属于公共 API 的类。通常,Eclipse 在这两个方面都是正确的:我们通常不想使用不属于公共 API 的东西。 Eclipse 通常是正确的,什么是公共 API 的一部分,什么不是公共 API 的一部分。

问题

现在,在某些情况下,您可能想要使用公共非 API,例如 sun.misc(您不应该这样做,除非您知道自己在做什么)。在某些情况下,Eclipse 并不真正正确(这就是发生在我身上的事情,我只是想使用 javax.smartcardio)。在这种情况下,我们会在 Eclipse 中收到此错误。

解决方案

解决方案是更改访问限制。

转到Java 项目的属性,即从“Package Explorer”中项目的上下文菜单中选择“Properties”。

即通过从“包资源管理器”中项目的上下文菜单中选择“属性”。

转到“Java 构建路径”,选项卡“库”。

展开库条目

选择“访问规则”、“编辑...”和“添加...”以及具有相应规则模式的“解决方案:可访问”。对我来说是“javax/smartcardio/**”,对你来说可能是“com/apple/eawt/**”。

“访问规则”,

“编辑...”和

“添加...”一个带有相应规则模式的“解决方案:可访问”。对我来说是“javax/smartcardio/**”,对你来说可能是“com/apple/eawt/**”。


我有 Eclipse Mars (4.5.0),Java Build Path -> Libraries 中没有访问规则。 FWIW 在 Preferences -> Java -> Compiler -> Errors / Warnings -> Deprecated and Restricted API 中有一个更大的锤子(您可以将它们全部关闭)。
我有 Eclipse Mars.1 版本(4.5.1)。对我来说,两种解决方案都有效。克里斯蒂安的回答和乔纳森的评论。在标签库中,您必须打开列出的“JAR 和类文件夹”中的一个,以查看属于它的“访问规则”。
这对我不起作用。日食月神。尝试JDK 1.8、1.7,添加访问规则,清理项目,错误不断出现。还尝试了@JonathanRoss 的建议——首先是在项目级别。在那里,尽管 Forbidden/Discouraged API 的项目级配置设置为警告,但我仍然遇到错误。然后我尝试(正如乔纳森建议的那样)检查工作区级别设置的首选项,并且在那里,禁止的 API 被设置为错误。更改为警告确实使问题消失,但项目级别设置应该已被覆盖,认为这是 Eclipse 中的错误。
在我的情况下,我不允许修改访问限制:Eclipse Neon 在 jar“jfxrt.jar”上带有一个 maven jar 项目。
有一个更简单的替代方法:删除并重新添加 JRE 系统库,如 stackoverflow.com/a/2174607/222838 中所指出的
A
Amber

我遇到了同样的问题。当我最初在 Eclipse 中创建 java 项目时,我指定了 JRE 8。当我进入项目的构建路径并编辑 JRE 系统库时,选择了 Java 8 执行环境。当我选择使用“Alernate JRE”(仍然是 java 8)时,它为我修复了错误。


我更喜欢全局修复,但它比启用全局受限 API 的所有其他答案要好。 (我不想在我的 javafx 应用程序中意外使用 sun.*)。
谢谢,这清除了我项目中的所有警告。 Eclipse 抱怨 JavaFX (jfxrt.jar) 提供的所有类
确认...我将 JRE 8 u60 更改为...JRE 8 u60。显然,与任何其他方式相比,触发此重建具有解决问题的副作用。 (有关如何更改此设置的更详细说明,请参阅 Nikhil Mahajan 的回答:stackoverflow.com/questions/6881622/…。)
奇怪的是,这奏效了。我只安装了一个 JDK。多么奇怪。
有人知道如何在 Gradle 中自动应用它吗?每当我做一个 Gradle >刷新,它只是将其覆盖回 Java 1.8
v
vidyakumargv

在 Eclipse 氧气中添加 javafx 可访问权限转到项目> 属性> java 构建路径> 库> 然后展开库并双击> 访问规则在那里设置权限解决方案:可访问规则模式:javafx/**

https://i.stack.imgur.com/rGWzT.png

https://i.stack.imgur.com/aL6sj.png

https://i.stack.imgur.com/UxJIH.png


C
Community

首先(和无关),自己实例化 Application 类似乎不是它的预期用途。从它的 source 可以读取的内容来看,您应该使用 getApplication() 返回的静态实例。

现在让我们来看看 Eclipse 报告的错误。我最近遇到了类似的问题:Access restriction: The method ... is not API (restriction on required project)。我将所讨论的方法称为从超类继承该方法的对象的方法。我所要做的就是将超类所在的包添加到我的插件导入的包中。

但是,基于“对所需项目/库的限制”,有很多不同的错误原因。与上面描述的问题类似,您使用的类型可能依赖于未由库导出的包或可能不会自行导出的包。在这种情况下,您可以按照建议 here 尝试查找丢失的包并自己导出它们,或者尝试访问规则。其他可能的情况包括:

Eclipse 希望阻止您使用不属于公共 Java API 的可用包(解决方案 1、2)

多个来源满足依赖关系,版本冲突等(解决方案 1、2、3)

Eclipse 正在使用需要 JDK 的 JRE(根据您的错误所说;解决方案可能就是这种情况)或项目构建路径中的 JRE/JDK 版本不正确

这最终更像是限制相关问题的混合体,而不是实际答案。但是由于对所需项目的限制是一个需要报告的通用错误,因此可能仍然需要找到完美的方法。


D
Dinsdale

我们必须更改我们的应用程序以使用 Window->Preferences->Java->Installed JREs 针对 JDK 1.8 构建。但是,更改后,在 Project Explorer 中指定的 JRE System Library 仍然不正确。要解决此问题,请右键单击“JRE System Library [wrong-jre-here]”并从执行环境更改:更改为“Workspace Default (yer-default-here)”

https://i.stack.imgur.com/JkARy.png


K
Kiriya Keat

我遇到了这个问题,因为与我的项目关联的项目方面是错误的 java 版本。

为了解决这个问题,我做了以下事情:

右键单击项目并选择 Properties 选择“Project Facets”并将 java 的版本更改为大于 1.4 的版本。点击【申请】

这将重建您的项目,并希望错误将得到解决。


K
Kamila O

它起作用了:项目属性-> ProjectFacets-> 运行时-> jdk1.8.0_45-> 应用


系统挂了:(
M
MarianD

在 Eclipse 顶部菜单栏中:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning

D
Developer Formerly Known as V

如果您在使用 Spring Tool Suite 时遇到同样的问题:

Spring Tool Suite 的底层 IDE 实际上是 Eclipse。我刚刚尝试使用某些 com.sun.net 类时遇到此错误。要消除这些错误并防止它们在 STS 的 Eclipse Luna SR1 (4.4.2) 平台中弹出:

导航到项目 > 属性

展开 Java 编译器标题

单击错误/警告

扩展已弃用和受限的 API

在“禁止引用(访问规则)”旁边选择“忽略”

在“不鼓励参考(访问规则)”旁边选择“忽略”

你可以走了。


N
Nishant_Singh

有同样的问题。这是我解决它的方法:转到包资源管理器。右键单击 JRE 系统库并转到属性。在 Classpath Container > Select JRE for the project build path 中选择第三个选项(Workspace 默认 JRE)。

来源:https://thenewboston.com/forum/topic.php?id=3917


谢谢...使用C Hujer提出的答案,我实际上发现文件jfxrt.jar有“162条规则(不可修改)”!
J
Jonas_Hess

我们使用 IBM Rational Application Developer (RAD) 并且遇到了同样的问题。

错误信息:

访问限制:“JAXWSProperties”类型不是 API(对所需库“C:\IBM\RAD95\jdk\jre\lib\rt.jar”的限制)

解决方案:

转到 java build path 并在 Library 选项卡下,删除 JRE System Library。然后再次添加库-> JRE系统库


M
Matt

转到以下设置:

Window -> Preferences -> Java-Compiler-Errors/Warnings-Deprecated and restricted API-Forbidden reference(访问规则)

将其设置为 WarningIgnore


S
Sven

在 Eclipse Mars.2 Release (4.5.2) 中:
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
选择 JRE... 并按编辑:切换到工作区 JRE (jdk1.8.0_77)

为我工作。


q
quasar-light

我有 eclipse JRE 8.112 ,不确定这是否重要,但我所做的是:

右键单击我的项目文件夹进入属性并单击一次在里面单击 java 构建路径文件夹,我按顺序导出我检查了 JRE 系统库 [jre1.8.0_112] 然后将它移到另一个 JRE 上方那里的系统库(不确定这是否重要)然后按确定

这解决了我的问题。


j
jessie

我只是在 Eclipse 市场中添加了 e(fx)clipse。简单易行


确切地说,尽管它的描述提到了 Java FX 2 和 FXML,但 ef(x)clipse 还配置了 Eclipse,因此它将 jfxrt.jar 视为 API。
M
MrSimpleMind

即使它是老问题,对我来说,在 Eclipse 中我只需右键单击 Src 文件夹 和属性 (Alt+Enter) 并检查 Ignore optional compile problems 即可删除错误。

https://i.stack.imgur.com/PzsxJ.png


i
iamfnizami

删除现有/配置的系统库:Eclipse(IDE) -> Project Explorer -> Project Name-> (Option) Build Path -> Configure Build Path -> Java Build Path -> Libraries -> (Select) JRE System Library [(For我)jre1.8.0_231] -> 删除。

目前您位于同一位置:Eclipse(IDE) -> Project Explorer -> Project Name-> (Option) Build Path -> Configure Build Path -> Java Build Path -> Libraries

现在再次添加相同的系统库:添加库 -> JRE 系统库 -> 工作区默认 JRE ((对我来说)jre1.8.0_231) -> 完成 -> 应用 -> 关闭。

现在等待完成它。


T
Tony S

我正在使用eclipse neon 3。我只是想使用javafx.application.Application,所以我按照上面Christian Hujer的回答并且它有效。只是一些提示:访问规则与 import 语句非常相似。对我来说,我添加的访问规则是“javafx/application/**”。只需用正斜杠替换 import 语句中的点,这就是规则。希望有帮助。


G
Gangnus

我有一点不同的问题。在项目 - 属性 - 库 - JRE 库中,我的 JRE 库版本错误。删除并设置实际的,瞧 - 所有 Access restriction... 警告都消失了。


F
Fappaz

如果有人在运行 maven 时仅在您的 CI 工具中遇到此问题,那么对我来说,诀窍是在您的 MANIFEST.MF 中明确定义执行环境。

就我而言,我通过在我的 OSGi 捆绑清单文件中插入以下行来做到这一点:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8

J
Jasper

对我有用的是将访问受限包添加到 MANIFEST.MF 文件中。在 Eclipse 中,多个文件的“问题”选项卡中显示“访问受限”错误。我只是右键单击每个错误,单击“快速修复”,然后选择“将'[包]'添加到导入的包”。


B
Binita Bharati

我在使用 JRE 1.8 的 Eclipse 4.20.0 上遇到了同样的错误。要消除此编译错误,请执行以下操作:

Project --> Properties --> Java Compiler --> Errors/Warnings --> Deprecated and Restricted API --> Forbidden Reference (access rules) -->  ignore