Embedded Jetty(v9)和jetty-env.xml创建了奇怪的类加载器问题

时间:2014-08-21 20:20:51

标签: java jetty

我正以编程方式启动Jetty指向战争。我还在WEB-INF中有一个jetty-env.xml,它定义了一个JNDI源。但是,在启动时,它给出了关于类加载器问题的错误。我认为因为main()从java的AppClassLoader创建一个WebAppContext,而JNDI在jetty-env.xml中定义的WebAppContext中。

java.lang.IllegalArgumentException: Object of class 'org.eclipse.jetty.webapp.WebAppContext' is not of type 'org.eclipse.jetty.webapp.WebAppContext'. Object Class and type Class are from different loaders. in file:/home/ckessel/Projects/exploded-war/WEB-INF/jetty-env.xml

我不认为将嵌入式Jetty启动与jetty-env.xml结合起来是奇怪的,但我已经阅读了大量关于嵌入式Jetty和JNDI等的Eclipse Jetty文档,但它并没有似乎涵盖了这种组合。

一个想法?

jetty-env.xml:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="postgreSQL Datasource" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/postgres</Arg>
        <Arg>
...postgres config stuff here...
        </Arg>
    </New>
</Configure>

主要()......类别清单的内容是从http://www.eclipse.org/jetty/documentation/current/jndi-embedded.html

中偷来的
   public static void main(String[] args) throws Exception {
        int port = 8080;
        System.setProperty("org.eclipse.jetty.LEVEL", "DEBUG");
        System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog");
        Server server = new Server(port);

        // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
        Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server);
        classlist.addAfter(
                "org.eclipse.jetty.webapp.FragmentConfiguration",
                "org.eclipse.jetty.plus.webapp.EnvConfiguration",
                "org.eclipse.jetty.plus.webapp.PlusConfiguration");

        // Create the webapp for our war.
        WebAppContext webapp = new WebAppContext();
        webapp.setWar("/home/ckessel/Projects/build/exploded-war");
        webapp.setContextPath("/");
        server.setHandler(webapp);

        server.start();
        server.join();
    }

1 个答案:

答案 0 :(得分:1)

你要做的2件事。

  1. 摆脱war的WEB-INF / lib目录中的重复jar。 主要是jetty-webapp.jar它不应该存在。

  2. 如果你只想在这个嵌入式jetty实例中运行1个webapp,那么考虑使用WebAppContext.setParentLoaderPriority(true),使ClassLoader行为更类似于标准Java(而不是Servlets的反向要求) )