9

这有点令人抓狂,在与 Maven 合作的几年中,我从未见过这种情况发生。一个简单的项目(不是我自己写的)会随机过滤资源失败,我无法弄清楚是什么原因造成的。我不能分享项目源代码,但我会尽可能多地分享 POM。请记住,问题不在于代码,而在于Maven随机决定不过滤资源。

我最初在我的 POM 的构建标签中配置了这个:

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

在我的 src/main/resources 目录中,我有一个名为 spring-config.xml 的文件。这个文件中有几个属性应该被 Maven 配置文件属性替换。我已经像这样配置了我的构建配置文件:

<profile>
  <id>stage</id>
  <properties>
    <env.name>STAGE</env.name>
    <db.url>jdbc:oracle:thin:@xxx.xxx.com:1521:xxx</db.url>
  </properties>
</profile>

要构建,我运行以下命令:

mvn clean package -P stage

现在,这个项目使用 Spring,它使用相同的 Spring 配置进行测试和执行,因此在运行测试用例时上下文将创建一个数据库连接。大多数时候,构建将完成并且测试用例将通过。但是,大约 10 次中的 1 次,测试用例将失败,因为没有替换属性并且 Spring 尝试连接到“${db.url}”而不是“jdbc:oracle:thin:@xxx.xxx.com:1521 :xxx”。

奇怪的是,大约 10 次中的 9 次,打包的 JAR 会出现同样的问题,尽管刚刚通过了测试用例。我检查了目标/类目录,那里的文件有完全相同的问题。我发现 Maven 资源插件在构建生命周期的某个时刻发生了一些奇怪的事情,可能它错误地覆盖了文件。

我的创可贴解决方案

在 Maven 生命周期中,顺序是编译->测试->打包。因此,为了强制在让我头疼的两个阶段过滤资源,我将资源插件配置为在编译和测试阶段都运行:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
    <configuration>
      <encoding>UTF-8</encoding>
    </configuration>
    <executions>
      <execution>
        <id>this-is-silly</id>
        <phase>compile</phase>
        <goals>
          <goal>resources</goal>
        </goals>
      </execution>
      <execution>
        <id>why-must-i-exist</id>
        <phase>test</phase>
        <goals>
          <goal>resources</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

这似乎一直在工作,但我仍然不知道为什么我需要为过去几年我从事的数十个项目中的一个项目执行此操作。我以前从未见过 Maven 间歇性地做某事,这让我担心它会再次中断。任何想法将不胜感激。

4

1 回答 1

4

正如泰勒在上面的评论中所写:

您是否同时运行 eclipse 或类似的?它可能会覆盖 maven 过滤的资源以试图“提供帮助”。

问题是正在运行日食。根据您的 Eclipse 配置(m2e 是/否),一旦决定刷新您的项目,eclipse 将简单地覆盖您的资源文件。

这可以通过使用 Eclipse Maven 集成(而不是 eclipse:eclipse)来解决,它可以“即时”正确过滤资源

或者,当然,通过在构建时停止 Eclipse,这作为工作流模型并不真正可行。

于 2013-12-11T16:01:46.413 回答