Zugriffsbeschränkung: Der Typ 'Anwendung' ist keine API (Einschränkung der erforderlichen Bibliothek rt.jar)

174

Hier ist der Code:

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);
    }
}

Hier ist der Fehler:

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 sagt dies:

Zugriffsbeschränkung: Der Typ 'Anwendung' ist keine API (Einschränkung der erforderlichen Bibliothek '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')

www139
quelle
3
Versuchen Sie dies mit Java 7
auszuführen
2
Überprüfen Sie diese auf Relevanz: stackoverflow.com/questions/860187/… , stackoverflow.com/questions/9266632/…
user2864740
Xcode (noch) nicht verwenden
www139
Ich bin nicht zu vertraut mit Java, der Typ gibt keinen genauen Weg. Was meint er mit: com / sun / xml / internal / **
www139
1
Könnten Sie interpretieren, über welchen Weg er spricht? Danke dir! In Zukunft werde ich entweder auf xCode oder Netbeans umsteigen. Der Typ oben sagte, ich soll Java 7 ausprobieren, sollte ich?
www139

Antworten:

272

Dies passierte auch mir und die hier gegebenen Antworten waren nicht zufriedenstellend, so dass ich meine eigenen Nachforschungen anstellte.

Hintergrund: Eclipse- Zugriffsbeschränkungen

Eclipse verfügt über einen Mechanismus namens Zugriffsbeschränkungen, um zu verhindern, dass Sie versehentlich Klassen verwenden, von denen Eclipse glaubt, dass sie nicht Teil der öffentlichen API sind. Normalerweise hat Eclipse in beiden Sinnen Recht: Wir möchten normalerweise nichts verwenden, was nicht Teil der öffentlichen API ist. Und Eclipse hat normalerweise Recht damit, was Teil der öffentlichen API ist und was nicht.

Problem

Jetzt kann es Situationen geben, in denen Sie öffentliche Nicht-APIs verwenden möchten, z. B. sun.misc(sollten Sie nicht, es sei denn, Sie wissen, was Sie tun). Und es kann Situationen geben, in denen Eclipse nicht wirklich richtig ist (das ist mir passiert, ich wollte es nur nutzen javax.smartcardio). In diesem Fall erhalten wir diesen Fehler in Eclipse.

Lösung

Die Lösung besteht darin, die Zugriffsbeschränkungen zu ändern.

  • Gehen Sie zu den Eigenschaften Ihres Java-Projekts.
    • dh durch Auswahl von "Eigenschaften" aus dem Kontextmenü des Projekts im "Paket-Explorer".
  • Gehen Sie zu "Java Build Path", Registerkarte "Libraries".
  • Erweitern Sie den Bibliothekseintrag
  • wählen
    • "Zugriffsregeln",
    • "Bearbeiten ..." und
    • "Hinzufügen ..." eine "Auflösung: Zugänglich" mit einem entsprechenden Regelmuster. Für mich war das " javax/smartcardio/**", für dich könnte es stattdessen " com/apple/eawt/**" sein.
Christian Hujer
quelle
28
Ich habe Eclipse Mars (4.5.0) und es gibt keine Zugriffsregeln in Java Build Path -> Libraries. FWIW gibt es einen größeren Hammer (Sie können alle deaktivieren) in den Einstellungen -> Java -> Compiler -> Fehler / Warnungen -> Veraltete und eingeschränkte API.
Jonathan Ross
4
Ich habe Eclipse Mars.1 Release (4.5.1). Bei mir haben beide Lösungen funktioniert. Die Antwort von Christian und der Kommentar von Jonathan. Auf der Registerkarte Bibliotheken müssen Sie die unter den aufgelisteten "JARs und Klassenordnern" öffnen, um zu sehen, dass die "Zugriffsregeln" dazu gehören.
Laszlo Hirdi
3
Das funktioniert bei mir NICHT. Eclipse Luna. Versucht JDK 1.8, 1.7, Zugriffsregeln hinzugefügt, Projekt bereinigen, die Fehler kommen immer wieder. Auch versucht Vorschlag von @JonathanRoss - zuerst auf Projektebene. Obwohl auf Projektebene Konfigurationen für verbotene / entmutigte APIs auf Warnung gesetzt wurden, wurden dort immer noch Fehler angezeigt. Ich habe dann versucht (wie Jonathan vorgeschlagen hat), die Einstellungen für Einstellungen auf Arbeitsbereichsebene durchzugehen, und dort wurden Verbotene APIs auf Fehler gesetzt. Das Ändern der Warnung dort hat das Problem behoben, aber die Einstellung auf Projektebene sollte überschrieben werden. Denken Sie, dass dies ein Fehler in Eclipse ist.
Steve Cohen
2
In meinem Fall durfte ich die Zugriffsbeschränkung nicht ändern: Eclipse Neon mit einem Maven-JAR-Projekt auf JAR "jfxrt.jar".
pdem
2
Es gibt eine viel einfachere Alternative: Entfernen und Hinzufügen der JRE- Systembibliothek
mico
81

Ich hatte das gleiche Problem. Als ich das Java-Projekt zum ersten Mal in Eclipse erstellte, gab ich JRE 8 an. Als ich in den Erstellungspfad des Projekts ging und die JRE-Systembibliothek bearbeitete, wurde die Java 8-Ausführungsumgebung ausgewählt. Als ich mich für eine "Alernate JRE" (immer noch Java 8) entschieden habe, wurde der Fehler für mich behoben.

Bernstein
quelle
2
Ich hätte einen globalen Fix bevorzugt, aber er ist besser als alle anderen Antworten, die eine eingeschränkte API global ermöglichen. (Ich möchte nicht versehentlich Sonne verwenden. * In meiner Javafx-Anwendung).
Mark Jeronimus
1
Vielen Dank, dies hat alle Warnungen in meinem Projekt gelöscht. Eclipse beschwerte sich über alle Klassen, die von JavaFX (jfxrt.jar) bereitgestellt wurden
Goran Vasic
2
Bestätigt ... Ich habe JRE 8 u60 durch ... JRE 8 u60 geändert. Anscheinend hat diese ausgelöste Neuerstellung im Gegensatz zu jeder anderen Möglichkeit den Nebeneffekt, das Problem zu beheben. (Eine ausführlichere Erklärung zum Ändern dieser Einstellung finden Sie in der Antwort von Nikhil Mahajan hier: stackoverflow.com/questions/6881622/… .)
Elder Elder
Danke dir! Mit dieser Strategie konnte ich das Spark Java Framework erfolgreich kompilieren.
Martin Pabst
1
Seltsamerweise hat das funktioniert. Ich habe nur ein JDK installiert. Wie seltsam.
WesternGun
64

Wenn Sie in Eclipse Oxygen die Zugriffsberechtigung für Javafx hinzufügen, gehen Sie zu Projekt> Eigenschaften> Java-Erstellungspfad> Bibliotheken>, erweitern Sie die Bibliotheken und doppelklicken Sie auf> Zugriffsregeln. Dort legen Sie die Berechtigung fest. Lösung: Zugriffsregelmuster: Javafx / **

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

vidyakumargv
quelle
23

Zunächst ( und ohne Beziehung ) Applicationscheint es nicht beabsichtigt zu sein , die Klasse selbst zu instanziieren . Nach dem, was man aus seiner Quelle lesen kann , wird eher erwartet, dass Sie die statische Instanz verwenden, die von zurückgegeben wird getApplication().

Kommen wir nun zu den Eclipse-Fehlerberichten. Ich bin kürzlich auf ein ähnliches Problem gestoßen : Access restriction: The method ... is not API (restriction on required project). Ich habe die fragliche Methode als Methode eines Objekts bezeichnet, das diese Methode von einer Superklasse geerbt hat. Ich musste nur das Paket, in dem sich die Superklasse befand, zu den von meinem Plugin importierten Paketen hinzufügen.

Es gibt jedoch viele verschiedene Fehlerursachen, die auf "Einschränkung des erforderlichen Projekts / der erforderlichen Bibliothek " beruhen . Ähnlich wie bei dem oben beschriebenen Problem kann der von Ihnen verwendete Typ Abhängigkeiten zu Paketen aufweisen, die nicht von der Bibliothek exportiert oder selbst nicht exportiert werden. In diesem Fall können Sie versuchen, die fehlenden Pakete aufzuspüren und selbst zu exportieren, wie hier vorgeschlagen , oder Zugriffsregeln ausprobieren. Andere mögliche Szenarien sind:

  • Eclipse möchte Sie davon abhalten, verfügbare Pakete zu verwenden, die nicht Teil der öffentlichen Java-API sind (Lösung 1 , 2 ).
  • Abhängigkeiten werden von mehreren Quellen erfüllt, Versionen stehen in Konflikt usw. (Lösung 1 , 2 , 3 )
  • Eclipse verwendet eine JRE, bei der ein JDK erforderlich ist (was hier aufgrund Ihrer Fehler möglicherweise der Fall ist; Lösung ), oder die JRE / JDK-Version im Projekterstellungspfad ist nicht die richtige

Dies endete eher als eine Mischung aus einschränkungsbezogenen Themen als als eine tatsächliche Antwort. Da die Beschränkung auf erforderliche Projekte ein so vielseitiger Fehler ist, der gemeldet werden muss, ist das perfekte Rezept wahrscheinlich noch zu finden.

J. Katzwinkel
quelle
18

Ich hatte dieses Problem, weil die mit meinem Projekt verknüpfte Projektfacette die falsche Java-Version war.

Um dies zu beheben, habe ich Folgendes getan:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Eigenschaften
  2. Wählen Sie 'Projektfacetten' und ändern Sie die Java-Version auf etwas größer als 1.4.
  3. Klicken Sie auf [Übernehmen]

Dadurch wird Ihr Projekt neu erstellt und der Fehler wird hoffentlich behoben.

Kiriya Keat
quelle
15

Wir mussten unsere Anwendung ändern, um mit Windows-> Einstellungen-> Java-> Installierte JREs gegen das JDK 1.8 zu bauen . Nach dieser Änderung war die im Projektexplorer angegebene JRE-Systembibliothek jedoch immer noch falsch. Um dies zu beheben, klicken Sie mit der rechten Maustaste auf "JRE-Systembibliothek [false-jre-here]" und wechseln Sie von der Ausführungsumgebung zu "Workspace Default (yer-default-here)".

Geben Sie hier die Bildbeschreibung ein

Dinsdale
quelle
1
Vielen Dank! Das rettet mein Leben :)
KMC
13

Es hat funktioniert: Projekteigenschaften -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Apply

Kamila O.
quelle
System aufgelegt :(
Saikat
12

In der oberen Eclipse-Menüleiste:

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

Wenn Sie dasselbe Problem mit Spring Tool Suite haben:

Die zugrunde liegende IDE der Spring Tool Suite ist Eclipse. Ich habe diesen Fehler gerade beim Versuch bekommen, einige com.sun.netKlassen zu verwenden. So entfernen Sie diese Fehler und verhindern, dass sie auf der Eclipse Luna SR1 (4.4.2) -Plattform von STS auftreten:

  • Navigieren Sie zu Projekt> Eigenschaften
  • Erweitern Sie die Überschrift Java Compiler
  • Klicken Sie auf Fehler / Warnungen
  • Erweitern Sie die veraltete und eingeschränkte API
  • Wählen Sie neben "Verbotene Referenz (Zugriffsregeln)" die Option "Ignorieren".
  • Wählen Sie neben "Entmutigte Referenz (Zugriffsregeln)" die Option "Ignorieren".

Du bist gut zu gehen.

Grandclosing
quelle
6

Hatte das gleiche Problem. So habe ich es gelöst: Gehen Sie zum Paket-Explorer. Klicken Sie mit der rechten Maustaste auf JRE-Systembibliothek und gehen Sie zu Eigenschaften. Wählen Sie im Klassenpfadcontainer> JRE für den Projekterstellungspfad auswählen die dritte Option (Standard-JRE für den Arbeitsbereich).

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

Nishant_Singh
quelle
1
Danke ... mit der Antwort von C Hujer fand ich tatsächlich "162 Regeln (nicht änderbar)" für die Datei jfxrt.jar!
Mike Nagetier
5

Gehen Sie zur folgenden Einstellung:

Fenster -> Einstellungen -> Java-Compiler-Fehler / Warnungen-Veraltete und eingeschränkte API-Verbotene Referenz (Zugriffsregeln)

Stellen Sie es auf Warningoder ein Ignore.

cxj
quelle
5

Wir verwenden IBM Rational Application Developer (RAD) und hatten das gleiche Problem.

Fehlermeldung:

Zugriffsbeschränkung: Der Typ 'JAXWSProperties' ist keine API (Einschränkung der erforderlichen Bibliothek 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Lösung:

Gehen Sie zum Java-Erstellungspfad und entfernen Sie auf der Registerkarte Bibliothek die JRE-Systembibliothek. Dann wieder Bibliothek hinzufügen -> JRE-Systembibliothek

Jonas_Hess
quelle
4

In Eclipse Mars.2 Release (4.5.2): Wählen
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
Sie JRE ... und drücken Sie Bearbeiten: Zum Arbeitsbereich wechseln JRE (jdk1.8.0_77)

Funktioniert bei mir.

Sven
quelle
3

Ich habe Eclipse JRE 8.112, nicht sicher, ob das wichtig ist, aber was ich getan habe, war Folgendes:

  1. Klicken Sie mit der rechten Maustaste auf meinen Projektordner
  2. ging zu Eigenschaften und klickte
  3. Klicken Sie auf den Ordner Java Build Path
  4. Einmal drinnen, war ich in der Bestellung und exportiere
  5. Ich habe die JRE-Systembibliothek überprüft [jre1.8.0_112]
  6. verschob es dann über die eine andere JRE-Systembibliothek dort (nicht sicher, ob dies wichtig ist)
  7. dann ok gedrückt

Dies löste mein Problem.

Quasar-Licht
quelle
2

Ich füge einfach e (fx) clipse in den Eclipse-Marktplatz ein. Leicht und einfach

jessie
quelle
1

Ich verwende Eclipse Neon 3. Ich wollte nur javafx.application.Application verwenden, also folgte ich der obigen Antwort von Christian Hujer und es funktionierte. Nur ein paar Tipps: Die Zugriffsregeln sind der import-Anweisung sehr ähnlich. Für mich waren die von mir hinzugefügten Zugriffsregeln "javafx / application / **". Ersetzen Sie einfach den Punkt in der Importanweisung durch einen Schrägstrich und das ist die Regel. Hoffentlich hilft das.

Tony S.
quelle
1

Ich hatte ein etwas anderes Problem. In der Bibliothek Projekt - Eigenschaften - Bibliotheken - JRE hatte ich die falsche JRE lib-Version. Entfernen und setzen Sie die eigentliche und voila - alle Access restriction...Warnungen sind weg.

Gangnus
quelle
1

Auch wenn es eine alte Frage ist, klicke ich in Eclipse einfach mit der rechten Maustaste auf den Ordner und die Eigenschaften von Src (Alt + Eingabetaste) und überprüfe, ob Ignore optional compile problemsder Fehler behoben ist.

Geben Sie hier die Bildbeschreibung ein

MrSimpleMind
quelle
0

Wenn jemand dieses Problem nur in Ihrem CI-Tool hat, während maven ausgeführt wird, bestand der Trick für mich darin, die Ausführungsumgebung in Ihrem explizit zu definieren MANIFEST.MF.

In meinem Fall habe ich dazu die folgende Zeile in meine OSGi-Bundle-Manifestdatei eingefügt:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Fernando Paz
quelle