Restriction d'accès à la classe en raison de la restriction sur la bibliothèque requise rt.jar?

824

J'essaie de compiler le code Java 1.4 qui a été créé par WSDL2Java d' IBM sur Java5 sans recréer les stubs et j'ai vu cette erreur dans Eclipse . Je suis dans l'hypothèse que les stubs générés devraient simplement se compiler tant que le runtime est disponible (ils le sont).
jars

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

Le nom complet de la classe est javax.xml.namespace.QName

Que se passe-t-il exactement ici? Est-ce un cas où j'essaie de refactoriser un porc de saucisse? Suis-je mieux de recréer les talons?

sal
la source
1
Je ne comprends pas, pourquoi ne pas simplement le compiler ailleurs et l'exécuter dans votre environnement 1.4 ciblé (donc je suppose)?
Tim Büthe
L'environnement cible éventuel est jboss4.2 sur jdk5.
sal
2
À propos du statut "protégé": Dans StackOverflow, rien ne dit "Merci" ou "moi aussi" en tant que vote positif;)
OscarRyz
6
Voir la grande réponse la plus votée ... Ignorez 96% du reste de cette page. Recherche: "Nels Beckman", 1 '10 février à 04h09
sera
1
Ce qui a fonctionné pour moi a été de modifier / changer la bibliothèque système JRE de l' environnement d'exécution (ou de Workspace par défaut) en JRE alternatif (j'ai sélectionné la même version Java). Vous devez également garantir (1) un ordre correct dans l' onglet Ordre et exportation , (2) un niveau de conformité correct dans les paramètres du compilateur Java (identique à la version Java sélectionnée).
ADTC

Réponses:

1884

Il existe une autre solution qui fonctionne également.

  1. Accédez aux paramètres Build Path dans les propriétés du projet.
  2. Supprimer la bibliothèque système JRE
  3. Ajoutez-le en arrière; Sélectionnez "Ajouter une bibliothèque" et sélectionnez la bibliothèque système JRE . La valeur par défaut a fonctionné pour moi.

Cela fonctionne car vous avez plusieurs classes dans différents fichiers jar. En supprimant et en ajoutant à nouveau la bibliothèque JRE, les bonnes classes seront les premières. Si vous voulez une solution fondamentale, assurez-vous d'exclure les fichiers jar avec les mêmes classes.

Pour moi , j'ai: javax.xml.soap.SOAPPartdans trois bocaux différents: axis-saaj-1.4.jar, saaj-api-1.3.jaretrt.jar

Nels Beckman
la source
1
S'agit-il d'un bogue Eclipse ou est-ce que nous contournons accidentellement la restriction (et violons les termes de la licence)? S'il s'agit d'un bug Eclipse, y a-t-il un bug déposé?
docwhat
@Doctor Je n'ai jamais utilisé ceci pour un code particulièrement important, donc je n'ai pas enquêté plus loin ... Si vous trouvez quelque chose, faites-le nous savoir.
Nels Beckman
3
@ URL87 Si vous faites un clic droit sur le dossier du projet, allez dans "Build Path ...", "Configure Build Path", "Libraries" (tab), vous devriez voir "Add Library" comme l'un des boutons à droite. Cela a également fait un charme pour moi, excellente réponse
Alexei Blue
8
La meilleure solution dans les versions récentes d'Eclipse n'est pas de supprimer la bibliothèque système JRE, mais d'aller dans l'onglet "Commander et exporter" et de déplacer simplement la bibliothèque système JRE vers le bas (ce qui est effectivement ce que la suppression et l'ajout font, mais vous ne pas besoin de supprimer et d'ajouter pour le faire).
user1676075
1
Ceci est 2018 et la version éclipse est 5.0. Ce bogue / problème existe toujours. Merci beaucoup @NelsBeckman. Votre réponse m'a aidé après 3/4 de décennie depuis sa publication.
Aravamudhan
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html a fonctionné le mieux pour moi.

Sous Windows: Windows -> Préférences -> Java -> Compilateur -> Erreurs / Avertissements -> API obsolète et restreinte -> Référence interdite (règles d'accès): -> passer à l'avertissement

Sous Mac OS X / Linux: Eclipse -> Préférences -> Java -> Compilateur -> Erreurs / Avertissements -> API obsolète et restreinte -> Référence interdite (règles d'accès): -> passer à l'avertissement

scommab
la source
62
Cela pourrait fonctionner, mais ce n'est pas une bonne solution. Vous devez comprendre pourquoi la restriction d'accès existait en premier lieu. Il masquera également tous les futurs cas de cela, ce qui peut être plus important!
Adrian Mouat
1
@AdrianMouat qui est à peu près hors de propos. Si je veux que ça disparaisse, je veux que ça disparaisse. Mais sûrement - il ne faut pas coder contre des API non publiques, non.
stolsvik
3
@stolsvik - vous m'avez perdu; dites-vous que la raison pour laquelle le problème existe n'est pas pertinent?
Adrian Mouat
1
J'ai ce problème sur UNE méthode. J'imagine l'utilisation d'un JDK alternatif (comme OpenJDK est une meilleure option). Cela dit, pour une chose, cela pourrait être cool une fois. PAS dans le code de production. Pas pour un effort de conception continu. Je ne peux pas vous dire combien de jours-homme se perdent sur ce genre de piratage.
sera
5
@AdrianMouat - est logique. Je détesterais faire quelque chose comme ça dans un réacteur nucléaire - Trop de chaleur dans la salle de contrôle? Désactivez donc tous les avertissements. Faites les gros titres le lendemain. : P
david blaine
67

J'ai rencontré le même problème. J'ai trouvé la réponse sur le site Web: http://www.17ext.com .
Tout d'abord, supprimez les bibliothèques système JRE. Ensuite, importez à nouveau les bibliothèques système JRE.

Je ne sais pas pourquoi, mais cela a résolu mon problème, j'espère que cela peut vous aider.

sanwanxian
la source
10
Huh, apparemment vous avez répondu à cette question de la même manière que moi, plusieurs mois auparavant. Je ne sais pas pourquoi je n'ai pas vu votre réponse à l'époque ...
Nels Beckman
34

Je suppose que vous essayez de remplacer une classe standard livrée avec Java 5 par une dans une bibliothèque que vous avez.

Cela n'est pas autorisé par les termes du contrat de licence, mais AFAIK, il n'a pas été appliqué avant Java 5.

J'ai déjà vu cela avec QName et je l'ai "corrigé" en supprimant la classe du pot que j'avais.

MODIFIER http://www.manpagez.com/man/1/java/ notes pour l'option "-Xbootclasspath:"

"Les applications qui utilisent cette option dans le but de remplacer une classe dans rt.jar ne doivent pas être déployées car cela contreviendrait à la licence de code binaire Java 2 Runtime Environment."

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

"Restrictions de la technologie Java. Vous ne pouvez pas modifier l'interface de la plate-forme Java (" JPI ", identifiée en tant que classes contenues dans le package" java "ou tout sous-package du package" java "), en créant des classes supplémentaires dans le JPI ou en provoquant autrement la ajout ou modification des classes dans le JPI. Dans le cas où vous créez une classe supplémentaire et des API associées qui (i) étendent les fonctionnalités de la plate-forme Java et (ii) sont exposées à des développeurs de logiciels tiers pour dans le but de développer un logiciel supplémentaire qui invoque une telle API supplémentaire, vous devez publier rapidement et largement une spécification précise de cette API pour une utilisation gratuite par tous les développeurs. Vous ne pouvez pas créer ou autoriser vos titulaires de licence à créer des classes, interfaces supplémentaires,ou des sous-packages qui sont identifiés de quelque manière que ce soit comme "java", "javax", "sun" ou une convention similaire, comme spécifié par Sun dans toute désignation de convention de dénomination. "

Peter Lawrey
la source
2
c'est ça. l'un des pots du chemin contenait la classe QName. trouver . -name "* .jar" -print -exec unzip -t {} \; | grep "QName" l'a trouvé.
sal
1
Pourriez-vous fournir une référence sur le fait de ne pas être autorisé à remplacer les classes livrées avec Java? Tout ce que j'ai trouvé dans l'accord de licence était des restrictions liées à la distribution de Java lui-même, pas des programmes Java, mais je n'ai pas cherché très longtemps.
Adrian Mouat
25

J'ai également eu cette erreur, mais mon projet est construit sur la ligne de commande en utilisant Maven et le compilateur tycho (c'est un ensemble de plugins OSGi). Après avoir passé au crible des personnes ayant le même problème mais le corrigeant dans Eclipse plutôt que sur la ligne de commande, j'ai trouvé un message sur le forum des développeurs Tycho qui a répondu à ma question, en utilisant la configuration dans pom.xmlpour ignorer l'avertissement du compilateur sur la restriction d'accès:

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

Plus d'informations peuvent être trouvées dans la FAQ Tycho . Cela m'a pris AGES pour travailler, donc je me suis dit que j'allais aider toute autre personne essayant de corriger ces erreurs de restriction d'accès à partir de la ligne de commande en publiant cette réponse.

Dawngerpony
la source
13
  • Accédez aux paramètres Build Path dans les propriétés du projet. Windows -> Preferences -> Java Compiler
  • Supprimer la bibliothèque système JRE
  • Ajoutez un autre JRE avec un "match parfait"
  • nettoyer et reconstruire votre projet. Ça a marché pour moi.
Mayur
la source
13

J'ai juste eu ce problème aussi. Apparemment, j'avais mis le JRE à 1,5 au lieu de 1,6 dans mon chemin de construction.

Dorus
la source
1
Même problème ici. Dans mon cas, en utilisant Maven qui est par défaut à 1,5 si non spécifié.
Greg Haskins
N'oubliez pas de mettre cela dans votre POM afin qu'il ne change pas lors de la mise à jour. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties>
Philip Rego
8

En plus de la solution de Nels Beckman , j'ai les conseils suivants:

Sous Configure Build Path , j'ai dû réorganiser l'ordre de mes entrées sous Order and Export .

De plus, en tant que développeur Eclipse PDE, j'avais besoin de réorganiser l'ordre de mes dépendances dans my MANIFEST.MF, en ajoutant le package problématique en premier sur la liste.

En jouant avec ces cadrans, tout en exécutant Project> Clean entre les deux, j'ai pu résoudre ces avertissements.

modulitos
la source
8

pour moi comment je le résous:

  • aller au chemin de construction du projet en cours

sous Bibliothèques

  • sélectionnez la " Bibliothèque système JRE [jdk1.8xxx]"
  • cliquez sur modifier
  • et sélectionnez "JRE par défaut Workspace (jdk1.8xx)" OU JRE alternatif
  • Cliquez sur terminer
  • Cliquez sur OK

entrez la description de l'image ici

Remarque: assurez-vous que dans Eclipse / Préférences (PAS le projet) / Java / Installé JRE, que le jdk pointe vers le dossier JDK et non vers le JRE C: \ Program Files \ Java \ jdk1.8.0_74

entrez la description de l'image ici

usertest
la source
Le mien était déjà réglé sur 1,7 ... 79, alors je paniquais. Mais je l'ai simplement sélectionné à nouveau, j'ai cliqué sur Appliquer et l'erreur a disparu. Ouf.
Marvo
Sensationnel. Cela a également aidé ici - passer d'un «environnement d'exécution» à un «JRE alternatif». Si quelqu'un a une explication logique à cela .. (ici, cela s'est produit après avoir changé le Java du projet-robinet de 1.5 (5.0 dans le fichier de configuration .settings) à 1.8. help: still errors. Il s'agit des anciennes classes de soleil que nous utilisons à partir du package com.sun.image.codec. *)
hyphan
6

Désolé d'avoir mis à jour un ancien POST. J'ai eu le problème signalé et je l'ai résolu comme indiqué ci-dessous.

En supposant que vous utilisez le plugin Eclipse + m2e maven, si vous obtenez cette erreur de restriction d'accès, cliquez avec le bouton droit sur le projet / module dans lequel vous avez l'erreur -> Propriétés -> Chemin de génération -> Bibliothèque -> Remplacer JDK / JRE à celui qui est utilisé dans l'espace de travail Eclipse.

J'ai suivi les étapes ci-dessus et le problème est résolu.

Arun B Chandrasekaran
la source
Très bien, mais vous avez essentiellement reproduit le libellé de la réponse acceptée par Nels Beckman.
Steven Wolfe
5

Dans le cas où vous êtes sûr que vous devriez pouvoir accéder à une classe donnée, cela peut signifier que vous avez ajouté plusieurs fichiers jar à votre projet contenant des classes avec des noms (ou des chemins) identiques mais un contenu différent et ils se sont éclipsés (généralement une ancienne coutume build jar contient une ancienne version intégrée d'une bibliothèque tierce).

Par exemple, lorsque vous ajoutez un jar implémentant:

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

mais aussi une ancienne version implémentant uniquement:

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

Tout fonctionne bien dans l'éditeur de code mais échoue lors de la compilation si "l'ancienne" bibliothèque éclipse la nouvelle - d2 se révèle soudainement "manquant ou inaccessible" même quand il est là.

La solution consiste à vérifier l'ordre des bibliothèques au moment de la compilation et à vous assurer que celle qui est correctement implémentée passe en premier.

M. Napik
la source
4

Accédez au Java Build Path dans les propriétés du projet. Supprimez la bibliothèque système JRE existante, puis ajoutez-la à nouveau, c'est-à-dire Ajouter une bibliothèque -> JRE Lib - sélectionnez jre ---> Terminer. Enfin, sélectionnez l' onglet de commande et d'exportation, sélectionnez JRE Lib et déplacez-vous en haut. C'est ça.

Vijay Bhatt
la source
3

Modifiez simplement l'ordre des bibliothèques de chemins de génération de votre projet. Cliquez avec le bouton droit sur le projet> Chemin de génération> Configurer le chemin de génération> Sélectionnez Ordre et exportation (onglet)> Modifiez l'ordre des entrées. J'espère que le déplacement de la "bibliothèque système JRE" vers le bas fonctionnera. Ça a marché pour moi. Facile et simple .... !!!

Samitha Chathuranga
la source
3

Dans mon cas, il y avait une incompatibilité entre le chemin de génération JRE et JRE installé sur l'environnement d'exécution. J'ai déménagé dans Projet> Propriétés> Compilateur Java. Il y avait un message d'avertissement en bas.

J'ai cliqué sur les liens 'Installed JRE', 'Execution environment', 'Java build path' et j'ai changé la version JDK en 1.7 et l'avertissement a disparu.

Soumyajit Swain
la source
0

L'ajout d'un système JRE approprié via le chemin de génération est la solution, mais votre éclipse peut encore contenir l'erreur. Pour résoudre ce problème, accédez à Java Build path -> Order and Export et déplacez votre bibliothèque système JRE en haut. Cela a résolu mon problème.

Abhishek Soni
la source