47 votes

EclipseLink 2.7.0 et JPA API 2.2.0 - incompatibilité de signature

Lors de l'exécution d'un projet construit par maven avec les dépendances suivantes:

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

J'obtiens l'erreur suivante lors de l'exécution:

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

Le javax.persistance-2.2.0 artefact est signée et contient l'javax.persistence.Cacheable.class annotation, tandis que le eclipselink-2.7.0 artefact est pas signée et contient également de la même classe java annotation.

Comment cela peut-il être fixé?

Modifier

Remplacement de la javax.la persistance de l'artefact version 2.2.0 par la version 2.1.1 résout le problème (celui-ci n'est pas signé), mais je ne suis pas sûr que c'est une situation normale.

38voto

George Hawkins Points 4986

Merci Stéphane - le montage à la fin de votre question m'a aidé à "fixer" le même problème. Pour quelqu'un d'autre qui frappe également - ici est une expansion de réponse. C'est ce que vous avez besoin de "réparer" les choses dans votre pom (jusqu'à Eclipse arranger les choses correctement):

<!-- See https://stackoverflow.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>

Ce tire en eclipselink , mais exclut l' javax.persistence dépendance qu'il tente de retirer et de le remplacer par une version antérieure d' javax.persistence qui n'ont pas la signature du problème.

De côté: javax.persistence version 2.2.0 est explicitement tirée vers l'arrière, dans le pom fragment montré dans la question d'origine, malgré déjà une dépendance transitive d' eclipselink.

Explication

Résumé - eclipselink artefact dépend javax.persistence et contiennent des classes qui sont dans le paquet javax.persistence. Cependant, l' javax.persistence pot est signé et que l' eclipselink l'un ne l'est pas. Donc le Java runtime va se plaindre, lors du chargement d'une classe du package javax.persistence dans la eclipselink pot, que c'est l'absence de signature ne correspond pas avec les classes déjà chargés à partir du même package dans l' javax.persistence pot.

Détails - si j'ai mis un point d'arrêt en java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V) , avec la condition "javax.persistence".equals(arg0) alors que je vois qu' javax.persistence est mappé à la suite de CodeSource valeur:

(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
  ...

I. e. javax.persistence-2.2.0.jar est signé par la Fondation Eclipse et contient des classes dans le package javax.persistence. Ce pot est tiré lors d'une partie de ma demande (en fait quelque chose de profond au Printemps logique) essaie de charger javax.persistence.EntityManagerFactory.

Si je puis placer un point d'arrêt en java.lang.ClassLoader.checkCerts(String, CodeSource) sur le throw new SecurityException ligne je vois ensuite qu'il rencontre cette ligne quand passé en CodeSource est:

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

I. e. eclipselink-2.7.0.jar également contenir des classes qui sont dans l' javax.persistence package, mais il n'est pas signé si un choc se produit qui entraîne une SecurityException d'être jeté. Cela se produit lorsque quelque chose (aussi profond au Printemps logique) essaie de charger javax.persistence.PersistenceUtil.

Si je regarde la sortie de l' mvn dependency:tree je vois que cette différence semble être en panne d' eclipselink lui - même: il est en tirant en org.eclipse.persistence:javax.persistence:jar:2.2.0 lui-même. I. e. ce n'est pas un clash avec quelques autres de la dépendance:

[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

J'ai enregistré ce maintenant au bugs.eclipse.org - voir le bug 525457.

20voto

Obinna Kalu Points 573

Pour résoudre ce problème, insérez la dépendance conforme à JPA 2.2 appropriée pour EclipseLink 2.7.x, dans votre fichier PAV maven, en tant que:

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

3voto

lukasj Points 106

eclipselink.jar en tant que telle est conçu comme un tout-en-un bundle, pas osgi activé jar contenant toutes les partsof eclipselink projet (c'est à dire de la sdo, oracle db choses spécifiques, dbws, nosql...) avec possibilité d'exécuter avec l'api jpa 2.0 sur le chemin de la classe, au moins 2.x versions. Dans de nombreux cas, ce n'est pas nécessaire et approprié des composants peuvent être utilisés à la place, comme org.eclipse.la persistance.jpa, org.eclipse.la persistance.oracle etc. Pour la liste complète voir ie: http://search.maven.org/#search%7Cga%7C1%7Corg.eclipse.persistence

1voto

Rick Points 11

J'ai corrigé cela en changeant l'ordre d'affichage des jars dans le classpath. Dans mon cas, j'utilise Tomcat et j'ai dû modifier catalina.properties pour mettre javax avant eclipselink.

1voto

Alfred Pontiac Points 33

Obinna réponse est bonne; je suppose qu'il y avait un problème avec eclipselink 2.7.x –George indiqué. J'ai eu un problème similaire lors de la mise eclipselink, mais c'était juste un mauvais objets. Initialement décrit problème semble être le résultat de l'extérieur de référencement javax.la persistance n'est certainement pas nécessaire.

Bon maven configuration peut être trouvé dans eclipselink wiki: https://wiki.eclipse.org/EclipseLink/Maven

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X