gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:26:03 25 4
gpt4 key购买 nike

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

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>

问题是当尝试使用 maven-jetty-plugin (Maven Jetty Plugin) 在开发模式下运行应用程序时,如 maven jetty:run 。

有问题的文件 urlrewrite.xml 位于 src/main/resources 目录中,因此应该(并且确实)以/WEB-INF/classes (或 maven jetty:run 的 target/classes )结束。

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 专家才能找到解决方法(提示:这是一个挑战!)。

有谁知道解决这个问题的方法?我还尝试了以下解决方法来了解是否有效:
  • 将 urlrewrite.xml 放在新目录 src/main/webResources 下,并将其添加到 maven war 插件 并启用过滤。这将在打包 WAR 时将其内容复制到适当的位置,但不会使其可用于 jetty:run
  • 其他一些我什至不记得的黑客...(如果我这样做会更新)

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

    谢谢你的帮助...

    真挚地,
    劳埃德力量

    最佳答案

    回答了我自己的问题。

  • 将 maven-jetty-plugin 升级到至少 6.1.12
  • 请参阅有关“配置多个 WebApp 源目录”的 wiki 页面(自 jetty-6.1.12.rc2 和 jetty-7.0.0pre3 起可用)
  • 为 pom.xml 添加一些魔法:

  • 首先,为过滤后的 Web 资源添加一个新目录 (src/main/webResources) 并添加一个 元素:
            <resource>
    <directory>src/main/webResources</directory>
    <filtering>true</filtering>
    <targetPath>../jettyFilteredResources</targetPath>
    </resource>

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

    将以下元素添加到您的 maven-war-plugin 元素:
                    <webResources>
    <resource>
    <directory>src/main/webResources</directory>
    <filtering>true</filtering>
    </resource>
    </webResources>

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

    最后,通过将以下代码段添加到 元素中,告诉 jetty 使用您专门为它复制的资源:
    <baseResource implementation="org.mortbay.resource.ResourceCollection">                        
    <resourcesAsCSV>src/main/webapp,target/jettyFilteredResources</resourcesAsCSV>
    </baseResource>

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

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

    关于maven - 使用maven jetty插件时如何过滤资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7475811/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com