Limitazione dell'accesso: il tipo "Applicazione" non è API (restrizione sulla libreria richiesta rt.jar)


178

Ecco il codice:

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

ecco l'errore:

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 dice questo:

Limitazione dell'accesso: il tipo 'Applicazione' non è API (restrizione sulla libreria richiesta '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')


3
Prova a eseguirlo usando Java 7.
spoko


Non usando Xcode (ancora)
www139

Non ho familiarità con Java che il ragazzo non dà un percorso esatto. Cosa intende per: com / sun / xml / internal / **
www139

1
Potresti interpretare di che percorso sta parlando? Grazie! In futuro passerò a xCode o netbeans. Il ragazzo sopra ha detto di provare Java 7 dovrei?
www139,

Risposte:


276

Questo è successo anche a me, e le risposte fornite qui non erano già soddisfacenti, quindi ho fatto le mie ricerche.

Sfondo: restrizioni sull'accesso a Eclipse

Eclipse ha un meccanismo chiamato restrizioni di accesso per impedirti di usare accidentalmente classi che Eclipse ritiene non facciano parte dell'API pubblica. Di solito, Eclipse ha ragione, in entrambi i sensi: di solito non vogliamo usare qualcosa che non fa parte dell'API pubblica. E Eclipse di solito ha ragione su ciò che è e ciò che non fa parte dell'API pubblica.

Problema

Ora, ci possono essere situazioni in cui si desidera utilizzare la Non-API pubblica, come sun.misc(non si dovrebbe, a meno che non si sappia cosa si sta facendo). E ci possono essere situazioni in cui Eclipse non ha proprio ragione (è quello che mi è successo, volevo solo usare javax.smartcardio). In tal caso, viene visualizzato questo errore in Eclipse.

Soluzione

La soluzione è modificare le restrizioni di accesso.

  • Vai alle proprietà del tuo progetto Java,
    • cioè selezionando "Proprietà" dal menu contestuale del progetto in "Esplora pacchetti".
  • Vai su "Percorso build Java", scheda "Librerie".
  • Espandere la voce della libreria
  • Selezionare
    • "Regole di accesso",
    • "Modifica ..." e
    • "Aggiungi ..." a "Risoluzione: accessibile" con un modello di regole corrispondente. Per me quello era " javax/smartcardio/**", per te potrebbe invece essere " com/apple/eawt/**".

28
Ho Eclipse Mars (4.5.0) e non ci sono regole di accesso in Java Build Path -> Librerie. FWIW c'è un martello più grande (puoi disattivarli tutti) in Preferenze -> Java -> Compilatore -> Errori / Avvertenze -> API obsolete e limitate.
Jonathan Ross,

4
Ho Eclipse Mars.1 Release (4.5.1). Per me entrambe le soluzioni hanno funzionato. La risposta di Christian e il commento di Jonathan. Nella scheda Librerie devi aprire quella tra le "cartelle JAR e le classi" elencate per vedere le "Regole di accesso" che le appartengono.
Laszlo Hirdi,

3
Questo NON funziona per me. Eclipse Luna. Ho provato JDK 1.8, 1.7, aggiunto regole di accesso, progetto pulito, gli errori continuano a tornare. Ho anche provato il suggerimento di @JonathanRoss - prima a livello di progetto. Lì, sebbene le configurazioni a livello di progetto per le API proibite / scoraggiate fossero impostate su Avvertenza, ho ancora degli errori. Ho quindi provato (come suggerito Jonathan) a esaminare le preferenze per le impostazioni del livello dell'area di lavoro e QUI, le API vietate sono state impostate su Errore. Passare all'avvertimento non ha risolto il problema, ma l'impostazione del livello del progetto avrebbe dovuto essere ignorata, si pensi che sia un bug in Eclipse.
Steve Cohen,

2
Nel mio caso non mi è stato permesso di modificare le restrizioni di accesso: Eclipse Neon con un progetto jar di jven su jar "jfxrt.jar".
pdem,

3
C'è un'alternativa molto più semplice: la rimozione e l'aggiunta di nuovo il Sistema Bibliotecario di JRE, come fuori punte in stackoverflow.com/a/2174607/222838
mico

81

Avevo lo stesso problema. Quando ho creato inizialmente il progetto Java in Eclipse ho specificato JRE 8. Quando sono entrato nel percorso di compilazione del progetto e ho modificato la libreria di sistema JRE, è stato selezionato l'ambiente di esecuzione Java 8. Quando ho scelto di utilizzare un "Alernate JRE" (ancora java 8), ho risolto l'errore per me.


2
Preferivo una correzione globale, ma è migliore di tutte le altre risposte che abilitano l'API limitata a livello globale. (Non voglio usare accidentalmente sun. * Nella mia applicazione javafx).
Mark Jeronimus,

1
Grazie, questo ha cancellato tutti gli avvisi nel mio progetto. Eclipse si lamentava di tutte le classi fornite da JavaFX (jfxrt.jar)
Goran Vasic,

2
Confermato ... Ho cambiato JRE 8 u60 con ... JRE 8 u60. Apparentemente, questa ricostruzione innescata, al contrario di qualsiasi altro modo per farlo, ha l'effetto collaterale di risolvere il problema. (Per una spiegazione più dettagliata su come modificare questa impostazione, vedere la risposta di Nikhil Mahajan qui: stackoverflow.com/questions/6881622/… .)
Elder Elder

Grazie! Con questa strategia sono stato in grado di compilare con successo il framework spark java.
Martin Pabst,

1
Stranamente ha funzionato. Ho solo un JDK installato. Che strano.
WesternGun

65

Aggiungendo l' autorizzazione accessibile javafx in eclipse ossigeno vai su progetto> proprietà> percorso build java> librerie> quindi espandi le librerie e fai doppio clic su> Regole di accesso lì imposta l'autorizzazione Risoluzione: Modello di regola accessibile: javafx / **

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


23

Tanto per cominciare ( e non correlato ), creare un'istanza della Applicationclasse da soli non sembra essere l'uso previsto. Da quello che si può leggere dalla sua fonte , ci si aspetta che si usi l'istanza statica restituita da getApplication().

Ora andiamo all'errore Eclipse. Ho incontrato un problema simile di recente: Access restriction: The method ... is not API (restriction on required project). Ho chiamato il metodo in questione come metodo di un oggetto che ha ereditato quel metodo da una super classe. Tutto quello che dovevo fare era aggiungere il pacchetto in cui si trovava la superclasse ai pacchetti importati dal mio plugin.

Tuttavia, ci sono molte diverse cause di errori basate sulla "restrizione sul progetto / biblioteca richiesti ". Simile al problema sopra descritto, il tipo che si sta utilizzando potrebbe avere dipendenze da pacchetti che non vengono esportati dalla libreria o potrebbero non essere esportati da soli. In tal caso, puoi provare a rintracciare i pacchetti mancanti ed esportarli tu stesso, come suggerito qui , oppure provare le Regole di accesso. Altri possibili scenari includono:

  • Eclipse vuole impedirti di utilizzare i pacchetti disponibili che non fanno parte dell'API Java pubblica (soluzione 1 , 2 )
  • Le dipendenze sono soddisfatte da più fonti, le versioni sono in conflitto ecc. (Soluzione 1 , 2 , 3 )
  • Eclipse sta usando un JRE dove è necessario un JDK (che potrebbe essere il caso qui, da quello che dicono i tuoi errori; soluzione ) o la versione JRE / JDK nel percorso di compilazione del progetto non è quella giusta

Questo finì per somigliare più a un miscuglio di problemi relativi alle restrizioni che a una risposta effettiva. Ma poiché la restrizione ai progetti richiesti è un errore così versatile da segnalare, probabilmente è ancora da trovare la ricetta perfetta.


18

Ho avuto questo problema perché la sfaccettatura del progetto associata al mio progetto era la versione java sbagliata.

Per risolvere questo problema ho fatto quanto segue:

  1. Fare clic con il tasto destro sul progetto e selezionare Proprietà
  2. Seleziona 'Project Facets' e cambia la versione di Java in qualcosa di maggiore di 1.4.
  3. Fai clic su [Applica]

Questo ricostruirà il tuo progetto e speriamo che l'errore venga risolto.


15

Abbiamo dovuto modificare la nostra applicazione per compilare con il JDK 1.8 usando Window-> Preferenze-> Java-> JRE installati . Tuttavia, dopo averlo modificato, la libreria di sistema JRE specificata in Esplora progetti era ancora errata. Per risolvere questo problema, fare clic con il tasto destro su "Libreria di sistema JRE [wrong-jre-here]" e passare dall'ambiente di esecuzione: a "Default area di lavoro (yer-default-qui)"

inserisci qui la descrizione dell'immagine


1
Grazie! Che mi salvi la vita :)
KMC,

13

Ha funzionato: Proprietà progetto -> ProjectFacets -> Runtime -> jdk1.8.0_45 -> Applica


sistema riagganciato :(
Saikat

12

Nella barra dei menu in alto di Eclipse:

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

9

Se riscontri lo stesso problema con Spring Tool Suite:

L'IDE alla base di Spring Tool Suite è, in effetti, Eclipse. Ho appena ricevuto questo errore nel tentativo di utilizzare alcune com.sun.netclassi. Per rimuovere questi errori e impedire che vengano visualizzati nella piattaforma Eclipse Luna SR1 (4.4.2) di STS:

  • Passare a Progetto> Proprietà
  • Espandere l'intestazione del compilatore Java
  • Fai clic su Errori / Avvertenze
  • Espandi API obsolete e limitate
  • Accanto a "Riferimento vietato (regole di accesso)" seleziona "ignora"
  • Accanto a "Riferimento scoraggiato (regole di accesso)" seleziona "ignora"

Sei a posto.


6

Ho avuto lo stesso problema. Ecco come l'ho risolto: vai a Esplora pacchetti. Fare clic con il tasto destro sulla libreria di sistema JRE e andare su Proprietà. Nel contenitore Classpath> Seleziona JRE per il percorso di compilazione del progetto selezionare la terza opzione (JRE predefinito dell'area di lavoro).

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


1
Grazie ... usando la risposta proposta da C Hujer ho effettivamente scoperto che c'erano "162 regole (non modificabili)" per il file jfxrt.jar!
mike rodent,

5

Vai alla seguente impostazione:

Finestra -> Preferenze -> Java-Compiler-Errori / Avvertenze-Obsoleto e limitato API-Proibito riferimento (regole di accesso)

Impostalo su Warningo Ignore.


5

Usiamo IBM Rational Application Developer (RAD) e abbiamo avuto lo stesso problema.

Messaggio di errore:

Limitazione dell'accesso: il tipo 'JAXWSProperties' non è API (restrizione sulla libreria richiesta 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Soluzione:

vai su java build path e nella scheda Library, rimuovi JRE System Library. Quindi di nuovo Aggiungi libreria -> Libreria di sistema JRE


4

In Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
selezionare JRE ... e premere Modifica: Passa a Workspace JRE (jdk1.8.0_77)

Per me va bene.


3

Ho eclissi JRE 8.112, non sono sicuro che sia importante, ma quello che ho fatto è stato questo:

  1. Fare clic con il tasto destro sulla cartella dei miei progetti
  2. è andato alle proprietà e ha fatto clic
  3. cliccato sulla cartella del percorso di build java
  4. una volta dentro, ero nell'ordine e nell'esportazione
  5. Ho controllato la libreria di sistema JRE [jre1.8.0_112]
  6. quindi spostato in alto sopra l'altra libreria di sistema JRE lì (non sono sicuro che ciò abbia importanza)
  7. quindi premuto ok

Questo ha risolto il mio problema.


2

Aggiungo semplicemente e (fx) clipse nel marketplace di eclipse. Facile e semplice


1

Sto usando eclipse neon 3. Volevo solo usare javafx.application.Application, quindi ho seguito la risposta di Christian Hujer sopra e ha funzionato. Solo alcuni suggerimenti: le regole di accesso sono molto simili alla dichiarazione di importazione. Per me, le regole di accesso che ho aggiunto erano "javafx / application / **". Sostituisci semplicemente il punto nell'istruzione import con barra rovesciata e questa è la regola. Spero che aiuti.


1

Ho avuto un problema un po 'diverso. In Progetto - Proprietà - Librerie - Libreria JRE, ho avuto la versione errata della libreria JRE. Rimuovi e imposta quello attuale e voilà: tutti gli Access restriction...avvisi sono assenti.


1

Anche se la sua vecchia domanda, per me in Eclipse, faccio semplicemente clic con il pulsante destro del mouse sulla cartella Src e sulle proprietà (Alt + Invio) e controllo per Ignore optional compile problemsrimuovere l'errore.

inserisci qui la descrizione dell'immagine


0

Se qualcuno ha questo problema solo nel tuo strumento CI mentre esegui maven, quello che mi ha fatto il trucco era definire esplicitamente l'ambiente di esecuzione nel tuo MANIFEST.MF.

Nel mio caso, l'ho fatto inserendo la seguente riga nel mio file manifest del bundle OSGi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.