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

时间:2011-09-19 18:49:55

标签: maven jetty filtering maven-jetty-plugin

我有一个需要解析属性占位符的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大师来找出一个解决方法(提示:这是一个挑战!)。

有没有人知道解决这个问题的方法?我也尝试了以下变通方法来了解:

  1. 将urlrewrite.xml放在新目录src / main / webResources下,并将其添加到maven war plugin&lt; webReources&gt;并启用过滤。这将在打包WAR时将其内容复制到适当的位置,但不会使其可用于jetty:run
  2. 其他一些我甚至不记得的黑客......(如果我这样做会更新)
  3. 总之,maven-jetty-plugin需要将文件放在src / main / resources / webapp / 插入路径和文件名下,以便可用于maven jetty:run命令。

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

    此致 Lloyd Force

4 个答案:

答案 0 :(得分:12)

回答了我自己的问题。

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

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

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

  4. 首先,为过滤后的网络资源添加一个新目录(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>