Vraag EclipseLink 2.7.0 en JPA API 2.2.0 - niet-overeenkomende handtekening


Bij het uitvoeren van een door maven gebouwd project met de volgende afhankelijkheden:

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

Ik krijg de volgende fout tijdens runtime:

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

Het javax.persistence-2.2.0-artefact is ondertekend en bevat de javax.persistence.Cacheable.class-annotatie, terwijl het eclipselink-2.7.0-artefact is niet ondertekend en bevat ook dezelfde annotatie voor java-klassen.

Hoe kan dit worden opgelost?

Bewerk

Vervanging van de javax.persistence artefact versie 2.2.0 door de versie 2.1.1 lost het probleem op (deze is niet ondertekend), maar ik weet niet zeker of dit een normale situatie is.


26
2017-08-24 20:57


oorsprong


antwoorden:


Bedankt Stéphane - de bewerking aan het einde van je vraag heeft me geholpen hetzelfde probleem op te lossen. Voor iedereen die dit ook aanslaat - hier is een uitgebreid antwoord. Dit is wat je nodig hebt om dingen in je pom "op te lossen" (totdat Eclipse dingen goed oplost):

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

Dit trekt in eclipselink maar sluit de javax.persistence afhankelijkheid die het probeert in te trekken en vervangt door een eerdere versie van javax.persistence dat heeft niet het ondertekeningsprobleem.

terzijde: javax.persistence versie 2.2.0 wordt expliciet ingetrokken, in het pom-fragment dat in de oorspronkelijke vraag wordt getoond, ondanks dat het al een transitieve afhankelijkheid van is eclipselink.

Uitleg

Samenvatting - het eclipselink artefact hangt af van javax.persistence en beide bevatten klassen die in het pakket zitten javax.persistence. Echter, de javax.persistence de pot is ondertekend terwijl de eclipselink dat is het niet. Dus de Java-runtime zal klagen bij het laden van een klasse uit het pakket javax.persistence in de eclipselink jar dat het gebrek aan ondertekening niet overeenkomt met klassen die al zijn geladen vanuit hetzelfde pakket in de javax.persistence pot.

Details - als ik een breekpunt insteek java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V) met voorwaarde "javax.persistence".equals(arg0) dan zie ik dat javax.persistence is toegewezen aan het volgende CodeSource waarde:

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

D.w.z. javax.persistence-2.2.0.jar is ondertekend door de Eclipse Foundation en bevat lessen in het pakket javax.persistence. Deze pot wordt ingetrokken wanneer een deel van mijn applicatie (eigenlijk iets diep in Spring-logica) probeert te laden javax.persistence.EntityManagerFactory.

Als ik dan een breekpunt insteek java.lang.ClassLoader.checkCerts(String, CodeSource) op de throw new SecurityException regel zie ik vervolgens dat deze regel wordt weergegeven wanneer deze wordt doorgegeven CodeSource is:

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

D.w.z. eclipselink-2.7.0.jar bevatten ook klassen die in de javax.persistence pakket, maar het is niet ondertekend, zodat er een clash optreedt die resulteert in een SecurityException wordt gegooid. Dit gebeurt wanneer iets (ook diep in de logica van Spring) probeert te laden javax.persistence.PersistenceUtil.

Als ik naar de uitvoer kijk van mvn dependency:tree Ik zie dat deze mismatch lijkt te zijn eclipselink zelf - het trekt erin org.eclipse.persistence:javax.persistence:jar:2.2.0 zelf. D.w.z. het is geen enkele botsing met een andere afhankelijkheid:

[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

Ik heb dit nu geregistreerd op bugs.eclipse.org - zie bug 525.457.


23
2017-10-02 13:14



Om dit probleem te verhelpen, plaatst u de juiste JPA 2.2-compatibele afhankelijkheid voor EclipseLink 2.7.x in uw bestand maven pom als:

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

5
2018-06-18 06:20



eclipselink.jar is als zodanig ontworpen als een alles-in-één-bundel, niet als een osgi-geactiveerde pot die alle delen van het eclipselink-project bevat (dwz sdo, oracle db specifieke dingen, dbw's, nosql ..) met de mogelijkheid om met jpa api 2.0 op het klassenpad te draaien - tenminste in 2.x-versies. In veel gevallen is dit niet nodig en kunnen de juiste componenten worden gebruikt, zoals org.eclipse.persistence.jpa, org.eclipse.persistence.oracle enz. Voor de volledige lijst zie ie: http://search.maven.org/#search%7Cga%7C1%7Corg.eclipse.persistence


1
2017-07-16 08:46



Ik heb dit opgelost door de volgorde te wijzigen waarin de potten in het klassenpad verschijnen. In mijn geval gebruik ik Tomcat en moest ik catalina.properties aanpassen om javax vóór eclipselink te plaatsen.


0
2018-06-23 18:56



Het antwoord van Obinna is correct; Ik veronderstel dat er een probleem was met eclipselink 2.7.x - zoals George aangaf. Ik had een soortgelijk probleem bij het upgraden van eclipselink, maar het waren gewoon verkeerde artefacten. Het in eerste instantie beschreven probleem lijkt het gevolg te zijn van extern verwezen naar het javax.persistentieniveau - het is absoluut niet nodig.

De juiste configuratie van maven is te vinden in eclipselink wiki: https://wiki.eclipse.org/EclipseLink/Maven


0
2017-07-27 09:55