java jpa eclipselink jpa-2.2

java - EclipseLink 2.7.0 y JPA API 2.2.0-discrepancia de firma



jpa-2.2 (5)

Arreglé esto cambiando el orden en el que aparecen los frascos en el classpath. En mi caso, estoy usando Tomcat y tuve que modificar catalina.properties para poner javax antes de eclipselink.

Al ejecutar un proyecto construido por maven con las siguientes dependencias:

<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.0</version> </dependency>

Me sale el siguiente error en tiempo de ejecución:

java.lang.SecurityException: class "javax.persistence.Cacheable"''s signer information does not match signer information of other classes in the same package

El artefacto javax.persistence-2.2.0 está firmado y contiene la anotación javax.persistence.Cacheable.class, mientras que el artefacto eclipselink-2.7.0 no está firmado y también contiene la misma anotación de clase java.

¿Cómo se puede arreglar esto?

Editar

Reemplazar el artefacto javax.persistence versión 2.2.0 por la versión 2.1.1 soluciona el problema (este no está firmado), pero no estoy seguro de que sea una situación normal.


Gracias Stéphane: la edición al final de tu pregunta me ayudó a "arreglar" el mismo problema. Para cualquier persona que también golpee esto, aquí hay una respuesta ampliada. Esto es lo que necesita para "arreglar" las cosas en su pom (hasta que Eclipse arregle las cosas correctamente):

<!-- See https://.com/q/45870753 --> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.0</version> <exclusions> <exclusion> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> <version>2.1.1</version> </dependency>

Esto atrae a eclipselink pero excluye la dependencia javax.persistence que intenta extraer y la reemplaza con una versión anterior de javax.persistence que no tiene el problema de firma.

Además: javax.persistence versión 2.2.0 se incluye explícitamente en el fragmento pom que se muestra en la pregunta original, a pesar de que ya es una dependencia transitiva de eclipselink .

Explicación

Resumen: el artefacto eclipselink depende de javax.persistence y ambos contienen clases que están en el paquete javax.persistence . Sin embargo, el javax.persistence jar está firmado, mientras que el eclipselink no está firmado. Entonces, el tiempo de ejecución de Java se quejará, al cargar una clase del paquete javax.persistence en el eclipselink , que la falta de firma no coincide con las clases ya cargadas del mismo paquete en el javax.persistence .

Detalles: si pongo un punto de interrupción en java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V) con la condición "javax.persistence".equals(arg0) , veo que javax.persistence se asigna al siguiente valor de CodeSource :

(file:/Users/georgehawkins/.m2/repository/org/eclipse/persistence/javax.persistence/2.2.0/javax.persistence-2.2.0.jar [ [ Version: V3 Subject: CN="Eclipse Foundation, Inc.", OU=IT, O="Eclipse Foundation, Inc.", L=Ottawa, ST=Ontario, C=CA Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 ...

Es decir, javax.persistence-2.2.0.jar está firmado por Eclipse Foundation y contiene clases en el paquete javax.persistence . Este archivo se extrae cuando alguna parte de mi aplicación (en realidad algo profundo en la lógica de Spring) intenta cargar javax.persistence.EntityManagerFactory .

Si luego pongo un punto de interrupción en java.lang.ClassLoader.checkCerts(String, CodeSource) en la throw new SecurityException línea throw new SecurityException , veo que golpea esta línea cuando se pasa en CodeSource :

(file:/Users/georgehawkins/.m2/repository/org/eclipse/persistence/eclipselink/2.7.0/eclipselink-2.7.0.jar <no signer certificates>)

Es decir, eclipselink-2.7.0.jar también contiene clases que están en el paquete javax.persistence , pero no está firmado, por lo que se produce un choque que da lugar a una excepción SecurityException . Esto sucede cuando algo (también profundo en la lógica de Spring) intenta cargar javax.persistence.PersistenceUtil .

Si mvn dependency:tree la salida de mvn dependency:tree , veo que esta falta de coincidencia parece ser un eclipselink sí mismo: está tirando org.eclipse.persistence:javax.persistence:jar:2.2.0 sí. Es decir, no es un choque con alguna otra dependencia:

[INFO] | /- org.eclipse.persistence:eclipselink:jar:2.7.0:compile [INFO] | +- org.eclipse.persistence:javax.persistence:jar:2.2.0:compile [INFO] | +- org.eclipse.persistence:commonj.sdo:jar:2.1.1:compile [INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile [INFO] | /- org.glassfish:javax.json:jar:1.0.4:compile

He registrado esto ahora en bugs.eclipse.org - ver error 525457 .


La respuesta de Obinna es correcta; Supongo que hubo un problema con eclipselink 2.7.x, como indicó George. Tuve un problema similar al actualizar eclipselink, pero solo fueron artefactos incorrectos. El problema descrito inicialmente parece ser el resultado de una referencia externa al nivel javax.persistence; definitivamente no es necesario.

Puede encontrar la configuración adecuada de maven en la wiki de eclipselink: https://wiki.eclipse.org/EclipseLink/Maven


Para solucionar este problema, coloque la dependencia compatible con JPA 2.2 correcta para EclipseLink 2.7.x, en su archivo pven maven, como:

<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa</artifactId> <version>2.7.1</version> </dependency>


eclipselink.jar como tal está diseñado como un paquete todo-en-uno, no un frasco con osgi que contiene todas las partes del proyecto eclipselink (es decir, cosas específicas de sdo, oracle db, dbws, nosql ..) con capacidad de ejecutarse con jpa api 2.0 en el classpath - Al menos en las versiones 2.x. En muchos casos, esto no es necesario y se pueden usar componentes adecuados, como org.eclipse.persistence.jpa, org.eclipse.persistence.oracle, etc. Para obtener la lista completa, consulte: http://search.maven.org/#search%7Cga%7C1%7Corg.eclipse.persistence