Gradle IllegalArgumentException:对象的类型不是org.eclipse.jetty.plus.jndi.Resource类

Gradle IllegalArgumentException:对象的类型不是org.eclipse.jetty.plus.jndi.Resource类,gradle,jetty,illegalargumentexception,Gradle,Jetty,Illegalargumentexception,尝试使用Jetty 9.1.4+Gradle构建hello world应用程序。 我的项目结构 [项目根目录] [格雷德尔] [码头-9.1.4] [lib] jetty-jndi-9.1.4.v(…).jar jetty-plus-9.1.4.v(…)/jar [src] [主要] [爪哇] [servlet] HelloWorldServlet.java [网络应用]

尝试使用Jetty 9.1.4+Gradle构建hello world应用程序。 我的项目结构

  • [项目根目录]
      • [格雷德尔]
        • [码头-9.1.4]
          • [lib]
          • jetty-jndi-9.1.4.v(…).jar
          • jetty-plus-9.1.4.v(…)/jar
      • [src]
        • [主要]
          • [爪哇]
            • [servlet]
              • HelloWorldServlet.java
          • [网络应用]
            • [WEB-INF]
              • jetty-env.xml
              • web.xml
      • 格拉尔德先生
My web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <servlet>
        <display-name>HelloWorldServlet</display-name>
        <servlet-name>HelloWorldServlet</servlet-name>
        <servlet-class>servlet.HelloWorldServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorldServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
执行gradle jettyRunWar任务时,stacktrace出现以下异常:

Failed startup of context org.gradle.api.plugins.jetty.internal.JettyPluginWebAppContext@12cb504{/recipe-beagle,D:\Dev\projects\recipe-beagle\build\libs\recipe-beagle.war}
java.lang.IllegalArgumentException: Object is not of type class org.eclipse.jetty.plus.jndi.Resource
    at org.mortbay.xml.XmlConfiguration.configure(XmlConfiguration.java:189)
    at org.mortbay.jetty.plus.webapp.EnvConfiguration.configureWebApp(EnvConfiguration.java:130)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1269)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:489)
    at org.gradle.api.plugins.jetty.internal.JettyPluginWebAppContext.doStart(JettyPluginWebAppContext.java:112)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.gradle.api.plugins.jetty.internal.Jetty6PluginServer.start(Jetty6PluginServer.java:111)
    at org.gradle.api.plugins.jetty.AbstractJettyRunTask.startJettyInternal(AbstractJettyRunTask.java:240)[...]

那么,原因是什么?如何使其工作?

原因是运行jettyRunWar gradle任务。Gradle jetty插件使用6.xxx版本的jetty server,它的包是org.mortbay.*并且它们不适合新的(jetty-9.1.4)org.eclipse.jetty.。 解决方案不是ise gradle插件任务,而是与gradle“war”任务进行war,将此war手动放到本地jetty_安装目录/webapps,然后使用命令java-jar start.jar在jetty_安装目录下运行jetty

要使事情顺利进行,build.gradle必须如下所示:

apply plugin: 'java'
apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    providedCompile 'javax.servlet:servlet-api:2.5'
    compile 'mysql:mysql-connector-java:5.1.30'
    runtime 'javax.servlet:jstl:1.1.2'
}

task copyFilesToJetty(type : Copy) {
    from 'build/libs'
    into 'jetty-9.1.4/webapps'
    include '*.war'
}
Failed startup of context org.gradle.api.plugins.jetty.internal.JettyPluginWebAppContext@12cb504{/recipe-beagle,D:\Dev\projects\recipe-beagle\build\libs\recipe-beagle.war}
java.lang.IllegalArgumentException: Object is not of type class org.eclipse.jetty.plus.jndi.Resource
    at org.mortbay.xml.XmlConfiguration.configure(XmlConfiguration.java:189)
    at org.mortbay.jetty.plus.webapp.EnvConfiguration.configureWebApp(EnvConfiguration.java:130)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1269)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:489)
    at org.gradle.api.plugins.jetty.internal.JettyPluginWebAppContext.doStart(JettyPluginWebAppContext.java:112)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.gradle.api.plugins.jetty.internal.Jetty6PluginServer.start(Jetty6PluginServer.java:111)
    at org.gradle.api.plugins.jetty.AbstractJettyRunTask.startJettyInternal(AbstractJettyRunTask.java:240)[...]
apply plugin: 'java'
apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    providedCompile 'javax.servlet:servlet-api:2.5'
    compile 'mysql:mysql-connector-java:5.1.30'
    runtime 'javax.servlet:jstl:1.1.2'
}

task copyFilesToJetty(type : Copy) {
    from 'build/libs'
    into 'jetty-9.1.4/webapps'
    include '*.war'
}