¿Restricción de acceso en clase debido a restricción en la biblioteca requerida rt.jar?

824

Estoy intentando compilar el código Java 1.4 creado por WSDL2Java de IBM en Java5 sin volver a crear los apéndices y vi este error en Eclipse . Supongo que los apéndices generados deberían compilarse siempre que el tiempo de ejecución esté disponible (lo están).
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

El nombre completo de la clase es javax.xml.namespace.QName

Qué está pasando aquí? ¿Es este un caso en el que estoy tratando de refactorizar un cerdo de salchichas? ¿Estoy mejor recreando los trozos?

sal
fuente
1
No lo entiendo, ¿por qué no solo lo compilas en otro lugar y lo ejecutas en tu entorno objetivo (así que supongo) 1.4?
Tim Büthe
El entorno objetivo final es jboss4.2 en jdk5.
sal
2
Acerca del estado "protegido": en StackOverflow Nada dice "Gracias" o "yo también" como
voto a favor
66
Vea la gran respuesta más votada ... Ignore el 96% del resto de esta página. Búsqueda: "Nels Beckman", 1 de febrero de 2010 a las 4:09
será el
1
Lo que funcionó para mí fue editar / cambiar la biblioteca del sistema JRE del entorno de ejecución (o el espacio de trabajo predeterminado) a JRE alternativo (seleccioné la misma versión de Java). También debe asegurarse de (1) el orden correcto en la pestaña Orden y exportación , (2) el nivel de cumplimiento correcto en la configuración del compilador de Java (igual que la versión de Java seleccionada).
ADTC

Respuestas:

1884

Hay otra solución que también funciona.

  1. Ir a la ruta de compilación configuración de en las propiedades del proyecto.
  2. Eliminar la biblioteca del sistema JRE
  3. Añádelo de nuevo; Seleccione "Agregar biblioteca" y seleccione la biblioteca del sistema JRE . El valor predeterminado funcionó para mí.

Esto funciona porque tienes varias clases en diferentes archivos jar. Eliminar y volver a agregar la biblioteca JRE hará que las clases correctas sean las primeras. Si desea una solución fundamental, asegúrese de excluir los archivos jar con las mismas clases.

Para mí que tengo: javax.xml.soap.SOAPParten tres frascos diferentes: axis-saaj-1.4.jar, saaj-api-1.3.jary elrt.jar

Nels Beckman
fuente
1
¿Es un error de Eclipse o estamos accidentalmente solucionando la restricción (y violando los términos de la licencia)? Si es un error de Eclipse, ¿hay algún error archivado?
docwhat
@Doctor Nunca usé esto para ningún código que fuera particularmente importante, así que no investigé más ... Si encuentra algo, háganoslo saber.
Nels Beckman
3
@ URL87 Si hace clic con el botón derecho en la carpeta del proyecto, vaya a "Crear ruta ...", "Configurar ruta de creación", "Bibliotecas" (pestaña), debería ver "Agregar biblioteca" como uno de los botones a la derecha. Esto también me encantó, excelente respuesta
Alexei Blue
8
La mejor solución en las versiones recientes de Eclipse no es eliminar la biblioteca del sistema JRE, sino ir a la pestaña "Ordenar y exportar" y simplemente mover la biblioteca del sistema JRE al final (que es efectivamente lo que hace eliminarlo y agregarlo, pero no No es necesario eliminar y agregar para hacerlo).
user1676075
1
Esto es 2018 y la versión eclipse es 5.0. Este error / problema aún existe. Muchas gracias @NelsBeckman. Su respuesta me ha ayudado después de 3/4 de década desde que se publicó.
Aravamudhan
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html funcionó mejor para mí.

En Windows: Windows -> Preferencias -> Java -> Compilador -> Errores / Advertencias -> API obsoleta y restringida -> Referencia prohibida (reglas de acceso): -> cambiar a advertencia

En Mac OS X / Linux: Eclipse -> Preferencias -> Java -> Compilador -> Errores / Advertencias -> API obsoleta y restringida -> Referencia prohibida (reglas de acceso): -> cambiar a advertencia

scommab
fuente
62
Esto podría funcionar, pero no es una solución adecuada. En primer lugar, debe comprender por qué existía la restricción de acceso. También ocultará todos los casos futuros de esto, ¡lo cual puede ser más importante!
Adrian Mouat
1
@AdrianMouat que es prácticamente irrelevante. Si quiero que se vaya, quiero que se vaya. Pero seguramente, uno no codificará contra API no públicas, no.
stolsvik
3
@stolsvik: me has perdido; ¿Estás diciendo que la razón por la cual el problema existe es irrelevante?
Adrian Mouat
1
Tengo este problema en UN método. Me imagino el uso de un JDK alternativo (como OpenJDK es una mejor opción). Dicho esto, por un lado, "podría ser genial" una vez. NO en el código de producción. No es para un esfuerzo de diseño continuo. No puedo decirte cuántos días hombre se pierden en este tipo de ataque.
será
55
@AdrianMouat: tiene sentido. Odiaría hacer algo así en un reactor nuclear: ¿demasiado calor en la sala de control? Entonces, deshabilite todas las advertencias. Haga grandes titulares al día siguiente. : P
david blaine
67

Me encontré con el mismo problema. Encontré la respuesta en el sitio web: http://www.17ext.com .
Primero, elimine las bibliotecas del sistema JRE. Luego, vuelva a importar las bibliotecas del sistema JRE.

No sé por qué. Sin embargo, solucionó mi problema, espero que pueda ayudarlo.

sanwanxian
fuente
10
Eh, aparentemente respondiste esta pregunta de la misma manera que yo, varios meses antes. No estoy seguro de por qué no vi su respuesta en ese entonces ...
Nels Beckman
34

Supongo que está tratando de reemplazar una clase estándar que se envía con Java 5 con una en la biblioteca que tiene.

Esto no está permitido según los términos del acuerdo de licencia, sin embargo, AFAIK no se hizo cumplir hasta Java 5.

He visto esto con QName antes y lo "arreglé" eliminando la clase del jar que tenía.

EDITAR http://www.manpagez.com/man/1/java/ notas para la opción "-Xbootclasspath:"

"Las aplicaciones que usan esta opción con el fin de anular una clase en rt.jar no deben implementarse ya que hacerlo contravendría la licencia de código binario Java 2 Runtime Environment".

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

"Restricciones de tecnología Java. No puede modificar la interfaz de la plataforma Java (" JPI ", identificada como clases contenidas en el paquete" java "o cualquier subpaquete del paquete" java "), creando clases adicionales dentro del JPI o causando adición o modificación de las clases en el JPI. En el caso de que cree una clase adicional y API (s) asociadas que (i) amplíen la funcionalidad de la plataforma Java y (ii) estén expuestas a desarrolladores de software de terceros para con el propósito de desarrollar software adicional que invoque dicha API adicional, debe publicar rápidamente y de manera amplia una especificación precisa para dicha API para uso gratuito de todos los desarrolladores. No puede crear ni autorizar a sus licenciatarios para crear clases adicionales, interfaces,o subpaquetes que de alguna manera se identifican como "java", "javax", "sun" o convención similar a la especificada por Sun en cualquier designación de convención de nomenclatura ".

Peter Lawrey
fuente
2
Eso es. Uno de los frascos en la ruta tenía la clase QName. encontrar . -name "* .jar" -print -exec descomprimir -t {} \; | grep "QName" lo encontró.
sal
1
¿Podría proporcionar una referencia sobre no poder reemplazar clases que se envían con Java? Todo lo que encontré en el acuerdo de licencia fueron restricciones relacionadas con la distribución de Java, no programas de Java, pero no busqué por mucho tiempo.
Adrian Mouat
25

También recibí este error, pero mi proyecto se basa en la línea de comandos usando Maven y el compilador tycho (es un conjunto de complementos OSGi). Después de una gran cantidad de personas que tienen el mismo problema pero que lo arreglaron en Eclipse en lugar de en la línea de comando, encontré un mensaje en el foro de desarrolladores de Tycho que respondió mi pregunta, usando la configuración pom.xmlpara ignorar la advertencia del compilador sobre la restricción de acceso:

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

Puede encontrar más información en las Preguntas frecuentes de Tycho . Esto me llevó a EDADES para trabajar, así que pensé que ayudaría a cualquier otra persona que intentara solucionar estos errores de restricción de acceso desde la línea de comandos publicando esta respuesta.

Poni del alba
fuente
13
  • Vaya a la configuración de Build Path en las propiedades del proyecto. Windows -> Preferences -> Java Compiler
  • Eliminar la biblioteca del sistema JRE
  • Agregue otro JRE con una "combinación perfecta"
  • limpia y construye tu proyecto nuevamente. Funcionó para mi.
Mayur
fuente
13

Acabo de tener este problema también. Aparentemente configuré el JRE en 1.5 en lugar de 1.6 en mi ruta de compilación.

Dorus
fuente
1
Mismo problema aquí. En mi caso, uso Maven que por defecto es 1.5 si no se especifica.
Greg Haskins
Recuerde poner esto en su POM para que no vuelva a cambiar cuando se actualice. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties>
Philip Rego el
8

Además de la solución de Nels Beckman , tengo los siguientes consejos:

En Configurar ruta de compilación , tuve que reorganizar el orden de mis entradas en Ordenar y Exportar .

Además, como desarrollador de Eclipse PDE, necesitaba reorganizar el orden de mis dependencias en mi MANIFEST.MF, agregando el paquete problemático como el primero en la lista.

Jugando con estos diales, junto con ejecutar Proyecto> Limpiar en el medio, pude resolver estas advertencias.

modulitos
fuente
8

para mí así lo resuelvo:

  • ir a la ruta de compilación del proyecto actual

bajo bibliotecas

  • seleccione la " Biblioteca del sistema JRE [jdk1.8xxx]"
  • haga clic en editar
  • y seleccione "Espacio de trabajo JRE predeterminado (jdk1.8xx)" O JRE alternativo
  • Haga clic en terminar
  • Haga clic en Aceptar

ingrese la descripción de la imagen aquí

Nota: asegúrese de que en Eclipse / Preferencias (NO el proyecto) / Java / JRE instalado, que el jdk apunte a la carpeta JDK, no al JRE C: \ Archivos de programa \ Java \ jdk1.8.0_74

ingrese la descripción de la imagen aquí

prueba de uso
fuente
El mío ya estaba en 1.7 ... 79, así que estaba en pánico. Pero simplemente lo seleccioné de nuevo, hice clic en Aplicar y el error desapareció. Uf.
Marvo
Guau. Esto también ayudó aquí: cambiar de un "entorno de ejecución" a un "JRE alternativo". Si alguien tiene alguna explicación lógica para esto ... (aquí ocurrió después de cambiar el proyecto-faucet Java de 1.5 (5.0 en el archivo de configuración .settings) a 1.8. Cambiar de error a advertencia en las preferencias globales (ver otra respuesta) no ayuda: aún errores. Se trata de antiguas clases de sol que usamos del paquete com.sun.image.codec. *)
hyphan
6

Perdón por actualizar una vieja POST. Recibí el problema informado y lo resolví como se indica a continuación.

Suponiendo que está utilizando Eclipse + m2e maven plugin, si obtiene este error de restricción de acceso, haga clic derecho en el proyecto / módulo en el que tiene el error -> Propiedades -> Ruta de compilación -> Biblioteca -> Reemplazar JDK / JRE al que se usa en el espacio de trabajo de eclipse.

Seguí los pasos anteriores y el problema está resuelto.

Arun B Chandrasekaran
fuente
Es justo, pero básicamente ha replicado la redacción de la respuesta aceptada por Nels Beckman.
Steven Wolfe
5

En el caso de que esté seguro de que debería poder acceder a una clase determinada, esto puede significar que agregó varios frascos a su proyecto que contienen clases con nombres idénticos (o rutas) pero contenido diferente y se eclipsan entre sí (generalmente una antigua costumbre build jar contiene una versión anterior incorporada de una biblioteca de terceros).

Por ejemplo, cuando agrega una implementación jar:

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

pero también una versión anterior que solo implementa:

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

Todo funciona bien en el editor de código, pero falla durante la compilación si la biblioteca "antigua" eclipsa a la nueva: d2 de repente resulta "faltante o inaccesible" incluso cuando está allí.

La solución es verificar el orden de las bibliotecas en tiempo de compilación y asegurarse de que la que tenga la implementación correcta vaya primero.

Señor napik
fuente
4

Vaya a Java Build Path en las propiedades del proyecto. Elimine la biblioteca del sistema JRE existente. Luego, agréguela nuevamente, es decir, Agregar biblioteca -> JRE Lib - seleccione jre ---> Finalizar. Por último, seleccione el orden y la pestaña de exportación, seleccione JRE Lib y avance en la parte superior. Eso es.

Vijay Bhatt
fuente
3

Simplemente cambie el orden de las bibliotecas de ruta de compilación de su proyecto. Haga clic con el botón derecho en proyecto> Ruta de compilación> Configurar ruta de compilación> Seleccionar orden y exportar (pestaña)> Cambiar el orden de las entradas. Espero que mover la "biblioteca del sistema JRE" al fondo funcione. Funcionó así para mí. Fácil y simple ... !!!

Samitha Chathuranga
fuente
3

En mi caso, hubo una falta de coincidencia entre la ruta de compilación JRE y JRE instalado en el entorno de ejecución. Me mudé a Proyecto> Propiedades> compilador de Java. Había un mensaje de advertencia en la parte inferior.

Hice clic en los enlaces 'JRE instalado', 'Entorno de ejecución', 'Ruta de compilación de Java' y cambié la versión de JDK a 1.7 y desapareció la advertencia.

Soumyajit Swain
fuente
0

Agregar un sistema JRE correcto a través de la ruta de compilación es la solución, pero su eclipse aún puede tener el error. Para resolver eso, vaya a Ruta de compilación de Java -> Ordenar y exportar y mueva su biblioteca del sistema JRE en la parte superior. Esto ha resuelto mi problema.

Abhishek Soni
fuente