【问题标题】:maven's eclipse jetty plugin + context deployermaven 的 eclipse jetty 插件 + 上下文部署器
【发布时间】:2012-06-12 06:19:50
【问题描述】:

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

由于版本的不断升级,我发现维护项目有点忙,并且想添加在码头环境中运行的集成测试,所以我想将 maven 集成到其中。我已经从事过一个最初基于 maven 的项目。我已经能够将该项目转换为 maven 项目,并且它似乎也可以完美运行。

唯一的问题是我需要为我的项目的一项功能实际添加上下文部署程序到 maven 的码头插件。我比较了 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:WARN:oejx.XmlConfiguration:Config 错误 java.lang.IllegalStateException:id=DeploymentManager 没有对象

  2. 然后我尝试将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:WARN:oejx.XmlConfiguration:Config 错误 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:WARN:oejx.XmlConfiguration:配置错误 &lt;Call name="addAppProvider"&gt;... 没有方法:&lt;Call name="addAppProvider"&gt; 类 org.mortbay.jetty.plugin.JettyServer

    深入研究 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 码头插件在那之后开始运行。我在我的项目下创建了上下文文件夹并添加了一个上下文文件,码头抛出以下错误:

    java.lang.NullPointerException 在 org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java :142) 在 org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.ja 弗吉尼亚州: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);,表示部署管理器为空。

【问题讨论】:

    标签: maven-jetty-plugin


    【解决方案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 配置中的空格

    【讨论】:

    • 很高兴看到整个 jetty.xml 文件
    猜你喜欢
    • 2012-05-06
    • 2014-08-20
    • 2018-04-01
    • 2023-03-10
    • 2011-01-15
    • 2011-10-08
    • 2011-07-08
    • 2011-10-20
    • 2012-01-30
    相关资源
    最近更新 更多