使用maven war插件的Web资源过滤在使用m2e的Eclipse中不起作用

时间:2012-03-21 09:34:03

标签: eclipse maven eclipse-wtp m2e

我正在尝试使用Maven过滤过滤Spring配置文件。我的POM配置如下:

        ...
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <webResources>
              <resource>
                <filtering>true</filtering>
                <targetPath>WEB-INF/context</targetPath>
                <directory>src/main/webapp/WEB-INF/context</directory>
                <includes>
                  <include>applicationContext.xml</include>
                </includes>
              </resource>
            </webResources>
          </configuration>
        </plugin>
        ...

  <profiles>
    <profile>
        <id>desarrollo</id>
         <activation>
          <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <filters>
              <filter>src/main/properties/dev.properties</filter>
            </filters>
      </build>
    </profile>
    <profile>
        <id>pruebas</id>
        <build>
            <filters>
              <filter>src/main/properties/test.properties</filter>
            </filters>
      </build>
    </profile>
            ...

直接调用Maven时效果很好。

不幸的是,当使用Eclipse WTP和m2e在Tomcat 6中热部署webapp时,它总是会选择未经过滤的applicationContext.xml版本。 (文件夹target / m2e-wtp / web-resources / WEB-INF / context中的文件applicationContext.xml永远不会被过滤)

我找不到有关此主题的任何有用文档。我甚至不确定它是否在m2e中实现。

我的配置有问题,或者这是未实现的功能吗?

6 个答案:

答案 0 :(得分:26)

好吧,最后我明白了。

首先,我做了khmarbaise指出的事情。我将applicationContext.xml移动到resources文件夹。 War插件webResources用于处理外部资源,并且过滤目标文件夹本身的文件不是最佳做法。 我更新了POM以反映新配置

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

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <webResources>
                    <resource>
                        <filtering>true</filtering>
                        <targetPath>WEB-INF/context</targetPath>
                        <directory>src/main/resources/WEB-INF/context</directory>
                        <includes>
                            <include>applicationContext.xml</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>

所以,他的一半功劳。 但这还不够,它仍然没有奏效。 我意识到Maven / m2e确实正在过滤我的文件,但它没有得到我定义的属性文件。经过一些测试后,我发现 m2e忽略了配置文件激活部分中的activeByDefault选项

所以,我将我的默认配置文件添加到项目Maven配置中,然后它就可以了

enter image description here

答案 1 :(得分:9)

我在过滤web.xml时遇到了类似的问题。我通过在eclipse中重新导入整个项目来解决问题。

原因是损坏的/.settings/org.eclipse.wst.common.component文件。在此文件中,定义了复制到本地Web服务器部署目录的文件的顺序。例如:

<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
  <wb-module deploy-name="liquidvote-rest">
    <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
    <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
    <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
    <property name="context-root" value="myapp"/>
    <property name="java-output-path" value="/myapp/target/classes"/>
  </wb-module>
</project-modules>

如果web.xml或application.xml存在于多个目录中,则将从找到的第一个目录中获取。因此重要的是

    <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>

是第一个条目。

您可以在“{3}}”的“此网络资源文件夹是什么?”部分找到更多信息。

答案 2 :(得分:1)

您是否尝试将资源放在src / main / resources / WEB-INF / ...下,而不是将资源区域配置为filter the resources,而不是将配置放入非默认的maven位置。

答案 3 :(得分:0)

我遇到了类似的问题。我的解决方案并不优雅,我并不为此感到自豪,但让我们说它是可以接受的。在我的情况下,我有一个带有swagger应用程序的spring boot mvc应用程序(供测试人员测试我们的API)。问题是我们在两个环境中使用这个应用程序,所以我创建了两个配置文件 - 开发和测试。在开发环境中,我们想通过&#34; run as&#34;来启动eclipse中的应用程序。所以上下文路径是空白的(我知道它可以在spring java config中设置,但它不是我们想要切换的唯一占位符)并且在测试环境中应用程序在我们自定义版本的tomcat中运行...所以上下文路径与war文件名相同。

这就是问题 - 招摇在这个上下文路径上调用rest docs,它取决于spring profile。所以我们有一个需要过滤的网络资源。起初我尝试使用m2e-wtp过滤:

...
<build>
<plugins>
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/scripts.js</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
...

它正在工作,但只能在嵌入式eclipse tomcat中运行,或者从命令行java -jar运行,它不能与&#34;运行为&#34;来自日食。

资源被过滤了,我在目标网络资源中看到了它们,但是eclipse似乎是直接在源代码上运行,或者正在制作副本我不知道......它看不到过滤后的资源......所以我以为我会做这样的事情:

<resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources/webapp/swagger</directory>
                <targetPath>${basedir}/src/main/webapp/swagger</targetPath>
                <includes>
                    <include>scripts.js</include>
                </includes>
            </resource>
        </resources>

这不是最幸运的解决方案,因为它是修改代码而不是目标,但至少它是有效的。如果有人建议如何在没有代码修改的情况下使其工作,我会很有帮助。

答案 4 :(得分:0)

我已经尝试了上述所有内容但没有成功。这些文件在&#34; m2e-wtp&#34;中被过滤并正确生成。文件夹,但由于某种原因,Eclipse正在从&#34; target / classes&#34;中复制文件。

因此,我改变了我的pom.xml,从&#34; m2e-wtp&#34;更改了目标文件夹。到&#34;目标/类&#34;,就像前面的代码一样。

重要提示:每次需要在项目上运行maven构建时,必须更改pom才能构建项目。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>  
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <filters>
            <filter>${project.basedir}/src/main/filters/${build.profile.id}/config.properties</filter>
        </filters>
        <webResources>
            <resource>
                <filtering>true</filtering>
                <directory>${project.basedir}/src/main/resources</directory>
                <targetPath>${project.basedir}/target/classes</targetPath>
                <includes>
                    <include>*.properties</include>
                    <include>*.xml</include>
                    <include>META-INF/spring/*.xml</include>
                </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

答案 5 :(得分:0)

今天,当几个罐子被纳入战争时,我遇到了类似的问题。我设置过滤,并将原始罐与过滤器进行比较。他们似乎是一样的,但事实并非如此。我试图将jar重命名为zip并且由于jar(zip)内部的结构损坏而无法解压缩内容,而原始的一个没问题。这里还提到了adding filtering web resources,其中说过滤必须设置为false以防止破坏二进制文件。