将gwt从2.1.1升级到2.8.0:ServiceConfigurationError:org.apache.juli.logging.Log:Provider org.eclipse.jetty.apache.jsp.JuliLog不是子类型

时间:2017-04-20 19:03:31

标签: java gwt classloader

将gwt从2.1.1版升级到2.8.0后,我收到了错误消息

ec2-203-0-113-0.compute-1.amazonaws.com

我发现了其他一些包含类似消息的帖子,例如thisthis,但情况似乎有所不同: 我不使用Maven或Ant,只使用纯IntelliJ,我没有引用任何Tomcat库,我不知道我们的应用程序中有任何JSP。

我通过调试发现,首先类加载器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:\Users\xxx\.IntelliJIdea2017.1\system\gwt\xxx.97baa614\xx.fdf824a8\run\www}: 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 加载了包含接口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

实例。

我根本不知道为什么需要初始化JspServlet,因为在我看到的应用程序中没有使用JSP,只有几个Servlet。并且似乎所有涉及此冲突的类都包含在单个jar org.eclipse.jetty.jsp.JettyJspServlet 中,因此我认为不可能通过类路径设置影响任何类加载行为。

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

4 个答案:

答案 0 :(得分:0)

我最近升级到GWT 2.8.0时看到了这个错误。请尝试从项目中排除jetty-apache-Jsp相关的依赖项。

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

我现在在手机上,无法添加更多细节,但我希望这可以成为一个有用的方向。如果您仍然发现问题,请添加您的评论,然后我会在我的笔记本电脑上查看并更新答案。

答案 1 :(得分:0)

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

之后,我刚刚遇到此异常

答案 2 :(得分:0)

我也从gwt从2.4版本升级到2.8.2遇到了这个错误。

Jake W的回答帮助了我。

为解决这个问题,我在项目上运行了一个Maven依赖树,以找出引用了Jetty的apache-jsp的东西。

要运行依赖关系树,我在Eclipse中创建了一个新的运行配置-> maven build->目标为“ dependency:tree -Doutput = / dependency / 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>  

这对我有用。谢谢:)

答案 3 :(得分:0)

我正在使用 ant 并且发现的所有关于此错误的信息表明类路径中有 2 个版本的 Juli Logging,但每次搜索都只找到 gwt-dev.jar。生产版本运行良好,但开发模式不需要 gwt-dev.jar。

部分构建过程将 jars 从本地 lib 目录复制到 war/WEB-INF/lib 以打包到 war。 ant 脚本指向用于调试的本地 lib 目录,而不是用于 war 文件的目录。尽管战争位置没有作为类路径列在 ant 文件中,但它仍在加载它。

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