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

时间:2014-08-09 20:35:54

标签: java eclipse macos 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)
eclipse说:

  

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

20 个答案:

答案 0 :(得分:231)

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

背景:Eclipse 访问限制

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

问题

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

解决方案

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

  • 转到Java项目的属性,
    • 即。通过在“Package Explorer”中从项目的上下文菜单中选择“Properties”。
  • 转到“Java Build Path”,选项卡“Libraries”。
  • 展开图书馆条目
  • 选择
    • “访问规则”,
    • “编辑...”和
    • “添加...”具有相应规则模式的“分辨率:可访问”。 对我来说是“javax/smartcardio/**”,对你来说可能是“com/apple/eawt/**”。

答案 1 :(得分:76)

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

答案 2 :(得分:53)

在eclipse氧气中添加 javafx 可访问权限 转到项目>性状> java build path>库>然后展开库并双击>您在那里设置权限的访问规则 解决方案:可访问 规则模式:javafx / **

enter image description here

enter image description here

enter image description here

答案 3 :(得分:22)

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

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

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

  • Eclipse希望阻止您使用不属于公共Java API的可用包(解决方案12
  • 多个来源满足相关性,版本存在冲突等(解决方案123
  • Eclipse正在使用JRE,其中需要JDK(可能就是这里的情况,从您的错误中说出来的; solution)或项目构建路径中的JRE / JDK版本不是正确的

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

答案 4 :(得分:17)

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

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

  1. 右键单击项目,然后选择“属性”
  2. 选择'项目方面'并将java的版本更改为大于1.4的内容。
  3. 单击[应用]
  4. 这将重建您的项目,并希望错误将得到解决。

答案 5 :(得分:13)

它有效:项目属性 - > ProjectFacets - >运行时 - > jdk1.8.0_45 - >应用

答案 6 :(得分:10)

在Eclipse顶部菜单栏中:

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

答案 7 :(得分:9)

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

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

  • 导航至项目>属性
  • 展开Java编译器标题
  • 点击错误/警告
  • 展开已弃用且受限制的API
  • 在“禁止参考(访问规则)”旁边,选择“忽略”
  • 在“不鼓励的参考(访问规则)”旁边,选择“忽略”

你很高兴。

答案 8 :(得分:7)

我们必须使用 Window-> Preferences-> Java-> Installed JREs 将我们的应用程序更改为针对JDK 1.8进行构建。但是,在更改之后,Project Explorer中指定的JRE系统库仍然不正确。要解决此问题,请右键单击" JRE系统库[wrong-jre-here]"并从执行环境更改为"工作区默认(默认 - 此处)"

enter image description here

答案 9 :(得分:5)

有同样的问题。这是我解决它的方式: 转到Package Explorer。右键单击JRE System Library并转到Properties。在Classpath容器中>为项目构建路径选择JRE选择第三个选项(Workspace default JRE)。

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

答案 10 :(得分:4)

转到以下设置:

窗口 - >偏好 - > Java编译器错误/警告 - 已弃用且受限制的API禁止引用(访问规则)

将其设置为WarningIgnore

答案 11 :(得分:3)

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

适合我。

答案 12 :(得分:3)

即使是老问题,对我来说,在Eclipse中,我也只需右键单击 Src文件夹和属性(Alt + Enter),然后检查master即可消除错误。

enter image description here

答案 13 :(得分:2)

我对JRE 8.112感到满意,不确定这是否重要,但我所做的是:

  1. 右键单击我的项目文件夹
  2. 转到属性并单击
  3. 点击了java build path文件夹
  4. 一旦进入,我就在订单中并导出
  5. 我检查了JRE系统库[jre1.8.0_112]
  6. 然后将其移到那里的另一个JRE系统库之上(不确定这是否重要)
  7. 然后按下确定
  8. 这解决了我的问题。

答案 14 :(得分:1)

我只是在eclipse市场中添加e(fx)clipse。简单易用

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

错误消息:

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

解决方案:

转到Java构建路径,然后在“库”选项卡下,删除“ JRE系统库”。然后再次添加库-> JRE系统库

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

就我而言,我是通过在OSGi捆绑清单文件中插入以下行来实现的:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8

答案 19 :(得分:0)

删除现有/配置的系统库: Eclipse(IDE)->项目浏览器->项目名称->(选项)构建路径->配置构建路径-> Java构建路径->库->(选择)JRE系统库[(对我来说)jre1.8.0_231]->删除。

当前您位于同一位置: Eclipse(IDE)->项目浏览器->项目名称->(选项)构建路径->配置构建路径-> Java构建路径->库

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

现在等待完成。