8

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

有谁知道解决这个问题的方法?我还尝试了以下解决方法来了解是否有效:

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

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

谢谢你的帮助...

此致 劳埃德力量

4

4 回答 4

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>

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

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

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

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

最后,通过将以下代码段添加到 <baseResource> 元素中,告诉码头使用您专门为它复制的资源:

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

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

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

于 2011-09-19T19:23:17.657 回答
3

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

使用 jetty:run 时运行资源过滤器

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

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

于 2012-09-10T21:38:38.223 回答
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>

哇!感谢@les2 的灵感;-)

于 2014-07-08T09:30:21.703 回答
0

我找到了另一种方法。

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

<webAppConfig>
    ....
    <extraClasspath>${basedir}/target/mywebapp</extraClasspath>
    ....
</webAppConfig>
于 2014-10-02T13:10:18.400 回答