Zugriffsbeschränkung für die Klasse aufgrund der Einschränkung der erforderlichen Bibliothek rt.jar?

824

Ich versuche, Java 1.4- Code zu kompilieren , der von IBMs WSDL2Java unter Java5 erstellt wurde, ohne die Stubs neu zu erstellen, und habe diesen Fehler in Eclipse festgestellt .
Ich gehe davon aus, dass die generierten Stubs nur kompiliert werden sollten, solange die Laufzeit jarsverfügbar ist (sie sind).

Access restriction: The type QName is not accessible due to restriction on required library C:\Program Files\Java\jdk1.5.0_16\jre\lib\rt.jar

Der vollständige Klassenname lautet javax.xml.namespace.QName

Was genau ist hier los? Ist dies ein Fall, in dem ich versuche, ein Schwein aus Wurst umzugestalten? Bin ich besser dran, die Stubs neu zu erstellen?

sal
quelle
1
Ich verstehe es nicht, warum kompilieren Sie es nicht einfach woanders und führen es in Ihrer Zielumgebung (also denke ich) 1.4 aus?
Tim Büthe
Die mögliche Zielumgebung ist jboss4.2 auf jdk5.
Sal
2
Über den "geschützten" Status: In StackOverflow sagt nichts "Danke" oder "Ich auch" als Gegenstimme;)
OscarRyz
6
Siehe die große Antwort mit den meisten Stimmen ... Ignorieren Sie 96% des Restes dieser Seite. Suche: "Nels Beckman", 1. Februar 10 um 4:09
wird
1
Was für mich funktioniert hat, war das Bearbeiten / Ändern der JRE-Systembibliothek von der Ausführungsumgebung (oder dem Standardbereich des Arbeitsbereichs) in die alternative JRE (ich habe dieselbe Java-Version ausgewählt). Sie müssen außerdem sicherstellen, dass (1) die Reihenfolge auf der Registerkarte Reihenfolge und Export korrekt ist , (2) die Konformitätsstufe in den Java Compiler- Einstellungen korrekt ist (wie bei der ausgewählten Java-Version).
ADTC

Antworten:

1884

Es gibt noch eine andere Lösung, die auch funktioniert.

  1. Gehen Sie zum Erstellungspfad Einstellungen in den Projekteigenschaften.
  2. Entfernen Sie die JRE-Systembibliothek
  3. Füge es wieder hinzu; Wählen Sie "Bibliothek hinzufügen" und wählen Sie die JRE-Systembibliothek . Die Standardeinstellung hat bei mir funktioniert.

Dies funktioniert, weil Sie mehrere Klassen in verschiedenen JAR-Dateien haben. Wenn Sie die JRE-Bibliothek entfernen und erneut hinzufügen, stehen die richtigen Klassen an erster Stelle. Wenn Sie eine grundlegende Lösung wünschen, stellen Sie sicher, dass Sie die JAR-Dateien mit denselben Klassen ausschließen.

Für mich habe ich: javax.xml.soap.SOAPPartin drei verschiedenen Gläsern: axis-saaj-1.4.jar, saaj-api-1.3.jarund diert.jar

Nels Beckman
quelle
1
Handelt es sich um einen Eclipse-Fehler oder umgehen wir versehentlich die Einschränkung (und verletzen die Lizenzbestimmungen)? Wenn es sich um einen Eclipse-Fehler handelt, wurde dann ein Fehler gemeldet?
docwhat
@Doctor Ich habe dies nie für einen Code verwendet, der besonders wichtig war, deshalb habe ich nicht weiter nachgeforscht ... Wenn Sie etwas herausfinden, lassen Sie es uns bitte wissen.
Nels Beckman
3
@ URL87 Wenn Sie mit der rechten Maustaste auf den Projektordner klicken, gehen Sie zu "Build Path ...", "Configure Build Path", "Libraries" (Registerkarte). Sie sollten "Add Library" als eine der Schaltflächen auf der rechten Seite sehen. Dies hat auch für mich einen Zauber gewirkt, ausgezeichnete Antwort
Alexei Blue
8
Die bessere Lösung unter neueren Versionen von Eclipse besteht nicht darin, die JRE-Systembibliothek zu löschen, sondern zur Registerkarte "Bestellen und Exportieren" zu wechseln und die JRE-Systembibliothek ganz nach unten zu verschieben (was beim Löschen und Hinzufügen effektiv der Fall ist, aber Sie tun es nicht muss nicht gelöscht und hinzugefügt werden, um dies zu tun).
user1676075
1
Dies ist 2018 und die Eclipse-Version ist 5.0. Dieser Fehler / dieses Problem besteht weiterhin. Vielen Dank @NelsBeckman. Ihre Antwort hat mir nach 3/4 des Jahrzehnts geholfen, seit sie veröffentlicht wurde.
Aravamudhan
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html hat am besten für mich funktioniert.

Unter Windows: Windows -> Einstellungen -> Java -> Compiler -> Fehler / Warnungen -> Veraltete und eingeschränkte API -> Verbotene Referenz (Zugriffsregeln): -> Wechsel zur Warnung

Unter Mac OS X / Linux: Eclipse -> Einstellungen -> Java -> Compiler -> Fehler / Warnungen -> Veraltete und eingeschränkte API -> Verbotene Referenz (Zugriffsregeln): -> Wechsel zur Warnung

scommab
quelle
62
Dies mag funktionieren, ist aber keine richtige Lösung. Sie müssen verstehen, warum die Zugriffsbeschränkung überhaupt bestand. Es wird auch alle zukünftigen Fälle davon verbergen, die wichtiger sein könnten!
Adrian Mouat
1
@AdrianMouat das ist so ziemlich irrelevant. Wenn ich möchte, dass es verschwindet, möchte ich, dass es verschwindet. Aber sicher - man soll nicht gegen nicht öffentliche APIs codieren, nein.
Stolsvik
3
@stolsvik - du hast mich verloren; Wollen Sie damit sagen, dass der Grund, warum das Problem besteht, irrelevant ist?
Adrian Mouat
1
Ich habe dieses Problem bei einer Methode. Ich stelle mir die Verwendung eines alternativen JDK vor (wie OpenJDK ist eine bessere Option). Das heißt zum einen, es könnte einmal cool sein. NICHT im Produktionscode. Nicht für einen fortwährenden Designaufwand. Ich kann dir nicht sagen, wie viele Manntage bei dieser Art von Cr-Hack verloren gehen.
wird
5
@AdrianMouat - macht Sinn. Ich würde es hassen, so etwas in einem Kernreaktor zu machen - Zu viel Wärme im Kontrollraum? Deaktivieren Sie daher alle Warnungen. Machen Sie am nächsten Tag große Schlagzeilen. : P
David Blaine
67

Ich habe das gleiche Problem getroffen. Ich habe die Antwort auf der Website gefunden: http://www.17ext.com .
Löschen Sie zunächst die JRE-Systembibliotheken. Importieren Sie anschließend die JRE-Systembibliotheken erneut.

Ich weiß nicht warum. Ich hoffe, es kann Ihnen helfen, obwohl es mein Problem behoben hat.

Sanwanxian
quelle
10
Huh, anscheinend haben Sie diese Frage einige Monate zuvor genauso beantwortet wie ich. Ich bin mir nicht sicher, warum ich deine Antwort damals nicht gesehen habe ...
Nels Beckman
34

Ich vermute, dass Sie versuchen, eine Standardklasse, die mit Java 5 geliefert wird, durch eine in einer Bibliothek zu ersetzen, die Sie haben.

Dies ist gemäß den Bestimmungen der Lizenzvereinbarung nicht zulässig, AFAIK wurde jedoch erst mit Java 5 durchgesetzt.

Ich habe dies schon mit QName gesehen und es "behoben", indem ich die Klasse aus dem Glas entfernt habe, das ich hatte.

BEARBEITEN Sie http://www.manpagez.com/man/1/java/ Notizen für die Option "-Xbootclasspath:"

"Anwendungen, die diese Option zum Überschreiben einer Klasse in rt.jar verwenden, sollten nicht bereitgestellt werden, da dies gegen die Binärcodelizenz für Java 2 Runtime Environment verstoßen würde."

Die http://www.idt.mdh.se/rc/sumo/aJile/Uppackat/jre/LICENSE

"Java-Technologieeinschränkungen. Sie dürfen die Java-Plattformschnittstelle (" JPI ", identifiziert als Klassen, die im" Java "-Paket oder in Unterpaketen des" Java "-Pakets enthalten sind) nicht ändern, indem Sie zusätzliche Klassen im JPI erstellen oder auf andere Weise die Hinzufügen oder Ändern der Klassen im JPI. Für den Fall, dass Sie eine zusätzliche Klasse und zugehörige APIs erstellen, die (i) die Funktionalität der Java-Plattform erweitern und (ii) Softwareentwicklern von Drittanbietern zur Verfügung stehen Um zusätzliche Software zu entwickeln, die eine solche zusätzliche API aufruft, müssen Sie unverzüglich eine genaue Spezifikation für eine solche API veröffentlichen, die von allen Entwicklern kostenlos verwendet werden kann. Sie dürfen keine zusätzlichen Klassen, Schnittstellen erstellen oder Ihre Lizenznehmer zum Erstellen autorisieren.oder Unterpakete, die in irgendeiner Weise als "Java", "Javax", "Sonne" oder eine ähnliche Konvention identifiziert werden, wie sie von Sun in einer Namenskonventionsbezeichnung angegeben wird. "

Peter Lawrey
quelle
2
das ist es. In einem der Gläser im Pfad befand sich die Klasse QName. finden . -name "* .jar" -print -exec entpacken -t {} \; | grep "QName" hat es gefunden.
Sal
1
Könnten Sie einen Hinweis darauf geben, dass Klassen, die mit Java geliefert werden, nicht ersetzt werden dürfen? Alles, was ich in der Lizenzvereinbarung fand, waren Einschränkungen in Bezug auf die Verbreitung von Java selbst, nicht von Java-Programmen, aber ich habe nicht lange gesucht.
Adrian Mouat
25

Ich habe auch diesen Fehler erhalten, aber mein Projekt wird auf der Befehlszeile mit Maven und dem Tycho- Compiler erstellt (es ist eine Reihe von OSGi-Plugins). Nachdem ich viele Leute durchsucht hatte, die das gleiche Problem hatten, es aber in Eclipse und nicht in der Befehlszeile behoben hatten, fand ich im Tycho-Entwicklerforum eine Nachricht , die meine Frage beantwortete und die Konfiguration in verwendete pom.xml, um die Compiler-Warnung bezüglich der Zugriffsbeschränkung zu ignorieren:

<plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>tycho-compiler-plugin</artifactId>
    <version>${tycho.version}</version>
    <configuration>
        <compilerArgument>-warn:+discouraged,forbidden</compilerArgument>
    </configuration>
</plugin>

Weitere Informationen finden Sie in den Tycho-FAQ . Ich brauchte AGES, um das herauszufinden, und dachte mir, ich würde jedem anderen helfen, der versucht, diese Fehler bei der Zugriffsbeschränkung über die Befehlszeile zu beheben, indem ich diese Antwort poste.

Dawngerpony
quelle
13
  • Wechseln Sie in den Projekteigenschaften zu den Einstellungen für den Erstellungspfad. Windows -> Preferences -> Java Compiler
  • Entfernen Sie die JRE-Systembibliothek
  • Fügen Sie eine weitere JRE mit einer "perfekten Übereinstimmung" hinzu
  • Reinigen und bauen Sie Ihr Projekt erneut. Es hat bei mir funktioniert.
Mayur
quelle
13

Ich hatte gerade auch dieses Problem. Anscheinend hatte ich die JRE in meinem Erstellungspfad auf 1,5 anstatt auf 1,6 gesetzt.

Dorus
quelle
1
Gleiches Problem hier. In meinem Fall wird Maven verwendet, der standardmäßig 1,5 ist, wenn er nicht angegeben ist.
Greg Haskins
Denken Sie daran, dies in Ihr POM einzufügen, damit es sich bei der Aktualisierung nicht ändert. <Eigenschaften> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </ Eigenschaften>
Philip Rego
8

Zusätzlich zu Nels Beckmans Lösung habe ich die folgenden Tipps:

Unter Build-Pfad konfigurieren musste ich die Reihenfolge meiner Einträge unter Reihenfolge und Export ändern .

Außerdem musste ich als Eclipse PDE-Entwickler die Reihenfolge meiner Abhängigkeiten in meinem MANIFEST.MFändern und das problematische Paket als erstes in die Liste aufnehmen.

Durch das Spielen mit diesen Wählscheiben und das Ausführen von Project> Clean dazwischen konnte ich diese Warnungen beheben.

Modulitos
quelle
8

für mich so löse ich es:

  • 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
Meins war bereits auf 1,7 ... 79 eingestellt, also geriet ich in Panik. Aber ich habe es einfach erneut ausgewählt, auf Übernehmen geklickt und der Fehler ist verschwunden. Wütend.
Marvo
Beeindruckend. Dies hat auch hier geholfen - der Wechsel von einer "Ausführungsumgebung" zu einer "alternativen JRE". Wenn jemand eine logische Erklärung dafür hat .. (hier trat sie auf, nachdem der Projekthahn Java von 1.5 (5.0 in der Konfigurationsdatei .settings) auf 1.8 geändert wurde. Der Wechsel von Fehler zu Warnung in globalen Einstellungen (siehe andere Antwort) war nicht der Fall Hilfe: immer noch Fehler. Es geht um alte
Sonnenklassen, die
6

Entschuldigung für die Aktualisierung eines alten POST. Ich habe das gemeldete Problem erhalten und es wie unten beschrieben gelöst.

Angenommen, Sie verwenden das Eclipse + m2e-Maven-Plugin. Wenn Sie diesen Zugriffsbeschränkungsfehler erhalten, klicken Sie mit der rechten Maustaste auf das Projekt / Modul, in dem Sie den Fehler haben -> Eigenschaften -> Erstellungspfad -> Bibliothek -> JDK ersetzen / JRE zu demjenigen, der im Eclipse-Arbeitsbereich verwendet wird.

Ich habe die obigen Schritte ausgeführt und das Problem ist behoben.

Arun B Chandrasekaran
quelle
Fair genug, aber Sie haben im Grunde den Wortlaut der akzeptierten Antwort von Nels Beckman wiederholt.
Steven Wolfe
5

Wenn Sie sicher sind, dass Sie auf eine bestimmte Klasse zugreifen können, kann dies bedeuten, dass Sie Ihrem Projekt mehrere Jars hinzugefügt haben, die Klassen mit identischen Namen (oder Pfaden), aber unterschiedlichem Inhalt enthalten und sich gegenseitig überschatten (normalerweise eine alte Gewohnheit) Build Jar enthält eine integrierte ältere Version einer Bibliothek eines Drittanbieters.

Zum Beispiel, wenn Sie eine JAR-Implementierung hinzufügen:

a.b.c.d1
a.b.c.d2

aber auch eine ältere Version, die nur Folgendes implementiert:

a.b.c.d1
(d2 is missing altogether or has restricted access)

Im Code-Editor funktioniert alles einwandfrei, schlägt jedoch während der Kompilierung fehl, wenn die "alte" Bibliothek die neue überschattet - d2 stellt sich plötzlich als "fehlend oder unzugänglich" heraus, selbst wenn sie vorhanden ist.

Die Lösung besteht darin, die Reihenfolge der Bibliotheken zur Kompilierungszeit zu überprüfen und sicherzustellen, dass die Bibliothek mit der korrekten Implementierung an erster Stelle steht.

Herr Napik
quelle
4

Wechseln Sie in den Projekteigenschaften zum Java-Erstellungspfad. Entfernen Sie die vorhandene JRE-Systembibliothek und fügen Sie sie erneut hinzu, dh Bibliothek hinzufügen -> JRE-Bibliothek - wählen Sie jre ---> Fertig stellen. Zuletzt die Registerkarte Bestellung und Export auswählen, JRE Lib auswählen und nach oben gehen. Das ist es.

Vijay Bhatt
quelle
3

Ändern Sie einfach die Reihenfolge der Erstellungspfadbibliotheken Ihres Projekts. Klicken Sie mit der rechten Maustaste auf Projekt> Erstellungspfad> Erstellungspfad konfigurieren> Wählen Sie Reihenfolge und Export (Registerkarte)> Ändern Sie die Reihenfolge der Einträge. Ich hoffe, dass das Verschieben der "JRE-Systembibliothek" nach unten funktioniert. Es hat bei mir so funktioniert. Leicht und einfach .... !!!

Samitha Chathuranga
quelle
3

In meinem Fall gab es eine Nichtübereinstimmung zwischen der Build-Pfad-JRE und der installierten JRE in der Ausführungsumgebung. Ich bin zu Projekt> Eigenschaften> Java-Compiler gewechselt. Unten war eine Warnmeldung.

Ich klickte auf die Links 'Installierte JRE', 'Ausführungsumgebung', 'Java-Erstellungspfad' und änderte die JDK-Version auf 1.7, und die Warnung verschwand.

Soumyajit Swain
quelle
0

Das Hinzufügen eines richtigen JRE-Systems über den Erstellungspfad ist die Lösung, aber Ihre Eclipse weist möglicherweise immer noch den Fehler auf. Um dies zu lösen, gehen Sie zu Java Build Path -> Order and Export und verschieben Sie Ihre JRE-Systembibliothek nach oben. Dies hat mein Problem gelöst.

Abhishek Soni
quelle