访问限制:“应用程序”类型不是 API(对所需库 rt.jar 的限制)
Posted
技术标签:
【中文标题】访问限制:“应用程序”类型不是 API(对所需库 rt.jar 的限制)【英文标题】:Access restriction: The type 'Application' is not API (restriction on required library rt.jar) 【发布时间】:2014-10-03 01:45:44 【问题描述】:代码如下:
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”的限制)
【问题讨论】:
尝试使用 Java 7 运行它。 检查这些是否相关:***.com/questions/860187/…,***.com/questions/9266632/… 不使用 Xcode(还) 我对java不太熟悉,这家伙没有给出确切的路径。他是什么意思:com/sun/xml/internal/** 你能解释一下他所说的路径吗?谢谢!将来我将切换到 xCode 或 netbeans。上面那个人说我应该试试java 7吗? 【参考方案1】:首先(和不相关),自己实例化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(根据您的错误所说,这里可能就是这种情况;solution)或项目构建路径中的 JRE/JDK 版本不正确这最终更像是限制相关问题的混合体,而不是实际答案。但是由于对所需项目的限制是一个需要报告的通用错误,因此可能仍然需要找到完美的方法。
【讨论】:
【参考方案2】:我遇到了同样的问题。当我最初在 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 的回答:***.com/questions/6881622/…。) 奇怪的是这有效。我只安装了一个 JDK。多么奇怪。 有人知道如何在 Gradle 中自动应用这个吗?每当我执行 Gradle > Refresh 时,它都会将其覆盖回Java 1.8
。【参考方案3】:
这也发生在我身上,这里给出的答案已经不能令人满意,所以我自己研究了。
背景:Eclipse 访问限制
Eclipse 有一种称为访问限制 的机制来防止您意外使用 Eclipse 认为不属于公共 API 的类。通常,Eclipse 在这两个方面都是正确的:我们通常不想使用不属于公共 API 的东西。而且 Eclipse 通常对公共 API 的组成部分和不组成部分是正确的。
问题
现在,在某些情况下,您可能想要使用公共非 API,例如 sun.misc
(您不应该这样做,除非您知道自己在做什么)。在某些情况下,Eclipse 并不真正正确(这就是发生在我身上的事情,我只是想使用javax.smartcardio
)。在这种情况下,我们会在 Eclipse 中收到此错误。
解决方案
解决方法是更改访问限制。
转到 Java 项目的属性, 即通过从“包资源管理器”中项目的上下文菜单中选择“属性”。 转到“Java 构建路径”,选项卡“库”。 展开库条目 选择 “访问规则”, “编辑...”和 “添加...”一个带有相应规则模式的“解决方案:可访问”。 对我来说是“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 Release (4.5.1)。对我来说,两种解决方案都有效。克里斯蒂安的回答和乔纳森的评论。在标签库中,您必须打开列出的“JAR 和类文件夹”中的一个,才能看到属于它的“访问规则”。 这对我不起作用。日食月神。尝试JDK 1.8、1.7,添加访问规则,清理项目,错误不断出现。还尝试了@JonathanRoss 的建议——首先是在项目级别。在那里,尽管 Forbidden/Discouraged API 的项目级配置设置为警告,但我仍然遇到错误。然后我尝试(正如乔纳森建议的那样)检查工作区级别设置的首选项,并且在那里,禁止的 API 被设置为错误。更改为警告确实使问题消失了,但项目级别设置应该已被覆盖,认为这是 Eclipse 中的一个错误。 在我的情况下,我不允许修改访问限制:Eclipse Neon 在 jar "jfxrt.jar" 上有一个 maven jar 项目。 有一个更简单的选择:删除并重新添加 JRE 系统库,正如 ***.com/a/2174607/222838 中指出的那样【参考方案4】:我遇到了这个问题,因为与我的项目关联的项目方面是错误的 java 版本。
为了解决这个问题,我做了以下操作:
-
右键单击项目并选择属性
选择“Project Facets”并将 java 的版本更改为高于 1.4 的版本。
点击【应用】
这将重建您的项目,并希望错误会得到解决。
【讨论】:
【参考方案5】:如果您在使用 Spring Tool Suite 时遇到同样的问题:
Spring Tool Suite 的底层 IDE 实际上是 Eclipse。我刚刚尝试使用一些com.sun.net
类时遇到了这个错误。要消除这些错误并防止它们在 STS 的 Eclipse Luna SR1 (4.4.2) 平台中弹出:
你可以走了。
【讨论】:
【参考方案6】:成功了:项目属性 -> ProjectFacets -> 运行时 -> jdk1.8.0_45 -> 应用
【讨论】:
系统挂了 :(【参考方案7】:转到以下设置:
Window -> Preferences -> Java-Compiler-Errors/Warnings-Deprecated and restricted API-Forbidden reference(访问规则)
将其设置为Warning
或Ignore
。
【讨论】:
【参考方案8】:在 Eclipse 顶部菜单栏中:
Windows -> Preferences -> Java -> Compiler -> Errors/Warnings ->
Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning
【讨论】:
【参考方案9】:在 Eclipse Mars.2 版本 (4.5.2) 中:Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
选择 JRE... 并按 Edit: Switch to Workspace JRE (jdk1.8.0_77)
为我工作。
【讨论】:
【参考方案10】:我有 eclipse JRE 8.112 ,不确定这是否重要,但我所做的是:
-
右键单击我的项目文件夹
进入属性并点击
点击了java构建路径文件夹
一进去,我就在订单和出口
我检查了 JRE 系统库 [jre1.8.0_112]
然后将它移到那里的另一个 JRE 系统库之上(不确定这是否重要)
然后按下确定
这解决了我的问题。
【讨论】:
【参考方案11】:遇到了同样的问题。这是我解决它的方法: 转到包资源管理器。右键单击 JRE 系统库并转到属性。在 Classpath Container > Select JRE for the project build path 中选择第三个选项(Workspace default JRE)。
来源:https://thenewboston.com/forum/topic.php?id=3917
【讨论】:
谢谢...使用 C Hujer 提出的答案,我实际上发现文件 jfxrt.jar 有“162 条规则(不可修改)”!【参考方案12】:我只是在 Eclipse 市场中添加了 e(fx)clipse。简单易行
【讨论】:
没错,尽管它的描述中提到了 Java FX 2 和 FXML,但 ef(x)clipse 还配置了 Eclipse,因此它将 jfxrt.jar 视为 API。【参考方案13】:我正在使用 eclipse neon 3。我只是想使用 javafx.application.Application,所以我按照上面 Christian Hujer 的回答,它起作用了。只是一些提示:访问规则与 import 语句非常相似。对我来说,我添加的访问规则是“javafx/application/**”。只需用正斜杠替换 import 语句中的点,这就是规则。希望对您有所帮助。
【讨论】:
【参考方案14】:在 Eclipse 氧气中添加 javafx 可访问权限 转到项目>属性> java构建路径>库>然后展开库并双击>访问规则在那里你设置了权限 分辨率:可访问 规则模式:javafx/**
【讨论】:
【参考方案15】:我们必须更改我们的应用程序以使用 Window->Preferences->Java->Installed JREs 针对 JDK 1.8 构建。但是,更改之后,在 Project Explorer 中指定的 JRE 系统库仍然不正确。要解决此问题,请右键单击“JRE System Library [wrong-jre-here]”并从 Execution environment: 更改为“Workspace Default (yer-default-here)”
【讨论】:
【参考方案16】:我们使用 IBM Rational Application Developer (RAD) 并遇到了同样的问题。
错误消息:
访问限制:“JAXWSProperties”类型不是 API(对所需库“C:\IBM\RAD95\jdk\jre\lib\rt.jar”的限制)
解决方案:
转到 java 构建路径并在 Library 选项卡下,删除 JRE System Library。然后再次添加库 --> JRE 系统库
【讨论】:
【参考方案17】:我遇到了一些不同的问题。在项目 - 属性 - 库 - JRE 库中,我的 JRE 库版本错误。删除并设置实际的,瞧——所有Access restriction...
警告都消失了。
【讨论】:
【参考方案18】:如果有人在运行 maven 时仅在您的 CI 工具中遇到此问题,那么对我来说,诀窍是在您的 MANIFEST.MF
中明确定义执行环境。
在我的例子中,我通过在我的 OSGi 捆绑清单文件中插入以下行来做到这一点:
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
【讨论】:
【参考方案19】:即使是老问题,对我来说,在 Eclipse 中我只需右键单击 Src 文件夹 和属性 (Alt+Enter),检查 Ignore optional compile problems
即可消除错误。
【讨论】:
【参考方案20】:删除现有/配置的系统库: Eclipse(IDE) -> Project Explorer -> Project Name-> (Option) Build Path -> Configure Build Path -> Java Build Path -> Libraries -> (Select) JRE System Library [(For me)jre1.8.0_231] -> 删除。
目前您在同一地点: Eclipse(IDE) -> Project Explorer -> Project Name-> (Option) Build Path -> Configure Build Path -> Java Build Path -> Libraries
现在再次添加相同的系统库: 添加库 -> JRE 系统库 -> 工作区默认 JRE ((For me)jre1.8.0_231) -> 完成 -> 应用 -> 关闭。
现在等待完成。
【讨论】:
【参考方案21】:对我有用的是将访问受限包添加到 MANIFEST.MF 文件中。在 Eclipse 中,多个文件的“问题”选项卡中显示“访问受限”错误。我只是右键单击每个错误,单击“快速修复”,然后选择“将 '[package]' 添加到导入的包”。
【讨论】:
以上是关于访问限制:“应用程序”类型不是 API(对所需库 rt.jar 的限制)的主要内容,如果未能解决你的问题,请参考以下文章
访问限制:由于对所需库 ..\jre\lib\rt.jar 的限制,无法访问