我正在开发一个 Java 应用程序,该应用程序目前在 jetty 版本 6(mortbay) 和 8(eclipse) 服务器中运行。
我发现维护项目有点忙,由于版本的不断升级,并且想添加在码头环境中运行的集成测试,所以我想将 maven 集成到其中。我已经从事过一个最初基于 maven 的项目。我已经能够将该项目转换为一个 Maven 项目,并且它似乎也可以完美运行。
唯一的问题是我需要为我的项目的一项功能实际添加上下文部署程序到 maven 的码头插件。我比较了 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:WARN:oejx.XmlConfiguration:Config 错误 at java.lang.IllegalStateException: No object for 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:WARN:oejx.XmlConfiguration:Config 错误在 java.lang.IllegalStateException: No object for 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:Config error at
<Call name="addAppProvider">
... No Method:<Call name="addAppProvider">
on class 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 jetty 插件开始运行。我在我的项目下创建了上下文文件夹并添加了一个上下文文件,码头抛出以下错误:
java.lang.NullPointerException at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java :142) at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.ja va:53) at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:604) at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:535) at org.eclipse.jetty.util.Scanner.scan(扫描仪.java:398)
查看源代码,第 142 行
_deploymentManager.addApp(app);
表示部署管理器为空。