java.util.ServiceConfigurationError:org.apache.juli.logging.



我正试图将十多年前编写的一个项目移植到Java 11中。

经过几天和一些进展,我陷入了这个错误:

Caused by: 
java.util.ServiceConfigurationError: org.apache.juli.logging.Log: org.eclipse.jetty.apache.jsp.JuliLog not a subtype
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:588)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1236)
...

如果我jar -xf我的uberjar和(rip(grep通过它,我会看到JuliLogjuli.logging版本:

rg  "JuliLog|juli.logging"
jar/META-INF/services/org.apache.juli.logging.Log
1:org.eclipse.jetty.apache.jsp.JuliLog
jar/META-INF/maven/org.mortbay.jasper/apache-jsp/pom.xml
216:              filter:="(osgi.serviceloader=org.apache.juli.logging.Log)";resolution:=optional;cardinality:=multiple,
235:                  org.apache.juli.logging;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}",
jar/META-INF/maven/org.eclipse.jetty/apache-jsp/pom.xml
28:            <Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.servlet.ServletContainerInitializer,osgi.serviceloader;osgi.serviceloader=org.apache.juli.logging.Log</Provide-Capability>
45:                <exclude>META-INF/services/org.apache.juli.logging.Log</exclude>

从中,我看到了相同apache-jsp工件的不同groupId,但事实证明其中一个是另一个的依赖:

mvn dependency:tree  | grep -i apache-jsp -C5
...
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.4.31.v20200723:compile
[INFO] |  - org.eclipse.jetty:jetty-security:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:jetty-webapp:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:jetty-xml:jar:9.4.31.v20200723:compile
[INFO] |  - org.eclipse.jetty:jetty-util:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:apache-jsp:jar:9.4.31.v20200723:compile
[INFO] |  +- org.eclipse.jetty.toolchain:jetty-schemas:jar:3.1.2:compile
[INFO] |  +- org.mortbay.jasper:apache-jsp:jar:8.5.54:compile
[INFO] |  |  +- org.mortbay.jasper:apache-el:jar:8.5.54:compile
...

在我的pom中,我只指定eclipseapache-jsp,包括它是为了防止出现与缺少JSP支持(2020-09-15 10:08:50.037:INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /my-application, did not find org.eclipse.jetty.jsp.JettyJspServlet(有关的错误

StackOverflow上的其他问题与tomcat(显式或通过Spring(或gwt的依赖关系有关。我没有这些,但我确实对其他码头罐子有一些依赖性,如果这很重要的话:

mvn dependency:tree  | grep -i tomcat -C5
# no results
mvn dependency:tree  | grep -i gwt -C5
# no results
mvn dependency:tree  | grep -i jetty -C5
...
[INFO] +- org.eclipse.jetty:jetty-server:jar:9.4.31.v20200723:compile
[INFO] |  +- org.eclipse.jetty:jetty-http:jar:9.4.31.v20200723:compile
[INFO] |  - org.eclipse.jetty:jetty-io:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:jetty-servlet:jar:9.4.31.v20200723:compile
[INFO] |  - org.eclipse.jetty:jetty-security:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:jetty-webapp:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:jetty-xml:jar:9.4.31.v20200723:compile
[INFO] |  - org.eclipse.jetty:jetty-util:jar:9.4.31.v20200723:compile
[INFO] +- org.eclipse.jetty:apache-jsp:jar:9.4.31.v20200723:compile
[INFO] |  +- org.eclipse.jetty.toolchain:jetty-schemas:jar:3.1.2:compile
[INFO] |  +- org.mortbay.jasper:apache-jsp:jar:8.5.54:compile
[INFO] |  |  +- org.mortbay.jasper:apache-el:jar:8.5.54:compile
[INFO] |  |  - org.eclipse.jdt:ecj:jar:3.19.0:compile
[INFO] |  - org.eclipse.jetty:jetty-annotations:jar:9.4.31.v20200723:compile
[INFO] |     +- org.eclipse.jetty:jetty-plus:jar:9.4.31.v20200723:compile
[INFO] |     |  - org.eclipse.jetty:jetty-jndi:jar:9.4.31.v20200723:compile
...

其他解决方案明确地将apache-jsp排除在项目之外,但这正是为我提供JSP支持的原因,所以这对我来说不起作用

我想我可以使用<exclusion>,但mvn dependency:tree | grep -i juli -C5没有返回结果,所以我不确定如何在这里添加一个。


更新:多亏了Joakim,我能够通过<exclusion>清理一堆重复的类来显著清理我的jar,到目前为止,我唯一重复的是about.html文件以及jmockit和junit之间的一些重叠:

mvn org.basepom.maven:duplicate-finder-maven-plugin:check
...
[INFO] Checking compile classpath
[INFO] Checking runtime classpath
[INFO] Checking test classpath
[WARNING] Found duplicate and different resources in [org.eclipse.jdt:ecj:3.19.0, org.eclipse.jetty.toolchain:jetty-schemas:3.1.2, org.eclipse.jetty:apache-jsp:9.4.31.v20200723, org.eclipse.jetty:jetty-annotations:9.4.31.v20200723, org.eclipse.jetty:jetty-http:9.4.31.v20200723, org.eclipse.jetty:jetty-io:9.4.31.v20200723, org.eclipse.jetty:jetty-jndi:9.4.31.v20200723, org.eclipse.jetty:jetty-plus:9.4.31.v20200723, org.eclipse.jetty:jetty-security:9.4.31.v20200723, org.eclipse.jetty:jetty-server:9.4.31.v20200723, org.eclipse.jetty:jetty-servlet:9.4.31.v20200723, org.eclipse.jetty:jetty-util:9.4.31.v20200723, org.eclipse.jetty:jetty-webapp:9.4.31.v20200723, org.eclipse.jetty:jetty-xml:9.4.31.v20200723, org.eclipse.jgit:org.eclipse.jgit:1.0.0.201106090707-r]:
[WARNING]   about.html
[WARNING] Found duplicate and different resources in [org.eclipse.jdt:ecj:3.19.0, org.eclipse.jetty.toolchain:jetty-schemas:3.1.2, org.eclipse.jetty:apache-jsp:9.4.31.v20200723, org.eclipse.jetty:jetty-annotations:9.4.31.v20200723, org.eclipse.jetty:jetty-http:9.4.31.v20200723, org.eclipse.jetty:jetty-io:9.4.31.v20200723, org.eclipse.jetty:jetty-jndi:9.4.31.v20200723, org.eclipse.jetty:jetty-plus:9.4.31.v20200723, org.eclipse.jetty:jetty-security:9.4.31.v20200723, org.eclipse.jetty:jetty-server:9.4.31.v20200723, org.eclipse.jetty:jetty-servlet:9.4.31.v20200723, org.eclipse.jetty:jetty-util:9.4.31.v20200723, org.eclipse.jetty:jetty-webapp:9.4.31.v20200723, org.eclipse.jetty:jetty-xml:9.4.31.v20200723, org.eclipse.jgit:org.eclipse.jgit:1.0.0.201106090707-r]:
[WARNING]   about.html
[WARNING] Found duplicate and different classes in [com.googlecode.jmockit:jmockit:1.7, junit:junit:4.11]:
[WARNING]   junit.framework.TestResult
[WARNING]   org.junit.runner.Runner
[WARNING] Found duplicate and different resources in [org.eclipse.jdt:ecj:3.19.0, org.eclipse.jetty.toolchain:jetty-schemas:3.1.2, org.eclipse.jetty:apache-jsp:9.4.31.v20200723, org.eclipse.jetty:jetty-annotations:9.4.31.v20200723, org.eclipse.jetty:jetty-http:9.4.31.v20200723, org.eclipse.jetty:jetty-io:9.4.31.v20200723, org.eclipse.jetty:jetty-jndi:9.4.31.v20200723, org.eclipse.jetty:jetty-plus:9.4.31.v20200723, org.eclipse.jetty:jetty-security:9.4.31.v20200723, org.eclipse.jetty:jetty-server:9.4.31.v20200723, org.eclipse.jetty:jetty-servlet:9.4.31.v20200723, org.eclipse.jetty:jetty-util:9.4.31.v20200723, org.eclipse.jetty:jetty-webapp:9.4.31.v20200723, org.eclipse.jetty:jetty-xml:9.4.31.v20200723, org.eclipse.jgit:org.eclipse.jgit:1.0.0.201106090707-r]:
[WARNING]   about.html
...

不幸的是,这并没有解决我的问题。

在类路径和/或多个ClassLoader位置中有多个org.apache.juli.logging.Log副本的可能性很高,这会让人感到困惑。

重要提示:您真的应该解决重复类的问题。

由于您使用的是maven,请使用其中一个重复的类查找器插件。

请参阅:在类路径中查找重复的类

选项B,在修复了所有重复的类问题后,将nolog分类工件用于apache-jsp

https://search.maven.org/artifact/org.eclipse.jetty/apache-jsp/9.4.31.v20200723/jar

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>9.4.31.v20200723</version>
<classifier>nolog</classifier>
</dependency>

我遇到了同样的问题,但设置有点不同。使用了一个带有jetty的docker映像,并且没有直接连接到apache-jsp或任何使用org.apache.juli.logging.Log的东西,所以发生这种情况的原因有点奇怪。

经过进一步调查,我注意到在创建的docker映像中,在WEB-INF/lib文件夹下,我同时拥有apache-jsp...jar(它的两个不同版本(和gwt-dev.jar。我把那些罐子移走,问题就解决了。

这是一个非常古老的问题,所以我想它可能已经不再与人们相关了,但以防万一,我想写下,也许你甚至没有对apachejsp的直接依赖,而构建系统(在我的例子中是gradle(以某种方式获取了它(可能是通过对某些东西的间接依赖(。

当然,仅仅从docker文件中删除jar就应该被认为是一种危险的操作,因为在运行时可能会遇到其他问题,所以要小心。

最新更新