web-dev-qa-db-fra.com

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

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 une API (restriction sur la bibliothèque requise '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')

147
www139

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

Contexte: Eclipse restrictions d'accès

Eclipse dispose d'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. En règle générale, Eclipse a raison à ce sujet, dans les deux sens: nous ne souhaitons généralement pas utiliser quelque chose qui ne fait pas partie de l'API publique. Et Eclipse a généralement raison en ce qui concerne l’API publique et ce qu’elle ne fait pas.

Problème

Maintenant, il peut arriver que vous utilisiez une non-API publique, telle que 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 simplement utiliser javax.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 à "Chemin de construction Java", onglet "Bibliothèques". 
  • Développer l'entrée de la bibliothèque
  • sélectionnez
    • "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/**", mais pour vous, ce pourrait être "com/Apple/eawt/**".
221
Christian Hujer

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

70
Amber

En ajoutant l'autorisation javafx accessible dans Eclipse oxygen , Accédez à projet> propriétés> chemin de construction Java> bibliothèques>, développez les bibliothèques et double-cliquez sur> Règles d'accès pour définir l'autorisation Résolution: accessible Modèle de règle: javafx/**

 enter image description here

 enter image description here

 enter image description here

49
vidyakumargv

Pour commencer (et sans relation), l'instanciation de la classe Application par vous-même ne semble pas être son utilisation prévue. D'après ce que vous pouvez lire à partir de source , vous devez plutôt utiliser l'instance statique renvoyée par getApplication().

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

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

  • Eclipse veut vous empêcher d'utiliser des 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 vos erreurs; solution ) ou la version de JRE/JDK dans le chemin de génération de projet n'est pas la bonne. 

Cela a fini par ressembler davantage à un mélange de problèmes liés aux restrictions qu’une réponse réelle. Cependant, étant donné que la restriction des projets requis est une erreur si polyvalente à signaler, la recette parfaite doit encore être trouvée.

22
J. Katzwinkel

J'ai eu ce problème parce que 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 modifiez la version de Java en une version supérieure à 1.4.
  3. Cliquez sur [Appliquer] 

Cela reconstruira votre projet et si tout va bien l'erreur sera résolue.

16
Kiriya Keat

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

13
Kamila O

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
10
Phil Long

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

IDE sous-jacent à Spring Tool Suite est en fait Eclipse. J'ai eu cette erreur tout à l'heure en essayant d'utiliser certaines classes com.Sun.net. Pour supprimer ces erreurs et les empêcher de s'afficher dans la plate-forme Eclipse Luna SR1 (4.4.2) de STS: 

  • Naviguez vers Projet> Propriétés 
  • Développez l'en-tête du compilateur Java
  • Cliquez sur Erreurs/Avertissements 
  • Développez les API obsolètes et restreintes
  • En regard de "Référence interdite (règles d'accès)", sélectionnez "ignorer" 
  • En regard de "Référence déconseillée (règles d'accès)", sélectionnez "ignorer" 

Vous êtes prêt à partir.

9
Grandclosing

Avait le même problème. Voici comment j'ai résolu le problème: Accédez à Package Explorer. Cliquez avec le bouton droit sur JRE System Library et accédez à Propriétés. Dans le conteneur Classpath> Sélectionner 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

5
Nishant_Singh

Accédez au paramètre suivant:

Fenêtre -> Préférences -> Java-Compiler-Errors/Warnings-Référence obsolète et restreinte API (règles d'accès)

Réglez-le sur Warning ou Ignore.

4
cxj

Nous avons dû modifier notre application pour la construire par rapport au JDK 1.8 en utilisant Window-> Préférences-> Java-> JRE installés. Cependant, après avoir changé cela, la bibliothèque système JRE spécifiée dans l'explorateur de projets était toujours incorrecte. Pour résoudre ce problème, cliquez avec le bouton droit de la souris sur "Bibliothèque système JRE [bad-jre-here]" et remplacez l'environnement d'exécution par "Espace de travail par défaut (yer-default-here)".

 enter image description here

4
Dinsdale

Dans Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
sélectionnez JRE ... et appuyez sur Modifier: Basculer vers l'espace de travail JRE (jdk1.8.0_77) 

Travaille pour moi.

3
Sven

J'ai Eclipse JRE 8.112, je ne sais pas si ça compte mais ce que j'ai fait était le suivant:

  1. Clic droit sur mon dossier de projets
  2. est descendu aux propriétés et cliqué
  3. cliqué sur le dossier du chemin de génération Java
  4. une fois à l'intérieur, j'étais dans l'ordre et l'exportation
  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 (pas sûr que cela importait)
  7. puis appuyé sur ok

Cela a résolu mon problème. 

2
quasar-light

Je viens simplement d'ajouter e (fx) clipse sur le marché Eclipse. Facile et simple

1
jessie

J'ai eu un petit problème différent. Dans la bibliothèque Projet - Propriétés - Bibliothèques - JRE, j'avais la mauvaise version de JRE lib. Supprimer et définir le réel, et le tour est joué - tous les avertissements Access restriction... sont absents.

0
Gangnus

Nous utilisons IBM Rational Application Developer (RAD) et avons 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 'C:\IBM\RAD95\jdk\jre\lib\rt.jar' requise

Solution:

allez dans le chemin de génération Java et sous l'onglet Bibliothèque, supprimez JRE System Library. Puis à nouveau Ajouter une bibliothèque -> Bibliothèque système JRE

0
Jonas_Hess

J'utilise Eclipse neon 3. Je voulais juste utiliser javafx.application.Application, j'ai donc suivi la réponse de Christian Hujer ci-dessus et cela a fonctionné. Quelques astuces: les règles d'accès sont très similaires à la déclaration d'importation. Pour moi, les règles d'accès que j'ai ajoutées étaient "javafx/application/**". Il suffit de remplacer le point dans la déclaration d'importation par une barre oblique et c'est la règle. J'espère que cela pourra aider.

0
Tony S