如何在使用maven jetty插件时过滤资源?

les*_*es2 8 filtering jetty maven maven-jetty-plugin

我有一个需要解析属性占位符的XML文件(urlrewrite.xml).我启用了Maven过滤来实现这一目标.这适用于组装的WAR文件.

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
Run Code Online (Sandbox Code Playgroud)

问题是尝试使用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>
Run Code Online (Sandbox Code Playgroud)

这将在部署时工作.但是,使用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大师来找出一个解决方法(提示:这是一个挑战!).

有没有人知道这方面的方法?我也尝试过以下变通方法:

  1. 将urlrewrite.xml放在新目录src/main/webResources下,并将其添加到maven war plugin <webReources>并启用过滤.这将在打包WAR时将其内容复制到适当的位置,但不会使其可用于jetty:run
  2. 其他一些我甚至不记得的黑客......(如果我这样做会更新)

总之,maven-jetty-plugin需要将文件置于src/main/resources/webapp/insert路径和文件名下,以便可用于maven jetty:run命令...

谢谢你的帮助......

真诚的,劳埃德力

les*_*es2 12

回答了我自己的问题.

  1. 将maven-jetty-plugin升级到至少6.1.12

  2. 请参阅"配置多个WebApp源目录"上的此Wiki页面(自jetty-6.1.12.rc2和jetty-7.0.0pre3以来可用)

  3. 为pom.xml添加一些魔法:

首先,为过滤的Web资源添加一个新目录(src/main/webResources)并添加一个<resource>元素:

        <resource>
            <directory>src/main/webResources</directory>
            <filtering>true</filtering>
            <targetPath>../jettyFilteredResources</targetPath>
        </resource>
Run Code Online (Sandbox Code Playgroud)

这会将文件复制到target/jettyFilteredResources(我们稍后会引用它).此目录不会被复制到打包的WAR文件中,只能用于jetty!

将以下元素添加到maven-war-plugin <configuration>元素:

                <webResources>
                    <resource>
                        <directory>src/main/webResources</directory>
                        <filtering>true</filtering>
                    </resource>
                </webResources>
Run Code Online (Sandbox Code Playgroud)

这将确保为您的真实WAR文件打包所有内容.

最后,通过将以下代码段添加到<baseResource>元素,告诉jetty使用您特别为其复制的资源:

<baseResource implementation="org.mortbay.resource.ResourceCollection">                        
    <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV>
</baseResource>
Run Code Online (Sandbox Code Playgroud)

现在一切都会好起来的!(好吧,从技术上讲,我还没有测试过生产WAR,但是......等等......它应该也可以工作).

如果有人有更好的答案,我会接受它,只要在合理的时间内(比如说1天)提供答案.