java - Maven随机不过滤资源

标签 java maven maven-3 maven-resources-plugin

这有点令人抓狂,在使用 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 配置进行测试和执行,因此上下文将在测试用例运行时创建数据库连接。大多数时候,构建会完成并且测试用例会通过。但是,大约十分之一,测试用例将失败,因为属性未被替换并且 Spring 尝试连接到“${db.url}”而不是“jdbc:oracle:thin:@xxx.xxx.com:1521” :xxx”。

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

我的创可贴解决方案

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

  <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 断断续续地做某事,这让我担心它会再次崩溃。如有任何想法,我们将不胜感激。

最佳答案

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

Are you running eclipse or some such at the same time? It might be overwritting the maven-filtered resource in an attempt to be "helpful".

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

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

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

关于java - Maven随机不过滤资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380772/

相关文章:

maven - 我应该为 jar commons-lang.jar 使用哪个 pom 依赖项

Maven原型(prototype)插件不允许原型(prototype)资源中的.resources通过

java - 如何使用现有的 pom.xml 将第三方文件发布到远程 Maven 仓库?

java - 过滤器模式定义不适用

java - 使用.class文件而不是android gradle中的.java文件构建sources.jar

Java,如何即时写入文件

Java在ubuntu上找不到文件

maven - 如何强制 lein deps 重新获取本地 jars/libs

java - 使用docker时Turbine只能找到一台主机

java - 我如何通过 -Xlint :deprecation or -Xlint:unchecked to Maven?