我有一个需要解析属性占位符的XML文件(urlrewrite.xml)。我启用了Maven过滤来实现这一目标。这适用于组装的WAR文件。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
问题是当尝试使用maven-jetty-plugin(Maven Jetty插件)在开发模式下运行应用程序时,如maven jetty:run。
有问题的文件urlrewrite.xml位于src / main / resources目录中,因此应该(并且确实)最终在/ WEB-INF / classes(或maven jetty的目标/类:run)中
URLRewriteFilter配置指定配置文件的位置,如下所示:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/classes/urlrewrite.xml</param-value>
</init-param>
</filter>
这将在部署时工作。但是,使用jetty maven插件,URLRewrite将因NullPointerException而死亡,因为它使用了context.getResourceAsString(“/ WEB-INF / classes / urlrewrite.xml”)来加载配置文件。 Jetty为此返回null,因为从工作区运行应用程序时,它将/ WEB-INF / classes / ...解析为src / main / webapp / WEB-INF / ....该文件不存在,因为WAR尚未组装。它应该从target / classes / urlrewrite.xml中提取资源。
如果这对你来说是模糊的,那么你可能无法回答这个问题,因为我怀疑你需要成为一名Jetty大师来找出一个解决方法(提示:这是一个挑战!)。
有没有人知道解决这个问题的方法?我也尝试了以下变通方法来了解:
总之,maven-jetty-plugin需要将文件放在src / main / resources / webapp / 插入路径和文件名下,以便可用于maven jetty:run命令。
谢谢你的帮助......
此致 Lloyd Force
答案 0 :(得分:12)
回答了我自己的问题。
将maven-jetty-plugin升级到至少6.1.12
请参阅“配置多个WebApp源目录”的此Wiki页面(自jetty-6.1.12.rc2和jetty-7.0.0pre3以来可用)
为pom.xml添加一些魔力:
首先,为过滤后的网络资源添加一个新目录(src / main / webResources),然后添加&lt; resource&gt;元素:
<resource>
<directory>src/main/webResources</directory>
<filtering>true</filtering>
<targetPath>../jettyFilteredResources</targetPath>
</resource>
这会将文件复制到target / jettyFilteredResources(我们稍后会引用它)。此目录不会被复制到打包的WAR文件中,只能用于jetty!
将以下元素添加到maven-war-plugin&lt; configuration&gt;元素:
<webResources>
<resource>
<directory>src/main/webResources</directory>
<filtering>true</filtering>
</resource>
</webResources>
这将确保为您的真实WAR文件打包所有内容。
最后,告诉jetty使用您特别为其复制的资源,将以下代码段添加到&lt; baseResource&gt;元素:
<baseResource implementation="org.mortbay.resource.ResourceCollection">
<resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV>
</baseResource>
现在一切都会好起来的! (好吧,从技术上来说,我还没有测试过生产WAR,但是......等等......它也应该有用)。
如果有人有更好的答案,我会接受,只要在合理的时间内(比如说1天)提供答案。
答案 1 :(得分:3)
我认为这个问题的答案更好:
Running resource filters when using jetty:run
基本上,不是运行'mvn jetty:run'而是必须使用'mvn jetty:run-explosion'。
唯一的缺点是它需要构建WAR文件,在某些情况下可能会很昂贵。如果这对你来说不是问题,那么我想它会更好。
答案 2 :(得分:2)
将此添加到pom.xml:
<resources>
<resource>
<directory>src/main/webapp/WEB-INF</directory>
<filtering>true</filtering>
<targetPath>../jettyFilteredResources</targetPath>
</resource>
</resources>
这就是嵌入式Jetty服务器应该是这样的:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.1.3.v20140225</version>
<configuration>
<webAppConfig>
<descriptor>target/jettyFilteredResources/web.xml</descriptor>
</webAppConfig>
<scanIntervalSeconds>3</scanIntervalSeconds>
</configuration>
</plugin>
woila!感谢@ les2的灵感; - )
答案 3 :(得分:0)
我找到了另一种方式。
构建项目并将目标文件夹添加为额外的类路径。
<webAppConfig>
....
<extraClasspath>${basedir}/target/mywebapp</extraClasspath>
....
</webAppConfig>