5

原帖:
我想过滤在web.xmlJetty 8.1 servlet 容器上运行的 Java 6 Web 应用程序的部署描述符,但到目前为止它不起作用。我想根据活动的 Maven 配置文件设置不同的 JSF 项目阶段:

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>${jsfProjectStage}</param-value>
</context-param>

中的配置文件部分pom.xml如下所示:

<profiles>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <jsfProjectStage>Development</jsfProjectStage>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <jsfProjectStage>Production</jsfProjectStage>
        </properties>
    </profile>
</profiles>

在 Internet 上,您可以找到几种方法来实现这一点,例如使用替代的 web.xml 文件。但对我来说,最明显的方法似乎是使用 maven-war-plugin:

<build>
    <finalName>...</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <webResources>
                    <webResource>
                        <directory>src/main/webapp/WEB-INF</directory>
                        <filtering>true</filtering>
                        <targetPath>WEB-INF</targetPath>
                        <includes>
                            <include>web.xml</include>
                        </includes>
                    </webResource>
                </webResources>
            </configuration>
        </plugin>

        ...

    </plugins>
</build>

由于您找到了许多带有此代码片段的答案或文章,我想知道为什么它对我不起作用。我尝试替换<webResource><resource>(经常以这种方式找到)并且我也尝试添加<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>但没有任何效果。

有谁知道,为了正确过滤 web.xml,这里缺少什么?还是我必须明确指定<filters>

谢谢塞巴斯蒂安
_

更新:
感谢user944849,我现在知道我未过滤的原因web.xml不是 maven-war-plugin 而是 jetty-maven-plugin,因为我曾经mvn jetty:run运行(未组装的)webapp。有谁知道如何web.xml在运行未组装的 webapp 之前使用 jetty-maven-plugin 过滤?

4

3 回答 3

5

在弄清楚问题不是 maven-war-plugin 而是 jetty-maven-plugin 之后,我只需将 maven 命令从 更改mvn clean jetty:runmvn clean jetty:run-war,以便在部署描述符也获取的嵌入式码头上运行组装好的 webapp过滤。

感谢您的帮助
塞巴斯蒂安

于 2013-06-19T10:04:43.007 回答
0

只是我的 2 美分:

使用run-war比使用run差一点,因为run-war需要打包 - 不方便开发。对我有用的解决方案是遵循这些步骤(我可以想象一个更简单的步骤,但我们在 Maven 和项目部署中有几个 tweeks):

  1. 保留默认的 webapp 资源过滤,并添加我们自己的自定义过滤
  2. 将码头配置指向自定义 docroot(和备用 web.xml)
  3. 将jetty绑定到prepare-package(maven 2.2.1+)阶段,作为实际打包前的最后一个阶段
  4. 完成后,可以简单地运行 maven 并在命令行 st 中提供属性。喜欢:mvn -Djetty=run -Djetty.webcontext=any-web-context -Djetty.port=8180 prepare-package

下面的配置是针对 maven2 的,但是对新的 org.eclipse.jetty 和 maven3 的修改应该很简单:

    <!-- jetty:run -->
    <profile>
        <id>jetty-run</id>
        <activation>
            <property>
                <name>jetty</name>
                <value>run</value>
            </property>
        </activation>
        <properties>
            <jetty.docroot>${project.build.directory}/jetty-docroot</jetty.docroot>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.4.3</version>
                    <executions>
                        <execution>
                            <id>jetty-docroot</id>
                            <phase>prepare-package</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${jetty.docroot}</outputDirectory>
                                <resources>
                                    <resource>
                                        <directory>${basedir}/src/main/webapp</directory>
                                        <filtering>true</filtering>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <!-- for maven2, use org.eclipse.jetty for maven3 + slightly different configuration  -->
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>maven-jetty-plugin</artifactId>
                    <configuration>
                        <connectors>
                            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                                <port>${jetty.port}</port>
                                <maxIdleTime>60000</maxIdleTime>
                            </connector>
                        </connectors>
                        <scanIntervalSeconds>10</scanIntervalSeconds>
                        <contextPath>/${jetty.webcontext}</contextPath>
                        <webXml>${jetty.docroot}/WEB-INF/web.xml</webXml>
                        <webAppSourceDirectory>${jetty.docroot}</webAppSourceDirectory>
                        <!-- maven3
                        <webApp>
                            <contextPath>/${jetty.webcontext}</contextPath>
                            <descriptor>${jetty.docroot}/WEB-INF/web.xml</descriptor>
                            <baseResource>${jetty.docroot}</baseResource>
                        </webApp>
                        -->
                        <systemProperties>
                            <systemProperty>
                                <name>java.awt.headless</name>
                                <value>true</value>
                            </systemProperty>
                        </systemProperties>
                    </configuration>
                    <executions>
                        <execution>
                            <id>jetty-run</id>
                            <phase>prepare-package</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
于 2013-10-18T23:35:13.857 回答
0

您的配置似乎正确,但根据我的经验,您可能还需要<filters>部分。

例如,我的应用程序类似于:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven-war-plugin.version}</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
                <webResources>
                    <resource>
                        <directory>src/main/webapp</directory>
                        <filtering>true</filtering>
                        <includes>
                            <include>**/bm.js</include>
                        </includes>
                    </resource>
                </webResources>
                <warName>${war.name}</warName>
            </configuration>
        </plugin>
    </plugins>
    <filters>
        <filter>src/main/filters/filter-${target.environment}.properties</filter>
    </filters>
</build>

bm.js文件包含对宏的引用${my.property},该值在 2 个不同的文件中设置,filter-dev.properties并且filter-qa.properties. 我在父 POM 中有 2 个不同的 Maven 配置文件(称为devqa),我在其中相应地定义了target.environment属性。

运行mvn package指定配置文件时,宏 inbm.js将被替换为正确的值。

我不是 100% 确定这将与 . 一起使用web.xml,但您可以尝试一下。

于 2013-06-18T12:43:45.333 回答