我像往常一样重新编译了我的类,突然收到以下错误消息。为什么?我该如何解决?
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)
答案 0 :(得分:122)
当属于同一个包的类从不同的JAR文件加载时会发生这种情况,并且这些JAR文件具有使用不同证书签名的签名 - 或者更常见的是,至少有一个签名,一个或多个其他签名不是(其中包括从目录加载的类,因为那些AFAIK无法签名)。
因此要么确保所有JAR(或者至少包含来自相同软件包的类的JAR)使用相同的证书进行签名,要么删除带有重叠包的JAR文件清单中的签名。
答案 1 :(得分:42)
一个简单的方法就是尝试更改导入的jar文件的顺序,这可以从(Eclipse)完成。右键单击您的包裹 - >构建路径 - >配置构建路径 - >参考文献和图书馆 - >订单和出口。尝试更改包含签名文件的jar的顺序。
答案 2 :(得分:38)
一个。如果您使用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 deps)是Signer information does not match的问题。
答案 3 :(得分:21)
就我而言,我的库路径中有重复的JAR版本的BouncyCastle:S
答案 4 :(得分:7)
我有一个类似的例外:
java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
根本问题是我两次包括Hamcrest库。一旦使用Maven pom文件。我还在项目的构建路径中添加了JUnit 4库(它还包含一个Hamcrest库)。我只需要从构建路径中删除JUnit,一切都很好。
答案 5 :(得分:6)
使用cglib检测的代理可能会发生这种情况,因为CGLIB使用自己的签名者信息而不是应用程序目标类的签名者信息。
答案 6 :(得分:4)
名称:net / sf / jasperreports / engine / util / xml / JaxenXPathExecuterFactory.c 姑娘 SHA-256-Digest:q3B5wW + hLX / + lP2 + L0 / 6wRVXRHq1mISBo1dkixT6Vxc =
答案 7 :(得分:2)
我在Eclipse和JUnit 5中遇到此问题。 我的解决方案受到user2066936之前的回答的启发 这是为了重新配置导入库的顺序:
答案 8 :(得分:2)
如果您在Eclipse中运行它,请检查添加到构建路径的任何项目的jar;或者执行control-shift-T并扫描匹配相同名称空间的多个jar。然后从项目的构建路径中删除多余的或过时的jar。
答案 9 :(得分:1)
就我而言,这是一个包名冲突。当前项目和已签名的引用库有一个共同的包package.foo.utils
。刚刚将当前项目容易出错的软件包名称更改为其他名称。
答案 10 :(得分:1)
有点太旧了,但是因为我在这个问题上停留了很长时间,所以这里有修复(希望它对某人有帮助)
我的情景:
包名是:com.abc.def。有2个jar文件,其中包含来自此包的类,例如jar1和jar2,即jar1中存在一些类,jar2中存在其他类。这些jar文件使用相同的密钥库进行签名,但在构建中的不同时间(即单独)。这似乎导致了jar1和jar2中文件的不同签名。
我将所有文件放在jar1中并一起构建(并签名)它们。问题消失了。
PS:包名和jar文件名只是示例
答案 11 :(得分:0)
我正在运行 JUNIT 5 ,并且还引用了Hamcrest外部jar。但是Hamcrest也是 JUNIT 5 库的一部分。因此,我必须在构建路径的 JUNIT 5 库中更改外部Hamecrest jar文件的顺序。
答案 12 :(得分:0)
在使用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>
答案 13 :(得分:0)
这个问题已经持续了很长时间,但我想提出一些建议。我一直在应对Spring项目挑战,并在Eclipse IDE中发现了这一挑战。如果将Maven或Gradle用于Spring Boot Rest API,则必须在构建路径中删除Junit 4或5,并在pom.xml或Gradle构建文件中包含Junit。我想这也适用于yml配置文件。
答案 14 :(得分:0)
如果您添加了bouncycastle.org的所有罐子(在我的情况下来自crypto-159.zip),只需删除那些不适用于您的JDK。有裁员。你可能只需要&#34; jdk15on&#34;广口瓶中。
答案 15 :(得分:0)
基于@Mohit Phougat响应,如果您使用@Grab注释运行Groovy,则可以尝试重新排序此类注释。
答案 16 :(得分:0)
我可以解决它。
根本原因: 将Sun JAXB实现与签名jar一起使用时,这是一个常见问题。 本质上,JAXB实现试图通过生成一个类来直接访问属性而不使用反射来避免反射。不幸的是,它在与被访问的类相同的包中生成这个新类,这是该错误的来源。
分辨率: 添加以下系统属性以禁用与签名jar不兼容的JAXB优化: -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize =真
答案 17 :(得分:0)
如果您包含一个具有不同名称的文件或两次来自不同位置的文件,也会发生这种情况,特别是如果它们是同一文件的两个不同版本。