【问题标题】:java.util.ServiceConfigurationError: org.apache.juli.logging.Log: org.eclipse.jetty.apache.jsp.JuliLog not a subtypejava.util.ServiceConfigurationError: org.apache.juli.logging.Log: org.eclipse.jetty.apache.jsp.JuliLog 不是子类型
【发布时间】:2021-01-02 16:46:09
【问题描述】:

我正在尝试将十年前编写的项目移植到 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 工件有不同的 groupIds,但事实证明其中一个是另一个的依赖项:

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 中,我只指定了 eclipse apache-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 的依赖有关(eitherexplicitlyviaSpring)或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 支持的原因,所以这对我不起作用。

我以为我可以使用&lt;exclusion&gt;,但mvn dependency:tree | grep -i juli -C5 没有返回任何结果,所以我不确定如何在此处添加一个。


更新:感谢 Joakim,我能够通过 &lt;exclusion&gt;ing 一堆重复的类来显着清理我的 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
...

很遗憾,这并没有解决我的问题。

【问题讨论】:

    标签: java maven jsp jetty


    【解决方案1】:

    在您的类路径和/或多个 ClassLoader 位置中有多个 org.apache.juli.logging.Log 副本的可能性很高,并且会变得混乱。

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

    由于您使用的是 maven,因此请使用重复的类查找器插件之一。

    见:Find duplicated classes in classpath

    选项 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>
    

    【讨论】:

    • 谢谢,我会考虑对我的课程进行重复数据删除。 nolog 分类器是否只是阻止生成日志(意味着根本不会使用 juli)?
    • 我能够删除一堆重复的类,但它看起来与 juli 无关。我更新了我的问题,仍然保留了所有重复项。你还有什么我可以尝试的想法吗?
    猜你喜欢
    • 2019-09-14
    • 2017-06-28
    • 1970-01-01
    • 2019-06-28
    • 2016-06-21
    • 2020-06-26
    • 2021-04-16
    • 2021-10-16
    • 2021-09-18
    相关资源
    最近更新 更多