Bei Verwendung von JavaFX in JRE 8 wird der Fehler "Zugriffsbeschränkung" angezeigt

82

Beim Versuch, Javafx-bezogene Klassen in meinem neuen Java 8-Projekt zu verwenden, wird durch Eclipse ein Zugriffsbeschränkungsfehler angezeigt. Bisher war die einzige "Lösung", die ich finden konnte, Eclipse anzuweisen, die Zugriffsbeschränkung zu ignorieren, aber damit bin ich nicht zufrieden. Ein Beispiel für den Fehler:

Access restriction: The type Pane is not accessible due to 
restriction on required library C:\Program Files\Java\jre8_0\lib\ext\jfxrt.jar

Ich verwende Eclipse Kepler mit dem Eclipse JDT-Patch für Java 8.

Dies scheint ein Problem zu sein, das damit zusammenhängt, dass JavaFX nicht Teil der JavaSE-Ausführungsumgebung ist.

Ich bin jetzt schwer verwirrt, da laut http://en.wikipedia.org/wiki/JavaFX JavaFX ein Teil von JavaSE ist. Ist es möglich, dass Eclipse nicht erkennt, dass es Teil von javaSE ist?

Lexxicon
quelle
3
Sie könnten richtig sein, seine vorgeschlagene Lösung hat zur Hälfte für mich funktioniert. Mit der Hälfte der Arbeit meine ich, dass wenn ich die JRE mit dem 'workspace default' jre (jdk1.8.0) hinzufüge, es funktioniert, aber wenn ich die 'Ausführungsumgebung' JavaSE-1.8 (jdk1.8.0) verwende, habe ich immer noch den Fehler.
Lexxicon

Antworten:

66

Aus Sicht von Eclipse ist der Fehler völlig korrekt, da JavaFX aus dem Erweiterungsklassenpfad stammt und nicht auf ALLEN Java8-VMs (z. B. IBM!) Verfügbar ist.

Wie beschrieben, können Sie diese Warnungen unterdrücken, indem Sie Zugriffsregeln oder IMHO hinzufügen. Die beste Lösung besteht darin, e (fx) clipse zu installieren, das dies automatisch für Sie erledigt und darüber hinaus sogar Tools für JavaFX CSS und FXML bereitstellt.

Sie können ein All-in-One-Paket unter http://efxclipse.bestsolution.at/install.html herunterladen

Tomsontom
quelle
1
Das macht Sinn, ich wusste nicht, dass andere VMs JFX nicht unterstützen. Ich denke, meine ursprüngliche Frage ist nicht zu beantworten, da sie kein Fehler ist. Leider kann ich Ihren Lösungsvorschlag aufgrund politischer Maßnahmen nicht nutzen.
Lexxicon
3
Sie wissen, dass dies alles Eclipse-Projekte sind - der All-in-One-Download ist einfach eine nette Funktion, mit der Sie schnell loslegen können. Sie können auch von Eclipse.org installieren, wenn Sie möchten. Siehe eclipse.org/efxclipse/install.html
Tomsontom
Ich bin mir bewusst, aber aufgrund interner Einschränkungen darf ich das nicht verwenden. Wenn Sie jedoch der Meinung sind, dass dies die beste Lösung für dieses Problem ist, werde ich Ihre Antwort als richtig markieren.
Lexxicon
5
Nur etwas nebenbei: Wenn Sie bei der Arbeit nicht einmal Eclipse-Plugins installieren können, stimmt definitiv etwas nicht. Die Beschränkung der Entwickler auf ein bestimmtes Toolset entspricht der Beschränkung seiner Fähigkeiten und seiner Arbeitsqualität.
Spezialisiert
133

Ich werde hier noch eine Antwort hinzufügen, nur um das zu liefern, was ich für den minimalsten Ansatz halte. In meinem Eclipse-Setup ist e (fx) clipse installiert, das eine Lösung dafür sowie viele nützliche Entwicklungsfunktionen bietet, die Sie mit ziemlicher Sicherheit benötigen, wenn Sie JavaFX-Anwendungen schreiben. Dies ist wahrscheinlich der praktischste Ansatz. Wenn Sie dieses Plugin aus irgendeinem Grund nicht möchten, wird das Problem mit der in dieser Antwort beschriebenen Lösung mit der geringsten Anzahl anderer Nebenwirkungen behoben.

Wie in anderen Antworten ausgeführt, erlaubt Eclipse standardmäßig den Zugriff auf Klassen in JAR-Dateien im Verzeichnis jre / lib / ext, da nicht garantiert wird, dass diese auf allen Java-Plattformen vorhanden sind. Wenn Sie eine JavaFX 8-Anwendung schreiben, gehen Sie davon aus, dass Sie sich auf einer Plattform befinden, auf der jfxrt.jar am Speicherort lib / ext verfügbar ist.

Die minimale Lösung hierfür besteht darin, den Zugriff auf die Klassen in dieser JAR-Datei (und nur in dieser JAR-Datei) zuzulassen. Klicken Sie dazu mit der rechten Maustaste auf das Projekt und rufen Sie das Dialogfeld Projekteigenschaften auf. Wählen Sie im linken Bereich "Pfad erstellen" und dann die Registerkarte "Bibliotheken". Sie sehen einen Eintrag "JRE System Library". Erweitern Sie diesen Eintrag, und Sie sehen einen Untereintrag "Zugriffsregeln":

Geben Sie hier die Bildbeschreibung ein

Wählen Sie den Eintrag "Zugriffsregeln" und klicken Sie auf "Bearbeiten". Klicken Sie auf "Hinzufügen".

Geben Sie hier die Bildbeschreibung ein

Wählen Sie unter "Auflösung" "Zugänglich" und geben Sie unter "Regelmuster" Folgendes ein javafx/**:

Geben Sie hier die Bildbeschreibung ein

Klicken Sie auf OK, um alle Dialoge zu schließen.

Diese Einstellung ermöglicht den Zugriff auf alle Klassen in allen beginnenden Paketen javafx., behält jedoch die Regel im ext-Ordner für alle anderen Klassen bei und ist in diesem Sinne "minimal".

Auch hier möchten Sie wahrscheinlich das e (fx) clipse-Plugin installieren, aber meines Wissens ist dies die Lösung mit den geringsten Nebenwirkungen auf Ihr Eclipse-Setup.

James_D
quelle
Gibt es auch eine Möglichkeit, dies vom Pom in Maven aus zu konfigurieren?
RobAu
1
Klare Erklärung
xploreraj
@RobAu Sehen Sie hier für eine Maven-Problemumgehung: stackoverflow.com/questions/32565193/…
Stefan
1
Einfach und perfekt !! :)
Sanket Patel
Ich sehe in einer Zeile Ihrer Antwort, dass e(fx)clipse is providing many useful development features . Ein neues Element, SashPanedas einige SliderPaneProbleme behebt , wurde in e (fx) clipse 2.6 hinzugefügt, aber ich kann es wirklich nicht verstehen. Gibt es Klassen, die wir aus e (fx) clipse verwenden können? Ich kann nichts Ähnliches finden. Ich meine, ich kann nicht auf eine Klasse zugreifen oder etwas Nützliches finden, das ich im Programm verwenden kann, als Bibliothek meine ich. Korrigieren Sie mich, weil ich weiß, dass ich hier irgendwo falsch
liege
19

Ich habe das Problem behoben, indem ich das JDK entfernt und in den Erstellungspfad eingelesen habe. Fragen Sie mich aber nicht, warum das funktioniert.

Strahl
quelle
1
Ich glaube, der Grund, warum es für Sie möglicherweise funktioniert hat, ist, dass beim Hinzufügen einer JRE-Bibliothek zum Erstellungspfad (Eclipse) standardmäßig JRE verwendet wird, anstatt eine Ausführungsumgebung zu verwenden. Da JFX nicht Teil von JavaSE zu sein scheint, der von mir ausgewählten Umgebung, habe ich den Fehler beibehalten. Wenn Sie nur den Standardarbeitsbereich jre hinzufügen, gelten diese Einschränkungen nicht mehr.
Lexxicon
11

Der einfache Weg ist die Installation von e (fx) clipse - einem Plugin für Eclipse zur Unterstützung von JavaFX:

  1. Wählen Sie Hilfe -> Neue Software installieren
  2. Klicken Sie auf die Schaltfläche Hinzufügen, um die folgende Site hinzuzufügen:
  3. OK klicken
  4. Wählen Sie unter "Arbeiten mit" die kürzlich hinzugefügte Site "efxclipse" aus.
  5. Aktivieren Sie das Kontrollkästchen "e (fx) clipse - install", um alle Komponenten dieser Auswahl zu installieren
  6. Fahren Sie mit den nächsten Schritten fort, um die Installation abzuschließen
  7. Starten Sie Ihre Eclipse neu. Wenn die JavaFX-Bibliothek immer noch nicht erkannt wird, starten Sie sie erneut.

Originalinformationen finden Sie hier: https://www.eclipse.org/efxclipse/install.html#for-the-lazy

Thach Van
quelle
Danke;) Einfach und leicht
J. Adam
Es funktioniert, danke! Gerade die Standort-URL aktualisiert auf: download.eclipse.org/efxclipse/updates-released/3.6.0/site
Crozeta
7

Ich habe dieses Problem durch sorgfältige Verwendung des Erstellungspfads des Eclipse-Projekts behoben.

  • Rufen Sie die Eigenschaften Ihres Anwendungsprojekts auf und wählen Sie den Abschnitt "Erstellungspfad".
  • Fügen Sie die Datei jre8_0 \ lib \ ext \ jfxrt.jar als "externe JAR-Datei" auf der Registerkarte "Bibliotheken" hinzu.
  • Stellen Sie auf der Registerkarte "Bestellen / Exportieren" sicher, dass diese jfxrt.jar an erster Stelle in der Liste steht.

Dadurch sieht Eclipse die Datei jfxrt.jar nur als reguläre JAR-Datei eines Drittanbieters. Die Reihenfolge ist wichtig, damit dies Vorrang vor dem Eintrag in der JRE-Systembibliothek hat. Es ist dieselbe tatsächliche JAR-Datei, aber Eclipse sieht sie anders.

Möglicherweise möchten Sie die Ausführungskonfigurationen ändern, damit nicht die exportierte Version von jfxrt.jar verwendet wird. In der Praxis macht dies jedoch keinen Unterschied.

Ich habe dies mit Java8 und Eclipse Luna gemacht. Aber das Prinzip würde ich sicher mit jeder Kombination von Java und Eclipse arbeiten.

Calanais
quelle
5
  • Gehen Sie zum Erstellungspfad des aktuellen Projekts

unter Bibliotheken

  • Wählen Sie die " JRE- Systembibliothek [jdk1.8xxx]".
  • Klicken Sie auf Bearbeiten
  • und wählen Sie entweder "Arbeitsbereich Standard-JRE (jdk1.8xx)" ODER Alternative JRE
  • Klicken Sie auf Fertig stellen
  • OK klicken

Geben Sie hier die Bildbeschreibung ein

Hinweis: Stellen Sie sicher, dass in Eclipse / Preferences (NICHT im Projekt) / Java / Installed JRE das JDK auf den JDK-Ordner verweist und nicht auf JRE C: \ Programme \ Java \ jdk1.8.0_74

Geben Sie hier die Bildbeschreibung ein

Usertest
quelle
4

Ich weiß, dass dies bereits beantwortet wurde, aber ich finde die vorgeschlagenen Lösungen klobig.

  1. Ich möchte kein Plugin installieren, um zu vermeiden, was ich für einen ungültigen Fehler halte.
  2. Das Hinzufügen von jfxrt.jar als externes JAR funktioniert, ist jedoch eine schlechte Idee, wenn Sie einen Export planen, da jfxrt.jar ebenfalls exportiert wird. Wahrscheinlich nicht was du willst.

Andere Option

In der Version 'Mars' (und möglicherweise in früheren Versionen) können Sie Fehler bei Zugriffsbeschränkungen deaktivieren. Unter

Java-> Compiler-> Fehler- / Warnansicht

und

"Veraltete und eingeschränkte API"

Sie können "Verbotene Referenz (Zugriffsregel)" so einstellen, dass sie ignoriert wird.

Geben Sie hier die Bildbeschreibung ein


quelle
4

Folge diesen Schritten:

  1. Fügen Sie die Datei jfxrt.jar (aus Ihrem Installationsordner) als "Externe JAR-Datei" auf der Registerkarte "Bibliotheken" hinzu.

  2. Stellen Sie auf der Registerkarte "Bestellen / Exportieren" sicher, dass diese jfxrt.jar an erster Stelle in der Liste steht.

Das hat bei mir funktioniert.

Natile
quelle
2

Wie James_D bereits vorgeschlagen hat, habe ich meiner Klassenpfaddatei Zugriffsregeln hinzugefügt. Ich habe das e (fx) clipse-Plugin vorerst deinstalliert, da es einen CSS-Validierungsfehler aufweist (siehe Deaktivieren der CSS-Warnung "Unbekannte Eigenschaft" in Eclipse Mars? ).

Hier ist mein Eintrag in der Klassenpfaddatei für den JRE-Container:

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.‌​launcher.StandardVMType/JavaSE-1.8">
    <attributes>
        <attribute name="maven.pomderived" value="true"/>
    </attributes> 
    <accessrules>
        <accessrule kind="accessible" pattern="javafx/**"/>
        <accessrule kind="accessible" pattern="com/sun/javafx/**"/>
    </accessrules>
</classpathentry>
Stefan
quelle
2

Ich hatte das gleiche Problem. Ich habe die Lösung von James_D verwendet, aber seine genaue Lösung hat bei mir nicht funktioniert. Aber mit **/javafx/**anstatt javafx/**das Problem für mich zu lösen. Hoffentlich hilft das.

PS: Ich würde dies als Kommentar unter James_Ds Lösung posten, aber ich habe mich gerade registriert und hatte nicht genug "Ruf", um dies zu tun.

anand
quelle
0

Schritt 1: Navigieren Sie zu Ihrer Datei jfxrt.jar. C: \ Programme \ Java \ jre1.8.0_111 \ lib \ ext

Schritt 2 Kopieren Sie die Datei jfxrt.jar

Schritt 3: Gehen Sie zu Eclipse und erstellen Sie einen neuen Ordner wie folgt: [Erstellen des Ordnernamens lib, um unsere Datei jfxrt.jar abzulegen] [2] [2]: https://i.stack.imgur.com/YsJ5S.png

Schritt 4: Wählen Sie den Ordner lib aus und drücken Sie STRG + V, um die Datei jfxrt.jar einzufügen. [Fügen Sie Ihre Datei jfxrt.jar ein] [1] [1]: https://i.stack.imgur.com/Ljogu.png

Schritt 5: Klicken Sie mit der rechten Maustaste auf jfxrt.jar und legen Sie den Erstellungspfad fest.

Mohd Jahid
quelle