这有点令人抓狂,我在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”。
奇怪的是,尽管刚刚通过测试用例,但打包的JAR在10中大约有9次会遇到同样的问题。我检查了目标/ classes目录,那里的文件有完全相同的问题。我认为在构建生命周期的某个点上使用Maven资源插件会发生奇怪的事情,也许它会错误地覆盖文件。
在Maven生命周期中,订单是compile-&gt; test-&gt;包。因此,为了在令我头疼的两个阶段上强制过滤资源,我将资源插件配置为在编译阶段和测试阶段运行:
<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间歇性地做某事,这让我担心它会再次破裂。任何想法都将不胜感激。
答案 0 :(得分:4)
泰勒在上面的评论中写道:
你是在同时运行eclipse还是其他的?它可能会覆盖maven过滤的资源,试图“有用”。
问题是日食。根据您的eclipse配置(m2e yes / no),eclipse会在决定刷新项目后覆盖资源文件。
这可以通过使用Eclipse Maven集成(而不是eclipse:eclipse)来解决,它可以“动态”正确地过滤资源
或者,当然,通过在构建时停止日食,这作为工作流模型并不可行。