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


175

这是代码:

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”的限制)


3
尝试使用Java 7运行它
。– spoko


未使用Xcode(尚未)
2014年

我对Java并不熟悉,但是他没有给出确切的路径。他的意思是:com / sun / xml / internal / **
www139 2014年

1
你能解释他在说什么路吗?谢谢!将来,我将切换到xCode或netbeans。上面的家伙说我应该尝试Java 7吗?
www139 2014年

Answers:


275

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

背景:Eclipse 访问限制

Eclipse具有一种称为访问限制的机制,可以防止您意外使用Eclipse认为不属于公共API的类。通常,从两种意义上讲,Eclipse都是正确的:我们通常不想使用不属于公共API的内容。Eclipse通常对公共API的组成部分和不组成部分是正确的。

问题

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

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

  • 转到Java项目的属性,
    • 即通过从“包资源管理器”中的项目的上下文菜单中选择“属性”。
  • 转到“ Java构建路径”,选项卡“库”。
  • 展开库条目
  • 选择
    • “访问规则”,
    • “编辑...”和
    • “添加...”和相应的规则模式的“解决方案:可访问”。对我来说是“ javax/smartcardio/**”,对您来说可能是“ com/apple/eawt/**”。

28
我有Eclipse Mars(4.5.0),并且Java Build Path-> Libraries中没有访问规则。FWIW在“首选项”->“ Java”->“编译器”->“错误/警告”->“已弃用和受限制的API”中有一个更大的锤子(您可以将其全部关闭)。
乔纳森·罗斯

4
我有Eclipse Mars.1版本(4.5.1)。对我来说,两种解决方案都有效。克里斯蒂安的回答和乔纳森的评论。在“库”选项卡中,您必须打开列出的“ JAR和类文件夹”之一,以查看属于它的“访问规则”。
Laszlo Hirdi

3
这对我不起作用。蚀月神。尝试了JDK 1.8、1.7,添加了访问规则,清理了项目,错误不断出现。还尝试了@JonathanRoss的建议-首先是在项目级别。在那里,尽管“禁止/禁止使用的API”的项目级配置设置为“警告”,但仍然出现错误。然后,我尝试(按照Jonathan的建议)遍历工作区级别设置的首选项,然后将“禁止的API”设置为“错误”。更改为警告确实可以解决问题,但是应该重写项目级别的设置,认为这是Eclipse中的错误。
史蒂夫·科恩

2
在这种情况下,我不允许修改访问限制:在jar“ jfxrt.jar”上具有maven jar项目的Eclipse Neon。
pdem '16

2
有一个简单得多的替代方法:删除并重新添加JRE系统库,如stackoverflow.com/a/2174607/222838
mico

81

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


2
我本来希望使用全局修复程序,但是它比在全球启用受限API的所有其他答案要好。(我不想在我的javafx应用程序中意外使用sun。*)。
Mark Jeronimus

1
谢谢,这清除了我项目中的所有警告。Eclipse抱怨JavaFX(jfxrt.jar)提供的所有类
Goran Vasic

2
确认...我用... JRE 8 u60更改了JRE 8 u60。显然,与其他任何方式相比,触发此重建操作具有解决此问题的副作用。(有关如何更改此设置的详细说明,请参见此处的Nikhil Mahajan的回答:stackoverflow.com/questions/6881622/…
年长

谢谢!通过这种策略,我能够成功编译spark java框架。
Martin Pabst

1
奇怪的是,这个工作。我只安装了一个JDK。真奇怪
WesternGun

64

在eclipse oxygen中添加javafx可访问权限,请转到“项目”>“属性”>“ java构建路径”>“库”>,然后展开库并双击>“访问规则”,在其中设置权限。解决方法:“可访问规则模式”:javafx / **

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


23

首先(和不相关),Application自己实例化该类似乎不是其预期用途。从可以从其源中读取的内容中,您应该使用getApplication()

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

但是,基于“对所需项目/库的限制”,有很多不同的错误原因。与上述问题类似,您使用的类型可能与库未导出或本身未导出的包具有依赖性。在这种情况下,您可以按照此处的建议尝试查找丢失的软件包并自己导出,也可以尝试访问规则。其他可能的方案包括:

  • Eclipse的希望让你使用可用的软件包不属于公共Java API的一部分(溶液12
  • 依赖关系是由多个源满足,版本是矛盾等。(溶液123
  • Eclipse在需要JDK的情况下使用JRE(在这里,可能是您的错误所表示的情况;解决方案),或者项目构建路径中的JRE / JDK版本不正确

最终,它看起来更像是与限制相关的问题,而不是实际的答案。但是由于需要进行的项目的限制是一个多才多艺的错误,有待报告,因此可能仍在寻找完美的配方。


18

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

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

  1. 右键单击项目,然后选择属性
  2. 选择“ Project Facets”并将Java版本更改为大于1.4的版本。
  3. 点击[应用]

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


15

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

在此处输入图片说明


1
谢谢!我的生命平安:)
KMC

13

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


系统挂断了:(
Saikat

12

在Eclipse顶部菜单栏中:

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

9

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

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

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

你很好。


6

有同样的问题。解决方法如下:转到Package Explorer。右键单击“ JRE系统库”,然后转到“属性”。在类路径容器>选择JRE作为项目构建路径中,选择第三个选项(工作区默认JRE)。

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


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

5

转到以下设置:

窗口->首选项-> Java-Compiler-Errors / Warnings-已弃用和受限的API-禁止引用(访问规则)

将其设置为WarningIgnore


5

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

错误信息:

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

解:

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


4

在Eclipse Mars.2版本(4.5.2)中:
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
选择JRE ...,然后按Edit:切换到Workspace JRE(jdk1.8.0_77)

为我工作。


3

我已经蚀了JRE 8.112,不确定是否重要,但是我所做的是:

  1. 右键单击我的项目文件夹
  2. 转到属性并单击
  3. 单击Java构建路径文件夹
  4. 一进去,我就可以订购并出口
  5. 我检查了JRE系统库[jre1.8.0_112]
  6. 然后将其移到那里的另一个JRE系统库之上(不确定是否很重要)
  7. 然后按确定

这解决了我的问题。


2

我只是在日食市场中添加e(fx)clipse。简单容易


1

我正在使用eclipse neon3。我只想使用javafx.application.Application,因此我遵循了Christian Hujer的上述回答,并且可以正常工作。只是一些技巧:访问规则与import语句非常相似。对我来说,我添加的访问规则是“ javafx / application / **”。只需将import语句中的点替换为正斜杠,这就是规则。希望有帮助。


1

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


1

即使是老问题,对于Eclipse的我来说,我也只需右键单击Src文件夹和属性(Alt + Enter),然后检查是否已Ignore optional compile problems删除错误。

在此处输入图片说明


0

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

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

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
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.