【问题标题】:How to filter resources when using maven jetty plugin?使用maven jetty插件时如何过滤资源?
【发布时间】:2011-11-20 12:10:44
【问题描述】:

我有一个需要解析属性占位符的 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 插件 并启用过滤。这将在打包 WAR 时将其内容复制到适当的位置,但不会使其可用于 jetty:run
  2. 其他一些我什至不记得的 hack ...(如果我记得会更新)

总而言之,maven-jetty-plugin 需要该文件位于 src/main/resources/webapp/插入路径和文件名 下才能用于 maven jetty:run 命令。 .

感谢您的帮助...

真诚地, 劳埃德军

【问题讨论】:

    标签: maven jetty filtering maven-jetty-plugin


    【解决方案1】:

    回答了我自己的问题。

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

    2. 请参阅有关“配置多个 WebApp 源目录”的 wiki 页面(自 jetty-6.1.12.rc2 和 jetty-7.0.0pre3 起可用)

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

    首先,为您过滤的网络资源添加一个新目录(src/main/webResources)并添加一个 元素:

            <resource>
                <directory>src/main/webResources</directory>
                <filtering>true</filtering>
                <targetPath>../jettyFilteredResources</targetPath>
            </resource>
    

    这会将文件复制到 target/jettyFilteredResources(我们稍后会引用它)。此目录不会被复制到您打包的 WAR 文件中,它仅用于码头!

    将以下元素添加到您的 maven-war-plugin 元素:

                    <webResources>
                        <resource>
                            <directory>src/main/webResources</directory>
                            <filtering>true</filtering>
                        </resource>
                    </webResources>
    

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

    最后,告诉码头使用你特别为它复制的资源,通过添加以下 sn-p 到你的 元素:

    <baseResource implementation="org.mortbay.resource.ResourceCollection">                        
        <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV>
    </baseResource>
    

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

    如果有人有更好的答案,我会接受,前提是在合理的时间内(比如 1 天)提供答案。

    【讨论】:

    • +1 用于记录解决方案(网上有很多未回答的问题)。如果这对您有用,请自我接受。顺便说一句,您是否尝试过使用专门的资源过滤添加“开发”Maven 配置文件?这是我为我的非码头网络项目采取的一种方法。
    • 可选地使用 maven-replacer-plugin 并将替换的文件写入 /WEB-INF/classes/ 目录。它将确保目录结构存在。
    • 对于那些使用 Jetty 9:org.eclipse.jetty.util.resource.ResourceCollection 而不是 org.mortbay.resource.ResourceCollection
    【解决方案2】:

    我认为另一个问题的答案更好:

    Running resource filters when using jetty:run

    基本上,您必须使用 'mvn jetty:run-exploded' 而不是运行 'mvn jetty:run'。

    唯一的缺点是它需要构建 WAR 文件,这在某些情况下可能会很昂贵。如果这对您来说不是问题,那么我想它会更好。

    【讨论】:

    • 让我告诉你,run-exploded 不是一个选项;您谈论几秒钟而不是几分钟;至少在写这篇文章的时候是这样的。我在上面发布的解决方案为您提供了两全其美的解决方案。是的,这是一个黑客。但它根本不会渗透到实际应用程序中。这只是一个构建黑客,一旦设置,您就可以忘记它。试一试,让我知道你的想法。我承认我的回答有点简洁,因为我正在为有经验的 maven 用户写作。如果您认为有帮助,我可以更新更多详细信息。
    【解决方案3】:

    将此添加到 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>
    

    哇!感谢@les2 的启发;-)

    【讨论】:

    • 您是否必须自己为 jetty-maven-plugin 实现此功能?如果是这样,那就太棒了。它确实使所需的配置变得更加简单。
    【解决方案4】:

    我找到了另一种方法。

    构建项目并将目标文件夹添加为额外的类路径。

    <webAppConfig>
        ....
        <extraClasspath>${basedir}/target/mywebapp</extraClasspath>
        ....
    </webAppConfig>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2017-05-25
      • 2012-12-18
      • 2014-03-28
      • 1970-01-01
      • 2013-06-14
      • 2016-08-16
      相关资源
      最近更新 更多