谢谢 Stéphane - 你问题末尾的编辑帮助我“解决”了同样的问题。对于其他也遇到此问题的人 - 这是一个扩展的答案。这就是您需要“修复”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
不存在签名问题。
Aside: javax.persistence
版本2.2.0
在原始问题中显示的 pom 片段中被明确拉入,尽管已经是传递依赖eclipselink
.
解释
总结-eclipselink
工件取决于javax.persistence
并且都包含包中的类javax.persistence
。但是,那javax.persistence
jar 已签名,而eclipselink
一个不是。因此,当从包中加载类时,Java 运行时会抱怨javax.persistence
in the eclipselink
jar 中,它缺少签名与已从同一包中加载的类不匹配javax.persistence
jar.
详细信息 - 如果我在其中放置一个断点java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V)
有条件"javax.persistence".equals(arg0)
然后我看到了javax.persistence
映射到以下CodeSource
value:
(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
...
I.e. javax.persistence-2.2.0.jar
由 Eclipse 基金会签名并包含包中的类javax.persistence
。当我的应用程序的某些部分(实际上是 Spring 逻辑深处的东西)尝试加载时,这个 jar 就会被拉入javax.persistence.EntityManagerFactory
.
如果我然后在java.lang.ClassLoader.checkCerts(String, CodeSource)
on the throw new SecurityException
然后我看到当传入时它击中了这条线CodeSource
is:
(file:/Users/georgehawkins/.m2/repository/org/eclipse/persistence/eclipselink/2.7.0/eclipselink-2.7.0.jar <no signer certificates>)
I.e. 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
本身。 IE。这与其他依赖项没有冲突:
[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 上记录了这个 - 请参阅 bug525457 https://bugs.eclipse.org/bugs/show_bug.cgi?id=525457.