Restriction d'accès: le type 'Application' n'est pas API (restriction sur la bibliothèque requise rt.jar)


178

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

voici l'erreur:

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 dit ceci:

Restriction d'accès: Le type 'Application' n'est pas API (restriction sur la bibliothèque requise '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')


3
Essayez de l'exécuter en utilisant Java 7.
Spokeo


Ne pas utiliser Xcode (encore)
www139

Je ne suis pas trop familier avec Java, le gars ne donne pas de chemin exact. Que veut-il dire par: com / sun / xml / internal / **
www139

1
Pouvez-vous interpréter de quel chemin il parle? Je vous remercie! À l'avenir, je passerai soit à xCode, soit à netbeans. Le gars ci-dessus a dit d'essayer java 7 devrais-je?
www139

Réponses:


276

Cela m'est arrivé également, et les réponses données ici n'étaient déjà pas satisfaisantes, j'ai donc fait mes propres recherches.

Contexte: Eclipse restrictions d'accès à

Eclipse a un mécanisme appelé restrictions d'accès pour vous empêcher d'utiliser accidentellement des classes qui, selon Eclipse, ne font pas partie de l'API publique. Habituellement, Eclipse a raison à ce sujet, dans les deux sens: nous ne voulons généralement pas utiliser quelque chose qui ne fait pas partie de l'API publique. Et Eclipse a généralement raison sur ce qui fait et ce qui ne fait pas partie de l'API publique.

Problème

Maintenant, il peut y avoir des situations où vous souhaitez utiliser une non-API publique, comme sun.misc(vous ne devriez pas, sauf si vous savez ce que vous faites). Et il peut y avoir des situations où Eclipse n'a pas vraiment raison (c'est ce qui m'est arrivé, je voulais juste utiliserjavax.smartcardio ). Dans ce cas, nous obtenons cette erreur dans Eclipse.

Solution

La solution consiste à modifier les restrictions d'accès.

  • Accédez aux propriétés de votre projet Java,
    • c'est-à-dire en sélectionnant "Propriétés" dans le menu contextuel du projet dans "l'Explorateur de packages".
  • Allez dans "Java Build Path", onglet "Libraries".
  • Développez l'entrée de la bibliothèque
  • sélectionner
    • "Règles d'accès",
    • "Modifier ..." et
    • "Ajouter ..." a "Résolution: accessible" avec un modèle de règle correspondant. Pour moi, c'était " javax/smartcardio/**", pour vous, cela pourrait plutôt être " com/apple/eawt/**".

28
J'ai Eclipse Mars (4.5.0) et il n'y a pas de règles d'accès dans Java Build Path -> Libraries. FWIW il y a un plus gros marteau (vous pouvez tous les désactiver) dans Préférences -> Java -> Compilateur -> Erreurs / Avertissements -> API obsolète et restreinte.
Jonathan Ross

4
J'ai la version Eclipse Mars.1 (4.5.1). Pour moi, les deux solutions ont fonctionné. La réponse de Christian et le commentaire de Jonathan. Dans l'onglet Bibliothèques, vous devez ouvrir celui parmi les "JAR et dossiers de classe" répertoriés pour voir que les "Règles d'accès" lui appartiennent.
Laszlo Hirdi

3
Cela ne fonctionne pas pour moi. Eclipse Luna. JDK 1.8, 1.7 essayé, règles d'accès ajoutées, projet propre, les erreurs reviennent sans cesse. Également essayé la suggestion de @JonathanRoss - d'abord au niveau du projet. Là, bien que les configurations au niveau du projet pour les API interdites / découragées aient été définies sur Avertissement, j'ai toujours des erreurs. J'ai ensuite essayé (comme Jonathan l'a suggéré) de passer en revue les préférences pour les paramètres de niveau de l'espace de travail, et là, les API interdites étaient définies sur Erreur. Le passage à l'avertissement a fait disparaître le problème, mais le réglage au niveau du projet aurait dû être remplacé, pensez qu'il s'agit d'un bogue dans Eclipse.
Steve Cohen

2
Je n'ai pas été autorisé à modifier la restriction d'accès dans mon cas: Eclipse Neon avec un projet maven jar sur le jar "jfxrt.jar".
pdem

3
Il existe une alternative beaucoup plus simple: supprimer et rajouter la bibliothèque système JRE, comme indiqué dans stackoverflow.com/a/2174607/222838
mico

81

J'avais le même problème. Lorsque j'ai créé le projet java dans Eclipse, j'ai spécifié JRE 8. Lorsque je suis entré dans le chemin de construction du projet et que j'ai édité la bibliothèque système JRE, l'environnement d'exécution Java 8 a été sélectionné. Quand j'ai choisi d'utiliser un "Alernate JRE" (toujours java 8), cela a corrigé l'erreur pour moi.


2
J'avais préféré un correctif global, mais c'est mieux que toutes les autres réponses qui permettent une API restreinte à l'échelle mondiale. (Je ne veux pas utiliser accidentellement sun. * Dans mon application javafx).
Mark Jeronimus

1
Merci, cela a effacé tous les avertissements de mon projet. Eclipse se plaignait de toutes les classes fournies par JavaFX (jfxrt.jar)
Goran Vasic

2
Confirmé ... J'ai changé JRE 8 u60 avec ... JRE 8 u60. Apparemment, cette reconstruction déclenchée, contrairement à toute autre façon de le faire, a pour effet secondaire de résoudre le problème. (Pour une explication plus détaillée sur la façon de modifier ce paramètre, voir la réponse de Nikhil Mahajan ici: stackoverflow.com/questions/6881622/… .)
aîné aîné

Je vous remercie! Avec cette stratégie, j'ai pu compiler avec succès le framework Spark Java.
Martin Pabst

1
Étrangement, cela a fonctionné. Je n'ai qu'un seul JDK installé. Comme c'est bizarre.
WesternGun

65

Ajout de l' autorisation accessible javafx dans eclipse oxygène, allez dans projet> propriétés> chemin de construction java> bibliothèques> puis développez les bibliothèques et double-cliquez sur> règles d'accès, vous définissez l'autorisation Résolution: Modèle de règle accessible: javafx / **

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici


23

Pour commencer ( et sans rapport avec ), instancier la Applicationclasse par vous-même ne semble pas être son utilisation prévue. D'après ce que l'on peut lire à partir de sa source , on s'attend plutôt à ce que vous utilisiez l'instance statique renvoyée par getApplication().

Passons maintenant aux rapports d'erreur Eclipse. Je l' ai rencontré un problème similaire récemment: Access restriction: The method ... is not API (restriction on required project). J'ai appelé la méthode en question comme une méthode d'un objet qui a hérité de cette méthode d'une super classe. Tout ce que j'avais à faire était d'ajouter le package dans lequel se trouvait la super classe aux packages importés par mon plugin.

Cependant, il existe de nombreuses causes différentes d'erreurs basées sur la "restriction sur le projet / la bibliothèque requis ". Semblable au problème décrit ci-dessus, le type que vous utilisez peut avoir des dépendances vers des packages qui ne sont pas exportés par la bibliothèque ou peuvent ne pas l'être lui-même. Dans ce cas, vous pouvez essayer de retrouver les paquets manquants et de les exporter moi-même, comme suggéré ici , ou essayer les règles d'accès. D'autres scénarios possibles incluent:

  • Eclipse veut vous empêcher d'utiliser les packages disponibles qui ne font pas partie de l'API Java publique (solution 1 , 2 )
  • Les dépendances sont satisfaites par plusieurs sources, les versions sont en conflit, etc. (solution 1 , 2 , 3 )
  • Eclipse utilise un JRE où un JDK est nécessaire (ce qui pourrait être le cas ici, d'après ce que disent vos erreurs; solution ) ou la version JRE / JDK dans le chemin de construction du projet n'est pas la bonne

Cela a fini par ressembler davantage à un mélange de problèmes liés aux restrictions qu'à une véritable réponse. Mais comme la restriction sur les projets requis est une erreur si polyvalente à signaler, la recette parfaite reste probablement à trouver.


18

J'ai eu ce problème car la facette de projet associée à mon projet était la mauvaise version de Java.

Pour résoudre ce problème, j'ai fait ce qui suit:

  1. Faites un clic droit sur le projet et sélectionnez Propriétés
  2. Sélectionnez 'Project Facets' et changez la version de java en quelque chose de supérieur à 1.4.
  3. Cliquez sur [Appliquer]

Cela reconstruira votre projet et, espérons-le, l'erreur sera résolue.


15

Nous avons dû changer notre application pour construire avec le JDK 1.8 en utilisant Window-> Preferences-> Java-> Installed JREs . Cependant, après avoir modifié cela, la bibliothèque système JRE spécifiée dans l'explorateur de projet était toujours incorrecte. Pour résoudre ce problème, cliquez avec le bouton droit de la souris sur "Bibliothèque système JRE [faux-ici]" et passez de l'environnement d'exécution: à "Workspace Default (yer-default-here)"

entrez la description de l'image ici


1
Merci! Que ma vie sauve :)
KMC

13

Cela a fonctionné: Propriétés du projet -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Appliquer


le système a raccroché :(
Saikat

12

Dans la barre de menus supérieure d'Eclipse:

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

9

Si vous rencontrez le même problème avec Spring Tool Suite:

L'IDE sous-jacent de Spring Tool Suite est en fait Eclipse. J'ai eu cette erreur en essayant d'utiliser certaines com.sun.netclasses. Pour supprimer ces erreurs et les empêcher d'apparaître dans la plate-forme Eclipse Luna SR1 (4.4.2) de STS:

  • Accédez à Projet> Propriétés
  • Développez l'en-tête du compilateur Java
  • Cliquez sur Erreurs / Avertissements
  • Développez l'API obsolète et restreinte
  • À côté de "Référence interdite (règles d'accès)", sélectionnez "ignorer"
  • À côté de "Référence déconseillée (règles d'accès)", sélectionnez "Ignorer"

Vous êtes prêt à partir.


6

Avait le même problème. Voici comment je l'ai résolu: Allez dans l'Explorateur de packages. Cliquez avec le bouton droit sur la bibliothèque système JRE et accédez à Propriétés. Dans le conteneur Classpath> Sélectionnez JRE pour le chemin de génération du projet, sélectionnez la troisième option (JRE par défaut de Workspace).

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


1
Merci ... en utilisant la réponse proposée par C Hujer, j'ai effectivement trouvé qu'il y avait "162 règles (non modifiables)" pour le fichier jfxrt.jar!
mike rodent

5

Accédez au paramètre suivant:

Fenêtre -> Préférences -> Java-Compiler-Errors / Warnings-Deprecated and restricted API-Forbidden reference (règles d'accès)

Réglez-le sur Warningou Ignore.


5

Nous utilisons IBM Rational Application Developer (RAD) et avons eu le même problème.

Message d'erreur:

Restriction d'accès: Le type 'JAXWSProperties' n'est pas une API (restriction sur la bibliothèque requise 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Solution:

allez dans le chemin de construction java et sous l'onglet Bibliothèque, supprimez la bibliothèque système JRE. Puis à nouveau Ajouter une bibliothèque -> Bibliothèque système JRE


4

Dans Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
sélectionnez JRE ... et appuyez sur Edit: Switch to Workspace JRE (jdk1.8.0_77)

Travaille pour moi.


3

J'ai eclipse JRE 8.112, je ne sais pas si cela compte mais ce que j'ai fait est ceci:

  1. Clic droit sur mon dossier de projets
  2. est descendu aux propriétés et a cliqué
  3. cliqué sur le dossier du chemin de construction java
  4. une fois à l'intérieur, j'étais dans l'ordre et à l'export
  5. J'ai vérifié la bibliothèque système JRE [jre1.8.0_112]
  6. puis l'a déplacé au-dessus de l'autre bibliothèque système JRE (je ne sais pas si cela comptait)
  7. puis appuyé sur ok

Cela a résolu mon problème.


2

J'ajoute simplement e (fx) clipse dans le marché eclipse. Facile et simple


1

J'utilise eclipse néon 3. Je voulais juste utiliser javafx.application.Application, j'ai donc suivi la réponse de Christian Hujer ci-dessus et cela a fonctionné. Juste quelques conseils: les règles d'accès sont très similaires à l'instruction d'importation. Pour moi, les règles d'accès que j'ai ajoutées étaient "javafx / application / **". Remplacez simplement le point dans l'instruction d'importation par une barre oblique et c'est la règle. J'espère que cela pourra aider.


1

J'ai eu un problème un peu différent. Dans Projet - Propriétés - Bibliothèques - Bibliothèque JRE, j'avais la mauvaise version de la bibliothèque JRE. Supprimez et réglez celui-ci, et le tour est joué - tous les Access restriction...avertissements sont partis.


1

Même si son ancienne question, pour moi dans Eclipse, je viens de cliquer avec le bouton droit sur le dossier Src et les propriétés (Alt + Entrée) et la vérification de Ignore optional compile problemsl'erreur supprimée.

entrez la description de l'image ici


0

Si quelqu'un rencontre ce problème uniquement dans votre outil CI lors de l'exécution de maven, l'astuce pour moi a été de définir explicitement l'environnement d'exécution dans votre MANIFEST.MF.

Dans mon cas, je l'ai fait en insérant la ligne suivante dans mon fichier manifeste de bundle OSGi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.