将GWT从2.1.1升级到2.8.0:ServiceConfigurationError:org.apache.juli



从版本2.1.1升级到2.8.0后,我得到了错误消息

2017-04-20 12:59:19.551:WARN:oejuc.AbstractLifeCycle:main: FAILED c.g.g.d.s.j.WebAppContextWithReload@341fbaf1{/,file:/C:/Users/xxx/.IntelliJIdea2017.1/system/gwt/xxx.97baa614/xxx.fdf824a8/run/www/,STARTING}{C:Usersxxx.IntelliJIdea2017.1systemgwtxxx.97baa614xx.fdf824a8runwww}: java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype
java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype

我发现了其他一些带有类似消息的帖子,例如或这样,但是情况似乎有所不同:我不使用Maven或Ant,只是纯Intellij,我没有任何tomcat库,也不知道我们的应用程序中有任何JSP。

我通过调试发现,首先是类加载器com.google.gwt.dev.shell.jetty.Jettylauncher$WebAppContextWithReload$WebAppClassLoaderExtension加载类org.eclipse.jetty.apache.jsp.JuliLog,包括接口org.apache.juli.logging.Log

然后,后来的接口org.apache.juli.logging.Log

间接触发的sun.misc.Launcher$AppClassLoader加载
org.eclipse.jetty.webapp.WebAppContext.startContext()

的方法initialize
org.eclipse.jetty.jsp.JettyJspServlet

实例。

我不知道为什么根本需要初始化Jspservlet,因为据我所知,在应用程序中没有使用JSP。似乎所有涉及的冲突中的所有类都包含在单个JAR gwt-dev.jar中,因此我认为没有可能通过类路径设置影响任何类加载行为。

知道我如何解决这个问题?

我也从GWT从2.4版升级到2.8.2。

杰克·W的答案对我有帮助。

为了解决这个问题,我在项目上跑了一条Maven依赖树,以弄清楚什么是引用Jetty的Apache-JSP。

要运行依赖项树,在Eclipse中,我创建了一个新的运行配置 -> maven构建 ->带有"依赖关系:tree -doutput =/distionency/file.txt"的目标。运行后,控制台输出将显示在哪里保存输出。它应该是您使用-DOUTPUT选项引用的位置。

在输出文件中寻找这样的东西:
- org.eclipse.jetty:apache-jsp:jar:9.2.14.v20151106:compile

,然后在树上抬起头,看看它是从哪里拉进去的。就我而言,它来自于此:

+- com.google.gwt:gwt-dev:jar:2.8.2:compile   
   +- net.sourceforge.htmlunit:htmlunit:jar:2.19:compile  
   - org.eclipse.jetty:apache-jsp:jar:9.2.14.v20151106:compile

一旦知道它来自何处(假设您正在使用Maven(,您可以在pom.xml文件中添加一个排除:

</dependencies>   
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-dev</artifactId>
            <version>${gwt.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>apache-jsp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
</dependencies>  

这对我有用。谢谢:)

我最近升级到GWT 2.8.0时看到了这个错误。请尝试将Jetty-Apache-JSP与项目相关的依赖项排除在您的项目中。

您也可能会看到其他与码头相关的问题,因此请确保您使用的是与GWT 2.8.0完全相同的码头版本。

我目前正在移动,无法添加更多详细信息,但我希望这是一个有用的方向。如果您仍然看到问题,请添加您的评论,然后在笔记本电脑上时,我会查看并更新答案。

我在添加 gwt-test-utils:0.53依赖项(使用GWT 2.8.1(

后才遇到此例外

我正在使用ANT,并且有关此错误的所有信息,表明Class Path中有2个版本的Juli记录版本,但是每个搜索都只有GWT-DEV.JAR。生产构建工作正常,但是开发模式不需要GWT-DEV.JAR。

构建过程的一部分使罐子从当地的LIB目录复制到战争/Web-Inf/lib,以打包到战争中。ANT脚本指向本地LIB目录进行调试,而不是用于战争文件的LIB目录。尽管战争位置未在ANT文件中列为类路径,但仍在加载它。

最终,gwt-dev.jar与自身的复制版本冲突。

最新更新