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

Java 访问限制:类型';应用程序';不是API(对所需库rt.jar的限制),java,eclipse,macos,jar,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); A

代码如下:

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);
    }
}
以下是错误:

线程“main”java.lang中出现异常。错误:未解析编译 问题:访问限制:“应用程序”类型不是API (对所需图书馆的限制) “/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”) 访问限制:构造函数“Application()”不是API (对所需图书馆的限制) “/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”) 访问限制:“应用程序”类型不是API(对 必选库 “/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”) 访问限制:方法 “Application.SetEnabledBoutMenu(布尔)”不是API(对 必选库 “/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”) 无法将AMEListener解析为类型AMEListener无法 解析为一个类型 位于mscontroller.Main.Main(Main.java:9) eclipse说:

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

首先(不相关),自己实例化
应用程序
类似乎不是它的预期用途。从its中可以看出,您应该使用
getApplication()
返回的静态实例

现在让我们来看一下Eclipse报告中的错误。最近我遇到了一个类似的问题:
访问限制:方法。。。不是API(对所需项目的限制)
。我将所讨论的方法称为从超类继承该方法的对象的方法。我所要做的就是将超级类所在的包添加到插件导入的包中

然而,基于“对所需项目/库的限制”,有许多不同的错误原因。与上面描述的问题类似,您使用的类型可能与库未导出或自身未导出的包有依赖关系。在这种情况下,您可以尝试跟踪丢失的包,并根据建议自己导出它们,或者尝试访问规则。其他可能的情况包括:

  • Eclipse希望阻止您使用不属于公共JavaAPI(解决方案)的可用包
  • 依赖关系由多个源满足,版本冲突等(解决方案)
  • Eclipse正在使用一个需要JDK的JRE(从您的错误来看,这里可能就是这种情况),或者项目构建路径中的JRE/JDK版本不是正确的版本

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

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

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

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

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

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

  • 转到Java项目的属性,
    • i、 e.从“包资源管理器”中的项目上下文菜单中选择“属性”
  • 转到“Java构建路径”选项卡“库”
  • 展开库条目
  • 挑选
    • “访问规则”
    • “编辑…”和
    • “添加…”一个带有相应规则模式的“解析:可访问”。 对我来说这是“
      javax/smartcardio/**
      ”,而对你来说可能是“
      com/apple/eawt/**

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

      为了解决这个问题,我做了以下工作:

    • 在项目上单击鼠标右键,然后选择“属性”
    • 选择“ProjectFacets”并将java版本更改为大于1.4的版本
    • 单击[应用]

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

      如果您使用Spring工具套件遇到同样的问题:

      实际上,Spring工具套件的底层IDE是Eclipse。我刚才在尝试使用一些
      com.sun.net
      类时遇到了这个错误。要删除这些错误并防止它们出现在STS的Eclipse Luna SR1(4.4.2)平台中,请执行以下操作:

      • 导航到项目>属性
      • 展开Java编译器标题
      • 单击错误/警告
      • 展开不推荐的和受限制的API
      • 在“禁止引用(访问规则)”旁选择“忽略”
      • 在“不鼓励引用(访问规则)”旁选择“忽略”

      你可以走了。

      成功了:项目属性->项目FAC
      Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
      Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning
      
      Bundle-RequiredExecutionEnvironment: JavaSE-1.8