回答:
これは、同じパッケージに属するクラスが異なるJARファイルからロードされ、それらのJARファイルに異なる証明書で署名されている場合、またはおそらく、少なくとも1つは署名され、他の1つ以上は署名されていない場合(ロードされたクラスを含む)これらのAFAIKは署名できないため、ディレクトリから)。
したがって、すべてのJAR(または少なくとも同じパッケージのクラスを含むJAR)が同じ証明書を使用して署名されていることを確認するか、パッケージが重複しているJARファイルのマニフェストから署名を削除してください。
それを回避する簡単な方法は、インポートされたjarファイルの順序を(Eclipse)から変更できるようにすることです。パッケージを右クリック->ビルドパス->ビルドパスの構成->参照とライブラリ->注文とエクスポート。署名ファイルを含むjarの順序を変更してみてください。
A. mavenを使用する場合、衝突するjarをデバッグする便利な方法は次のとおりです。
mvn dependency:tree
たとえば、例外の場合:
java.lang.SecurityException: class "javax.servlet.HttpConstraintElement"'s signer information does not match signer information of other classes in the same package
私たちはします:
mvn dependency:tree|grep servlet
その出力:
[INFO] +- javax.servlet:servlet-api:jar:2.5:compile
[INFO] +- javax.servlet:jstl:jar:1.2:compile
[INFO] | +- org.eclipse.jetty.orbit:javax.servlet.jsp:jar:2.2.0.v201112011158:compile
[INFO] | +- org.eclipse.jetty.orbit:javax.servlet.jsp.jstl:jar:1.2.0.v201105211821:compile
[INFO] | +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.0.0.RC2:compile
は、servlet-api 2.5とjavax.servlet 3.0.0.xの衝突を示しています。
B.その他の有用なヒント(セキュリティ例外をデバッグする方法とmaven depを除外する方法)は、署名者情報が一致しない場合の質問です。
私の場合、ライブラリパス:SにBouncyCastleのJARバージョンが重複していた
私は同様の例外がありました:
java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
根本的な問題は、Hamcrestライブラリを2回インクルードしたことです。Maven pomファイルを使用した後。また、JUnit 4ライブラリ(これにもHamcrestライブラリが含まれています)をプロジェクトのビルドパスに追加しました。ビルドパスからJUnitを削除するだけで、すべて問題なく動作しました。
これは、CGLIBがアプリケーションターゲットクラスの署名者情報の代わりに独自の署名者情報を使用するため、cglibがインストルメント化されたプロキシで発生する可能性があります。
名前:net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c lass SHA-256-Digest:q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =
Eclipseで実行している場合は、ビルドパスに追加されたプロジェクトのjarファイルを確認してください。または、control-shift-Tを実行して、同じ名前空間に一致する複数のjarをスキャンします。次に、プロジェクトのビルドパスから冗長または古いjarを削除します。
少し古いスレッドですが、私はこれにかなりの時間立ち往生していたので、ここに修正があります(それが誰かを助けることを願っています)
私のシナリオ:
パッケージ名は、com.abc.defです。このパッケージのクラスを含む2つのjarファイルがjar1とjar2です。つまり、いくつかのクラスはjar1にあり、他のクラスはjar2にあります。これらのjarファイルは、同じキーストアを使用して署名されていますが、ビルドの異なる時点で(つまり個別に)署名されています。その結果、jar1とjar2のファイルの署名が異なるようです。
すべてのファイルをjar1に入れ、それらをすべて一緒にビルド(および署名)しました。問題はなくなります。
PS:パッケージ名とjarファイル名は単なる例です
bouncycastle.orgからすべてのjarを追加した場合(私の場合は、crypto-159.zipから)、該当しないJDKのjarを削除してください。冗長性があります。おそらく「jdk15on」jarだけが必要です。
直せた。
根本原因:これは、署名付きjarでSun JAXB実装を使用する場合の一般的な問題です。基本的に、JAXB実装は、リフレクションを使用せずにプロパティに直接アクセスするクラスを生成することにより、リフレクションを回避しようとしています。残念ながら、この新しいクラスは、アクセスされているクラスと同じパッケージに生成されます。これは、このエラーの原因です。
解決策:次のシステムプロパティを追加して、署名されたjarと互換性のないJAXB最適化を無効にします。-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true
これは、JUnit +安心+ hamcrestを使用しているときに発生しました。この場合、ビルドパスにjunitを追加しないでください。Mavenプロジェクトがある場合、これで解決しました。以下はpom.xmlです。
<dependencies>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>