Restricción de acceso: el tipo 'Aplicación' no es API (restricción en la biblioteca requerida rt.jar)

178

Aquí está el código:

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

Aquí está el error:

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 esto:

Restricción de acceso: el tipo 'Aplicación' no es API (restricción en la biblioteca requerida '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')

www139
fuente
3
Intente ejecutar esto con Java 7.
spoko
No estoy usando Xcode (todavía)
www139
No estoy familiarizado con Java, el chico no da un camino exacto. ¿Qué quiere decir con: com / sun / xml / internal / **
www139
1
¿Podrías interpretar de qué camino está hablando? ¡Gracias! En el futuro, cambiaré a xCode o netbeans. El chico de arriba dijo que intente Java 7 ¿debería?
www139

Respuestas:

276

Esto me sucedió a mí también, y las respuestas dadas aquí ya no eran satisfactorias, así que hice mi propia investigación.

Antecedentes: restricciones de acceso de Eclipse

Eclipse tiene un mecanismo llamado restricciones de acceso para evitar el uso accidental de clases que Eclipse cree que no son parte de la API pública. Por lo general, Eclipse tiene razón al respecto, en ambos sentidos: por lo general, no queremos usar algo que no sea parte de la API pública. Y Eclipse generalmente tiene razón sobre qué es y qué no es parte de la API pública.

Problema

Ahora, puede haber situaciones en las que desee utilizar una API no pública, como sun.misc(no debería, a menos que sepa lo que está haciendo). Y puede haber situaciones en las que Eclipse no es realmente correcto (eso es lo que me sucedió, solo quería usarjavax.smartcardio ). En ese caso, obtenemos este error en Eclipse.

Solución

La solución es cambiar las restricciones de acceso.

  • Ve a las propiedades de tu proyecto Java,
    • es decir, seleccionando "Propiedades" en el menú contextual del proyecto en el "Explorador de paquetes".
  • Vaya a "Java Build Path", pestaña "Bibliotecas".
  • Expande la entrada de la biblioteca
  • Seleccione
    • "Reglas de acceso",
    • "Editar ..." y
    • "Agregar ..." una "Resolución: Accesible" con un patrón de regla correspondiente. Para mí eso fue " javax/smartcardio/**", para ti podría ser " com/apple/eawt/**".
Christian Hujer
fuente
28
Tengo Eclipse Mars (4.5.0) y no hay reglas de acceso en Java Build Path -> Bibliotecas. FWIW hay un martillo más grande (puede apagarlos todos) en Preferencias -> Java -> Compilador -> Errores / Advertencias -> API obsoleta y restringida.
Jonathan Ross
44
Tengo Eclipse Mars.1 Release (4.5.1). Para mí ambas soluciones funcionaron. La respuesta de Christian y el comentario de Jonathan. En la pestaña Bibliotecas, debe abrir la que se encuentra entre las "JAR y carpetas de clases" para ver que las "Reglas de acceso" le pertenecen.
Laszlo Hirdi
3
Esto no funciona para mi. Eclipse Luna. Intenté JDK 1.8, 1.7, reglas de acceso agregadas, proyecto limpio, los errores siguen volviendo. También probé la sugerencia de @JonathanRoss, primero a nivel de proyecto. Allí, aunque las configuraciones de nivel de proyecto para las API prohibidas / desalentadas se configuraron en Advertencia, todavía recibí errores. Luego intenté (como Jonathan sugirió) pasar por las preferencias para la configuración del nivel del espacio de trabajo, y allí, las API prohibidas se configuraron en Error. Cambiar a la advertencia allí hizo que el problema desapareciera, pero la configuración del nivel del proyecto debería haberse anulado, creo que es un error en Eclipse.
Steve Cohen
2
No me permitieron modificar la restricción de acceso en mi caso: Eclipse Neon con un proyecto maven jar en jar "jfxrt.jar".
pdem
2
Hay una alternativa mucho más simple: eliminar y volver a agregar la biblioteca del sistema JRE, como se señala en stackoverflow.com/a/2174607/222838
mico
81

Estaba teniendo el mismo problema. Cuando creé inicialmente el proyecto Java en Eclipse, especifiqué JRE 8. Cuando entré en la ruta de compilación del proyecto y edité la Biblioteca del sistema JRE, se seleccionó el entorno de ejecución de Java 8. Cuando elegí usar un "Alernate JRE" (todavía java 8) me solucionó el error.

Ámbar
fuente
2
Preferí una solución global, pero es mejor que todas las otras respuestas que permiten API restringida a nivel mundial. (No quiero usar accidentalmente sun. * En mi aplicación javafx).
Mark Jeronimus
1
Gracias, esto borró todas las advertencias en mi proyecto. Eclipse se quejaba de todas las clases proporcionadas por JavaFX (jfxrt.jar)
Goran Vasic
2
Confirmado ... cambié JRE 8 u60 con ... JRE 8 u60. Aparentemente, esta reconstrucción que se desencadena, a diferencia de cualquier otra forma de hacerlo, tiene el efecto secundario de solucionar el problema. (Para obtener una explicación más detallada sobre cómo cambiar esta configuración, consulte la respuesta de Nikhil Mahajan aquí: stackoverflow.com/questions/6881622/… .)
anciano anciano
¡Gracias! Con esta estrategia pude compilar con éxito el framework spark java.
Martin Pabst
1
Extrañamente esto funcionó. Solo tengo un JDK instalado. Que raro.
WesternGun
65

Agregando permiso accesible javafx en eclipse oxygen vaya a proyecto> propiedades> ruta de compilación java> bibliotecas> luego expanda las bibliotecas y haga doble clic en> Reglas de acceso allí configura el permiso Resolución: Patrón de regla accesible: javafx / **

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

vidyakumargv
fuente
23

Para comenzar ( y no relacionado ), crear una instancia de la Applicationclase por sí mismo no parece ser su uso previsto. De lo que se puede leer de su fuente , se espera que utilice la instancia estática devuelta por getApplication().

Ahora vamos al error Eclipse informa. Me he encontrado con un problema similar recientemente:Access restriction: The method ... is not API (restriction on required project) . Llamé al método en cuestión como un método de un objeto que heredó ese método de una superclase. Todo lo que tenía que hacer era agregar el paquete en el que estaba la superclase a los paquetes importados por mi complemento.

Sin embargo, hay muchas causas diferentes para los errores basados ​​en la "restricción en el proyecto / biblioteca requerida ". Similar al problema descrito anteriormente, el tipo que está utilizando puede tener dependencias de paquetes que la biblioteca no exporta o que no se exportan en sí. En ese caso, puede intentar localizar los paquetes que faltan y exportarlos usted mismo, como se sugiere aquí , o probar las Reglas de acceso. Otros escenarios posibles incluyen:

  • Eclipse quiere evitar que use paquetes disponibles que no son parte de la API pública de Java (solución 1 , 2 )
  • Varias fuentes satisfacen las dependencias, las versiones son conflictivas, etc. (solución 1 , 2 , 3 )
  • Eclipse está utilizando un JRE donde es necesario un JDK (que podría ser el caso aquí, por lo que dicen sus errores; solución ) o la versión JRE / JDK en la ruta de compilación del proyecto no es la correcta

Esto terminó más como una mezcla de problemas relacionados con la restricción que como una respuesta real. Pero dado que la restricción en los proyectos requeridos es un error tan versátil que se debe informar, la receta perfecta probablemente aún no se haya encontrado.

J. Katzwinkel
fuente
18

Tuve este problema porque la faceta del proyecto asociada con mi proyecto era la versión incorrecta de Java.

Para solucionar esto, hice lo siguiente:

  1. Haga clic derecho en el proyecto y seleccione Propiedades
  2. Seleccione 'Project Facets' y cambie la versión de java a algo mayor que 1.4.
  3. Haga clic en [Aplicar]

Esto reconstruirá su proyecto y esperamos que el error se resuelva.

Kiriya Keat
fuente
15

Tuvimos que cambiar nuestra aplicación para construir contra el JDK 1.8 usando Window-> Preferences-> Java-> Instalated JREs . Sin embargo, después de cambiar eso, la biblioteca del sistema JRE especificada en el Explorador de proyectos seguía siendo incorrecta. Para solucionar esto, haga clic con el botón derecho en "Biblioteca del sistema JRE [wrong-jre-here]" y cambie de Entorno de ejecución: a "Espacio de trabajo predeterminado (yer-default-here)"

ingrese la descripción de la imagen aquí

Dinsdale
fuente
1
¡Gracias! Que salvo mi vida :)
KMC
13

Funcionó: Propiedades del proyecto -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Apply

Kamila O
fuente
sistema colgado :(
Saikat
12

En la barra de menú superior de Eclipse:

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

Si tiene este mismo problema con Spring Tool Suite:

El IDE subyacente de Spring Tool Suite es, de hecho, Eclipse. Recibí este error justo ahora tratando de usar algunas com.sun.netclases. Para eliminar estos errores y evitar que aparezcan en la plataforma Eclipse Luna SR1 (4.4.2) de STS:

  • Navegue a Proyecto> Propiedades
  • Expanda el encabezado del compilador de Java
  • Haga clic en Errores / Advertencias
  • Expandir API obsoleta y restringida
  • Junto a "Referencia prohibida (reglas de acceso)", seleccione "ignorar"
  • Junto a "Referencia desaconsejada (reglas de acceso)" seleccione "ignorar"

Eres bueno para ir.

Grandclosing
fuente
6

Tuve el mismo problema Así es como lo resolví: vaya al Explorador de paquetes. Haga clic derecho en JRE System Library y vaya a Propiedades. En el Classpath Container> Seleccionar JRE para la ruta de compilación del proyecto, seleccione la tercera opción (JRE predeterminado del espacio de trabajo).

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

Nishant_Singh
fuente
1
Gracias ... usando la respuesta propuesta por C Hujer ¡En realidad encontré que había "162 reglas (no modificables)" para el archivo jfxrt.jar!
Mike roedor
5

Vaya a la siguiente configuración:

Ventana -> Preferencias -> Java-Compiler-Errores / Advertencias-Referencia obsoleta y restringida API-Prohibida (reglas de acceso)

Póngalo en Warningo Ignore.

cxj
fuente
5

Utilizamos IBM Rational Application Developer (RAD) y tuvimos el mismo problema.

Mensaje de error:

Restricción de acceso: el tipo 'JAXWSProperties' no es API (restricción en la biblioteca requerida 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Solución:

vaya a la ruta de compilación de Java y en la pestaña Biblioteca, elimine la Biblioteca del sistema JRE. Luego, nuevamente Agregar biblioteca -> Biblioteca del sistema JRE

Jonas_Hess
fuente
4

En Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
seleccione JRE ... y presione Editar: Cambiar a Workspace JRE (jdk1.8.0_77)

Funciona para mi.

Sven
fuente
3

Tengo eclipse JRE 8.112, no estoy seguro si eso importa, pero lo que hice fue esto:

  1. Haga clic derecho en mi carpeta de proyectos
  2. bajó a propiedades y hizo clic
  3. hizo clic en la carpeta de ruta de compilación de Java
  4. Una vez dentro, estaba en el pedido y exporté
  5. Revisé la biblioteca del sistema JRE [jre1.8.0_112]
  6. luego lo movió hacia arriba sobre la otra biblioteca del sistema JRE allí (no estoy seguro de si esto importaba)
  7. luego presionó ok

Esto resolvió mi problema.

luz cuasar
fuente
2

Simplemente agrego e (fx) clipse en eclipse marketplace. Fácil y simple

jessie
fuente
1

Estoy usando eclipse neon 3. Solo quería usar javafx.application.Application, así que seguí la respuesta de Christian Hujer anterior y funcionó. Solo algunos consejos: las reglas de acceso son muy similares a la declaración de importación. Para mí, las reglas de acceso que agregué fueron "javafx / application / **". Simplemente reemplace el punto en la declaración de importación con barra diagonal y esa es la regla. Espero que ayude.

Tony S
fuente
1

Tuve un pequeño problema diferente. En Project - Properties - Libraries - JRE library, tenía la versión incorrecta de JRE lib. Elimine y configure el real, y listo, todas las Access restriction...advertencias están ausentes.

Gangnus
fuente
1

Incluso si es una pregunta anterior, para mí en Eclipse, simplemente hago clic derecho en la carpeta y las propiedades de Src (Alt + Enter) y la verificación para Ignore optional compile problemseliminar el error.

ingrese la descripción de la imagen aquí

MrSimpleMind
fuente
0

Si alguien tiene este problema solo en su herramienta de CI mientras ejecuta maven, lo que me sirvió fue definir explícitamente el entorno de ejecución en su MANIFEST.MF.

En mi caso, hice esto insertando la siguiente línea en mi archivo de manifiesto del paquete OSGi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Fernando Paz
fuente