137

我像往常一样重新编译了我的类,突然收到以下错误消息。为什么?我该如何解决?

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

19 回答 19

149

当属于同一个包的类从不同的 JAR 文件加载,并且这些 JAR 文件具有使用不同证书签名的签名时,就会发生这种情况 - 或者,可能更常见的是,至少一个已签名,而一个或多个其他未签名(包括加载的类来自目录,因为这些 AFAIK 无法签名)。

因此,要么确保所有 JAR(或至少包含来自相同包的类)都使用相同的证书进行签名,要么从具有重叠包的 JAR 文件的清单中删除签名。

于 2010-05-20T19:57:42.533 回答
49

一个简单的解决方法是尝试更改导入的 jar 文件的顺序,这可以从 (Eclipse) 完成。右键单击您的包 -> 构建路径 -> 配置构建路径 -> 参考和库 -> 订购和导出。尝试更改包含签名文件的 jar 的顺序。

于 2011-06-17T15:30:26.093 回答
43

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 部门)在Signer information does not match问题中。

于 2013-07-10T07:53:07.737 回答
26

就我而言,我在我的库路径中复制了 JAR 版本的 BouncyCastle:S

于 2014-11-02T16:38:08.120 回答
11

我有一个类似的例外:

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,一切都很好。

于 2017-03-24T15:48:21.520 回答
6

这可能发生在 cglib-instrumented 代理中,因为 CGLIB 使用他自己的签名者信息而不是应用程序目标类的签名者信息。

于 2011-11-30T10:36:09.423 回答
4
  1. 签名后,访问:dist\lib
  2. 查找额外的 .jar
  3. 使用 Winrar,您提取文件夹(提取到“文件夹名称”)选项
  4. 访问:META-INF/MANIFEST.MF
  5. 像这样删除每个签名:

名称:net/sf/jasperreports/engine/util/xml/JaxenXPathExecuterFactory.c lass SHA-256-Digest:q3B5wW+hLX/+lP2+L0/6wRVXRHq1mISBo1dkixT6Vxc=

  1. 保存文件
  2. 再次压缩
  3. 将 ext 重命名为 .jar 返回
  4. 已经
于 2013-02-18T05:13:31.993 回答
3

我在使用 Eclipse 和 JUnit 5 时遇到了这个问题。我的解决方案受到 user2066936 先前答案的启发。它是重新配置导入库的顺序:

  1. 右键单击该项目。
  2. 打开 [Java 构建路径]。
  3. 单击订购和导出。
  4. 然后将 JUNIT 推到最高优先级。
于 2020-01-21T07:06:12.957 回答
2

如果您在 Eclipse 中运行它,请检查添加到构建路径的任何项目的 jar;或执行 control-shift-T 并扫描与同一命名空间匹配的多个 jar。然后从项目的构建路径中删除冗余或过时的 jar。

于 2014-12-21T06:00:41.833 回答
1

就我而言,这是一个包名冲突。当前项目和签名的引用库有一个共同的包package.foo.utils。只是将当前项目容易出​​错的包名称更改为其他名称。

于 2016-10-06T14:41:44.823 回答
1

有点旧的线程,但是由于我在此问题上停留了很长时间,因此这是修复方法(希望对某人有所帮助)。

我的场景:

包名是:com.abc.def。有 2 个 jar 文件包含此包中的类,例如 jar1 和 jar2,即 jar1 中存在一些类,而 jar2 中存在其他类。这些 jar 文件使用相同的密钥库进行签名,但在构建中的不同时间(即分别)。这似乎导致 jar1 和 jar2 中的文件具有不同的签名。

我将所有文件放在 jar1 中并一起构建(并签名)它们。问题消失了。

PS:包名和jar文件名只是示例

于 2016-12-01T18:09:26.897 回答
1

如果您添加了来自 bouncycastle.org 的所有 jar(在我的情况下来自 crypto-159.zip),只需删除不适用于您的 JDK 的那些。有裁员。您可能只需要“jdk15on”罐子。

于 2018-02-21T19:45:11.043 回答
1

这个问题已经持续了很长时间,但我想提出一些问题。我一直在处理 Spring 项目挑战,我在 Eclipse IDE 中发现了这一点。如果您将 Maven 或 Gradle 用于 Spring Boot Rest API,则必须删除构建路径中的 Junit 4 或 5,并将 Junit 包含在您的 pom.xml 或 Gradle 构建文件中。我想这也适用于 yml 配置文件。

于 2019-07-23T20:00:23.197 回答
0

如果您两次包含一个具有不同名称或来自不同位置的文件,也会发生这种情况,尤其是当它们是同一文件的两个不同版本时。

于 2013-02-21T11:43:23.587 回答
0

我可以修复它。

根本原因:这是使用带有签名 jar 的 Sun JAXB 实现时的常见问题。本质上,JAXB 实现试图通过生成一个类来直接访问属性而不使用反射来避免反射。不幸的是,它在与被访问的类相同的包中生成了这个新类,这是该错误的来源。

解决方案:添加以下系统属性以禁用与签名 jar 不兼容的 JAXB 优化:-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true

参考:https ://access.redhat.com/site/solutions/42149

于 2014-06-06T12:34:48.260 回答
0

根据@Mohit Phugat 响应,如果您正在运行带有@Grab 注释的Groovy,您可以尝试重新排序这些注释。

于 2015-08-26T23:50:55.470 回答
0

这发生在我使用 JUnit + REST Assured + 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>
于 2019-10-16T02:26:48.920 回答
0

我正在运行JUNIT 5并且还引用了 Hamcrest 外部 jar,但 Hamcrest 也是JUNIT 5库的一部分。因此,我将外部 Hamcrest jar 文件的顺序移动到构建路径中JUNIT 5库的上方。

在此处输入图像描述

于 2020-07-28T18:50:46.600 回答
0

我在尝试使用 Mockito 时遇到了类似的错误:

"$$FastClassByMockitoWithCGLIB$$abb8f5a0"'s signer information does not match signer information of other classes in the same package"

我使用的是旧版本的 Mockito,升级到最新的 Mockito 版本解决了这个问题。如其他答案之一所述,问题出在CGLIB上。在较新的版本中,Mockito 将 CGLIB 替换为 ByteBuddy,因此问题就消失了。我还必须将新的 ByteBuddy jar 添加到 Eclipse 的类路径中,以使 Mockito 再次工作。

于 2021-10-08T23:25:14.337 回答