maven的eclipse jetty plugin + context deployer

时间:2012-06-12 06:19:51

标签: maven-jetty-plugin

我正在开发一个目前在jetty版本6(mortbay)和8(eclipse)服务器上运行的java应用程序。

我发现维护项目有点紧张,因为版本不断升级版本,并希望添加在jetty环境中运行的集成测试,所以我想将maven集成到它中。我已经完成了一个基于maven的项目。我已经能够将该项目转换为maven项目,它似乎运行得很好。

唯一的问题是,我需要为maven的jetty插件添加上下文部署程序,以实现项目的一个功能。我比较了mortbay的jetty.xml配置文件和eclipse的jetty.xml,发现mortbay的版本包含了上下文部署者,而没有上下文部署者的迹象,并且在jetty-contexts.xml中指定了该配置。

我试图更改maven和jetty xml配置以查看它是否有效。

这是我尝试过的事情清单:

  1. 在pom.xml中添加jetty-contexts.xml,如下所示:

    <plugin>
       <groupId>org.mortbay.jetty</groupId>
       <artifactId>jetty-maven-plugin</artifactId>
       <version>8.1.0.RC5</version>
           <configuration>
                <jettyConfig>jetty.xml</jettyConfig>
                <jettyConfig>jetty-contexts.xml</jettyConfig> 
       </configuration>
    </plugin>
    

    这给出了以下错误消息: 2012-06-12 11:04:15.182:警告:oejx.XmlConfiguration:配置错误 java.lang.IllegalStateException:没有id = DeploymentManager

  2. 的对象
  3. 然后我尝试按如下方式更改jetty.xml:

    我读了http://wiki.eclipse.org/Jetty/Feature/ContextDeployer并添加了以下配置:

    <Ref id="DeploymentManager">
        <Call name="addAppProvider">
            <Arg>
                <New class="org.eclipse.jetty.deploy.providers.ContextProvider">
                    <Set name="monitoredDir"><Property name="jetty.home" default="."/>/contexts</Set>
                    <Set name="scanInterval">1</Set>
                </New>
            </Arg>
        </Call>
    </Ref>
    

    这给出了相同的错误消息: 2012-06-12 11:04:15.182:警告:oejx.XmlConfiguration:配置错误 java.lang.IllegalStateException:没有id = DeploymentManager

    的对象

    所以我改成了:

    <Call name="addAppProvider">
        <Arg>
            <New class="org.eclipse.jetty.deploy.providers.ContextProvider">
                <Set name="monitoredDir"><Property name="jetty.home" default="." />/contexts</Set>
                <Set name="scanInterval">1</Set>
            </New>
        </Arg>
    </Call>
    

    这给了java.lang.ClassNotFoundException:org.eclipse.jetty.deploy.providers.ContextProvider

    在上面的链接中,给出了“ContextProvider机制,它现在是核心部署基础架构的扩展,实现了这种能力。”所以我认为我必须为这个功能包含一些插件。然后我遇到了 http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin#Using_GZip_Compression_and_Other_Jetty_Extensions

    这让我想到了如何添加额外的扩展。然后我在jetty-deploy jar中找到了包含ContextProvider的jar。

    然后在pom.xml中添加以下配置:

    <plugin>
        <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>8.1.0.RC5</version>
    <dependencies>
        <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-deploy</artifactId>
        <version>8.1.0.RC5</version>
    </dependency>
    </dependencies>
        ...
    </plugin>
    

    这会出现以下错误:  2012-06-12 13:38:53.375:警告:oejx.XmlConfiguration:配置错误  <Call name="addAppProvider"> ...     没有方法:org.mortbay.jetty.plugin.JettyServer上的<Call name="addAppProvider">

    深入挖掘maven jetty插件jar我发现addLifeCycle方法(已弃用)所以我添加了以下配置(就像在jetty 6上下文文件中写的那样):

    <Call name="addLifeCycle">
        <Arg>
            <New id="hotdeployer" class="org.eclipse.jetty.deploy.providers.ContextProvider">
            <Set name="monitoredDir"><Property name="jetty.home" default="." />/contexts
                </Set>
            <Set name="scanInterval">1</Set>
            </New>
         </Arg>
    

    Maven jetty插件在此之后开始运行。我在我的项目下创建了contexts文件夹并添加了一个上下文文件,并且jetty抛出了以下错误:

    显示java.lang.NullPointerException     在org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java) :142)     在org.eclipse.jetty.deploy.providers.ScanningAppProvider $ 1.fileAdded(ScanningAppProvider.ja) VA:53)     在org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:604)     在org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:535)     在org.eclipse.jetty.util.Scanner.scan(Scanner.java:398)

    查看源代码,第142行是_deploymentManager.addApp(app);,这意味着部署管理器为空。

1 个答案:

答案 0 :(得分:1)

我终于找到了答案。在pom.xml中,您必须添加:

    <plugin>

            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>8.1.0.RC5</version>

            <dependencies>
                <dependency>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-deploy</artifactId>
                    <version>8.1.0.RC5</version>
                </dependency>
            </dependencies>

            <configuration>
                <webAppConfig>
                    <contextPath>XXXX</contextPath>
                </webAppConfig>
                <jettyConfig>jetty.xml</jettyConfig>
            </configuration>
     </plugin>

在jetty.xml中,你必须添加:

    <Call name="addBean">
    <Arg><New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager"><Set name="contexts"><Ref id="Contexts" /></Set><Call name="setContextAttribute"><Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg><Arg>.*/servlet-api-[^/]*\.jar$</Arg></Call></New></Arg></Call>

<Ref id="DeploymentManager"><Call name="addAppProvider"><Arg><New class="org.eclipse.jetty.deploy.providers.ContextProvider"><Set name="monitoredDirName"><Property name="jetty.home" default="." />/contexts</Set><Set name="scanInterval">1</Set></New></Arg></Call></Ref>

小心空格,maven jetty插件抱怨jetty.xml配置中的空格