通常どおりクラスを再コンパイルすると、突然次のエラーメッセージが表示されました。どうして?どうすれば修正できますか?
Java.lang.SecurityException: class "Chinese_English_Dictionary"'s signer information does not match signer information of other classes in the same package
at Java.lang.ClassLoader.checkCerts(ClassLoader.Java:776)
これは、同じパッケージに属するクラスが異なるJARファイルからロードされ、それらのJARファイルに異なる証明書で署名された署名がある場合に発生します。これらの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依存関係を除外する方法)は、 署名者情報が一致しない の質問にあります。
私の場合、ライブラリパスでBouncyCastleのJARバージョンを複製しました:S
私は同様の例外がありました:
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 las SHA-256-Digest:q3B5wW + hLX/+ lP2 + L0/6wRVXRHq1mISBo1dkixT6Vxc =
Eclipseで実行している場合は、ビルドパスに追加されたプロジェクトのjarを確認してください。または、control-shift-Tを実行して、同じ名前空間に一致する複数のjarをスキャンします。次に、プロジェクトのビルドパスから冗長または古いjarを削除します。
少し古すぎるスレッドですが、私はこれでかなりの時間スタックしていたので、ここに修正があります(誰かに役立つことを願っています)
私のシナリオ:
パッケージ名はcom.abc.defです。このパッケージのクラスを含むjar1とjar2を含む2つのjarファイルがあります。つまり、jar1にあるクラスとjar2にあるクラスがあります。これらのjarファイルは、同じキーストアを使用して署名されますが、ビルドの異なる時点で(つまり個別に)署名されます。その結果、jar1とjar2のファイルの署名が異なるようです。
すべてのファイルをjar1に入れて、それらをすべて一緒にビルド(および署名)しました。問題はなくなります。
PS:パッケージ名とjarファイル名は単なる例です
私の場合、パッケージ名の競合でした。現在のプロジェクトと署名された参照ライブラリには、package.foo.utils
という共通のパッケージが1つありました。現在のプロジェクトでエラーが発生しやすいパッケージ名を別の名前に変更しただけです。
Bouncycastle.orgのすべてのjar(私の場合はcrypto-159.Zipから)を追加した場合は、該当しないJDKのjarを削除してください。冗長性があります。おそらく「jdk15on」jarのみが必要です。
これは、特に同じファイルの2つの異なるバージョンである場合、異なる名前または異なる場所から1つのファイルを2回含める場合にも発生します。
修正できました。
根本原因:これは、署名付きjarでSun JAXB実装を使用する場合の一般的な問題です。基本的に、JAXB実装は、リフレクションを使用せずにプロパティに直接アクセスするクラスを生成することにより、リフレクションを回避しようとしています。残念ながら、このエラーの発生源であるアクセス対象のクラスと同じパッケージにこの新しいクラスが生成されます。
解決策:次のシステムプロパティを追加して、署名付きjarと互換性のないJAXB最適化を無効にします。-Dcom.Sun.xml.bind.v2.bytecode.ClassTailor.noOptimize = true
@Mohit Phougatの応答に基づいて、@ Grabアノテーションを使用してGroovyを実行している場合は、そのようなアノテーションを並べ替えることができます。
この質問は長い間続きましたが、私は何かを売り込みたいです。私はSpringプロジェクトの課題に取り組んでおり、Eclipse IDEでそれを発見しました。 Spring Boot Rest APIにMavenまたはGradleを使用している場合、ビルドパスからJunit 4または5を削除し、pom.xmlまたはGradleビルドファイルにJunitを含める必要があります。これはyml設定ファイルにも当てはまると思います。