我正在开发一个目前在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配置以查看它是否有效。
这是我尝试过的事情清单:
在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
然后我尝试按如下方式更改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);
,这意味着部署管理器为空。
答案 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配置中的空格