次の依存関係でmavenによってビルドされたプロジェクトを実行する場合:
<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>
実行時に次のエラーが表示されます。
Java.lang.SecurityException: class "javax.persistence.Cacheable"'s signer information does not match signer information of other classes in the same package
Javax.persistence-2.2.0アーティファクトは署名され、javax.persistence.Cacheable.classアノテーションが含まれていますが、eclipselink-2.7.0アーティファクトはnotであり、同じJavaクラス注釈。
これはどのように修正できますか?
編集
Javax.persistenceアーティファクトバージョン2.2.0をバージョン2.1.1に置き換えると問題が修正されます(これは署名されていません)が、それが正常な状態かどうかはわかりません。
ステファンに感謝します-質問の最後の編集は同じ問題を「修正」するのに役立ちました。これをヒットした他の人のために-ここに拡張された答えがあります。これは、pomの「修正」に必要なものです(Eclipseが適切に修正するまで):
<!-- 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>
これはeclipselink
をプルしますが、プルしようとするjavax.persistence
依存関係を除外し、署名の問題がないjavax.persistence
の以前のバージョンに置き換えます。
余談:javax.persistence
バージョン2.2.0
は、既にeclipselink
の推移的な依存関係であるにもかかわらず、元の質問で示したpomフラグメントに明示的に取り込まれています。
要約-eclipselink
アーティファクトはjavax.persistence
に依存し、両方ともパッケージjavax.persistence
にあるクラスを含みます。ただし、javax.persistence
jarは署名されていますが、eclipselink
jarは署名されていません。したがって、Javaランタイムは、eclipselink
jarのパッケージjavax.persistence
からクラスをロードするときに、署名の欠如がjavax.persistence
の同じパッケージからすでにロードされたクラスと一致しないと文句を言います。瓶。
詳細-Java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V)
に条件"javax.persistence".equals(arg0)
でブレークポイントを配置すると、javax.persistence
が次の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
...
つまりjavax.persistence-2.2.0.jar
はEclipse Foundationによって署名され、パッケージjavax.persistence
にクラスが含まれています。このjarは、アプリケーションの一部(実際にはSpringロジックの深い部分)がjavax.persistence.EntityManagerFactory
をロードしようとすると取り込まれます。
次に、throw new SecurityException
行のJava.lang.ClassLoader.checkCerts(String, CodeSource)
にブレークポイントを配置すると、CodeSource
で渡された値が次の場合にこの行にヒットすることがわかります。
(file:/Users/georgehawkins/.m2/repository/org/Eclipse/persistence/eclipselink/2.7.0/eclipselink-2.7.0.jar <no signer certificates>)
つまりeclipselink-2.7.0.jar
には、javax.persistence
パッケージに含まれるクラスも含まれていますが、署名されていないため、衝突が発生し、SecurityException
がスローされます。これは、何か(Springロジックの奥深く)がjavax.persistence.PersistenceUtil
をロードしようとしたときに発生します。
mvn dependency:tree
の出力を見ると、この不一致はeclipselink
自体にあるようです-org.Eclipse.persistence:javax.persistence:jar:2.2.0
自体を引き込んでいます。つまり他の依存関係と衝突することはありません。
[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
これをbugs.Eclipse.orgで記録しました-バグ 525457 を参照してください。
この問題を修正するには、EclipseLink 2.7.xの正しいJPA 2.2準拠の依存関係をmaven pomファイルに次のように追加します。
<dependency>
<groupId>org.Eclipse.persistence</groupId>
<artifactId>org.Eclipse.persistence.jpa</artifactId>
<version>2.7.1</version>
</dependency>
eclipselink.jar自体はオールインワンバンドルとして設計されており、クラスパスでjpa api 2.0を使用して実行できるeclipselinkプロジェクトのすべての部分(sdo、Oracle db固有のもの、dbws、nosql ..)を含むosgi対応jarではありません。 -少なくとも2.xバージョン。多くの場合、これは必要ではなく、代わりにorg.Eclipse.persistence.jpa、org.Eclipse.persistence.Oracleなどの適切なコンポーネントを使用できます。完全なリストについては、以下を参照してください。 http:// search .maven.org /#search%7Cga%7C1%7Corg.Eclipse.persistence
私のプロジェクトはJDK-8で動作していましたが、openJDK-11にアップグレードすると動作しなくなりました。 jpa-persistence
モジュールを除外して解決し、バージョン2.2
に再度追加しました。
dependencies.create('org.Eclipse.persistence:eclipselink:2.7.4') {
exclude module: "javax.persistence"
},
'javax.persistence:javax.persistence-api:2.2', //add it again, manually
'org.Eclipse.persistence:org.Eclipse.persistence.asm:2.7.4',
'org.Eclipse.persistence:org.Eclipse.persistence.antlr:2.7.4',
'org.Eclipse.persistence:org.Eclipse.persistence.moxy:2.7.4',
'org.Eclipse.persistence:org.Eclipse.persistence.core:2.7.4'
これを修正するには、jarがクラスパスに表示される順序を切り替えます。私の場合、Tomcatを使用しており、eclipselinkの前にjavaxを配置するようにcatalina.propertiesを変更する必要がありました。
オビンナの答えは正しいです。ジョージが示したように、eclipselink 2.7.xに問題があったと思います。 eclipselinkをアップグレードするときに同様の問題がありましたが、それは単なる間違ったアーティファクトでした。最初に説明した問題は、外部でjavax.persistenceレベルを参照した結果のようです-絶対に必要ではありません。
適切なMaven構成は、eclipselink wikiにあります。 https://wiki.Eclipse.org/EclipseLink/Maven
私の場合、Mavenを使用せずに、単純なJPAの例を実行しようとするだけで、この奇妙な状況はまだ存在しているようです(そして、それを達成するだけの時間が必要な場合は本当にイライラします)。
1月の2.7.4では、クラスパスのZipからeclipselink.jarおよびjakarta.persistence_2.2.2.jarを配置すると、このエラーが発生します。
最終的な解決策は、クラスパスの順序を変更することでした。最初はjakarta-persistenceで、その後はeclipselink-jarです。そのため、すべてのjavax.persistenceクラスはjakarta-jarから取得され、eclipselink-jarの一部ではありません(含まれている場合)。
だから本当にいろいろなことを考えています。
Eclipselinkパッケージはオールインワンである必要がありますか?そうではありません。いくつかのjavax.persistenceクラスが含まれています。その他ではない-EntityManagerのようなJPAコードで使用される基本クラス。もちろん、Zipに含まれるjakarta-jarと一緒に完成しますが、クラスパスで「間違った」順序と一緒に2つのjarを使用することはできません!?私は本当にこれをバグだと考えています-または、少なくともパッケージにはこれに関する大きなヒントがあるはずです。
ここで提案されているMavenのorg.Eclipse.persistence.jpa-2.7.4.jarとは何ですか?このエラーメッセージではなく、eclipselink.jarの問題はあります。ただし、Eclipselink JPA実装が含まれていないようにも見えます。少なくとも実行すると、コードで参照されているpersistence-unitが存在しないというエラーが発生します(eclipselink.jarで動作するpersistence.xmlと同じ)。
奇妙な状況。
また、Mavenを使用していないという点で、私の場合は少し異なりますが、この問題に遭遇します。ただし、自分の状況でこれに対処する方法についてのアイデアを人々に与えるかもしれないので、ここに答えを掲載します。結局、タイトルはこの不一致に関するものであり、一般に、Mavenを使用する場合の1つのサブケースです。
NetBeansプロジェクトでeclipselinkを使用しています。最初は、両方のeclipselink jarファイル(eclipselink-2.7.0.jar
)および必要なorg.Eclipse.persistence jarファイルをプロジェクトの外部ライブラリとして使用します。上記の Sergey および entreprenr によるコメントは、実際に問題を解決するために私を導くものです。私がしなければならなかったのは、eclipselink jarファイルを含むnotを含む新しいライブラリを作成することでした(ツール->ライブラリ->新しいライブラリ...)すなわちeclipselink-2.7.0.jar
はライブラリに追加されません)、プロジェクトに必要な特定のorg.Eclipse.persistence jarファイルのみ。 org.Eclipse.persistence.antlr-2.7.0.jar
、org.Eclipse.persistence.asm-2.7.0.jar
、org.Eclipse.persistence.core-2.7.0.jar
、org.Eclipse.persistence.jpa.modelgen.processor-2.7.0.jar
、org.Eclipse.persistence.jpa-2.7.0.jar
など。その後、このライブラリをプロジェクトに追加すると、例外はなくなりました。
もちろん、サーバー上のすべてのorg.Eclipse.persistence jarファイルを2.7.0バージョンに置き換え、javax.persistence.jar
その2.2.0バージョン(payaraを使用しているため、これらは<payara_home>\glassfish\modules
)。
プロジェクトビルドでgradleを使用しており、OPの問題を解決するために、私も同様に、次の作業セットアップを使用しました。
dependencies {
testImplementation(group: 'org.Eclipse.persistence', name: 'eclipselink', version: '2.7.4') {
exclude group: 'javax.validation', module: 'validation-api'
exclude group: 'org.Eclipse.persistence', module: 'javax.persistence'
exclude group: 'org.Eclipse.persistence', module: 'commonj.sdo'
exclude group: 'org.Eclipse.persistence', module: 'jakarta.persistence'
}
testImplementation(group: 'org.Eclipse.persistence', name: 'org.Eclipse.persistence.jpa', version: '2.7.4') {
exclude group: 'org.Eclipse.persistence', module: 'jakarta.persistence'
}
}
「testImplementation」の代わりに、必要な依存関係タイプを使用できます。
セルゲイのコメントを読んだ後、私はこれを次のように使用することで改善しました。
dependencies {
testImplementation group: 'org.Eclipse.persistence', name: 'org.Eclipse.persistence.jpa', version: '2.7.4'
}
最後のものが最善の解決策だと思います。
Tomcatのみを使用するとこの問題に対する答えが見つからず、このスレッドがこの問題とリンクしていることが多いため、ここに解決策を投稿します。
署名はMANIFEST.MFにあるため、7ZipまたはWinRARを使用して.jarファイルの署名を変更して開くか、単に両方の.jarのMETA-INFファイルから削除してから、変更したファイルをIDEにインポートできます。
Signature-Mismatch-Problemの便利なスレッドは次のスレッドです。 Java SecurityException:署名者情報が一致しません