Maven 构建不过滤 Intellij 中的属性
Maven build is not filtering properties in Intellij
我遇到一个问题,当我 运行 通过 Maven 从 Intellij 15.0.2 构建时,Maven 资源插件没有将我的属性过滤到我的文件中。当我从 Windows 命令行 运行 mvn compile
时它确实有效。我的插件配置是:
<properties>
<prop1>aaa</prop1>
<prop2>bbb</prop2>
</properties>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>file1</include>
<include>file2</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
修复
tldr:我能够重现您的问题,然后通过将 <resources>
元素从插件配置中移出到 <build>
的正下方来修复它,如下所示:
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- <snip> Other plugins -->
</plugins>
</build>
未来的读者,如果您只对修复感兴趣,请不要继续阅读。对于勇敢的 SO-er,血淋淋的细节在下面等待!
我为什么要那样做?
我这样做是因为这是我在之前的项目中打开资源过滤的方式。我不需要更改默认阶段 (process-resources
),因此根本不需要明确指定 maven-resources-plugin
。但是,我很想知道为什么 OP 的配置不起作用,因此查看了 maven-resources-plugin documentation 中 resources
mojo 的示例,其中似乎指定了 <resources>
<build>
.
直属
Usage 文档中的措辞似乎暗示仅 copy-resources
mojo:
在插件配置下需要 <resources>
配置
更新
应该从 maven-resources-plugin introduction 开始,它明确指出:
resources:resources copies the resources for the main source code to
the main output directory.
This goal usually executes automatically, because it is bound by
default to the process-resources life-cycle phase. It always uses the
project.build.resources element to specify the resources, and by
default uses the project.build.outputDirectory to specify the copy
destination.
Intellij 的怪癖?
我想说 Intellij is/was 没有错。
使用 Intellij 15.0.2,从 Intellij 或命令行执行 mvn clean compile
时,过滤行为(即是否有效)是相同的。我会认为问题出在 plugin/pom 配置而不是 Intellij 本身,除非 Intellij 的 maven 集成中存在错误。对于它的价值,我在 Intellij 中使用 maven 时还没有遇到这个问题(从版本 12.x 开始使用它已经有一段时间了)。
您的 Intellij 使用的捆绑 mvn 是否与命令行使用的 mvn 不同?即在这里和从命令行看到的 Maven 是否相同?这是我能想到的 只有 的东西,除了 Intellij 的 Maven 集成中的一个错误(不太可能),它可能会解释您所看到的不同行为。
这就是我的解决方案。
转到运行>编辑配置。
在“服务器”选项卡>“启动前”。
删除工件并添加此 Maven 目标:清理编译
尝试将 ${pom.basedir}
添加到 <directory>
标签的开头:
来自
<build>
(...)
<testResources>
<testResource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</testResource>
(...)
</build>
到
<build>
(...)
<testResources>
<testResource>
<filtering>true</filtering>
<directory>${pom.basedir}/src/test/resources</directory>
</testResource>
</testResources>
(...)
</build>
我怀疑当 Maven 项目有多个模块时,Intellij 需要找到正确的资源文件来执行替换 pom.xml 属性。
对我来说,问题是我忘记配置 Intellij 以将构建委托给 mvn。
此处的文档中提供了更多详细信息:https://www.jetbrains.com/help/idea/delegate-build-and-run-actions-to-maven.html#delegate_to_maven。
我怀疑 Intellij 只将 src/main/resources 复制到 target/classes 而没有其他任何东西。
我遇到一个问题,当我 运行 通过 Maven 从 Intellij 15.0.2 构建时,Maven 资源插件没有将我的属性过滤到我的文件中。当我从 Windows 命令行 运行 mvn compile
时它确实有效。我的插件配置是:
<properties>
<prop1>aaa</prop1>
<prop2>bbb</prop2>
</properties>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>file1</include>
<include>file2</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
修复
tldr:我能够重现您的问题,然后通过将 <resources>
元素从插件配置中移出到 <build>
的正下方来修复它,如下所示:
<build>
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- <snip> Other plugins -->
</plugins>
</build>
未来的读者,如果您只对修复感兴趣,请不要继续阅读。对于勇敢的 SO-er,血淋淋的细节在下面等待!
我为什么要那样做?
我这样做是因为这是我在之前的项目中打开资源过滤的方式。我不需要更改默认阶段 (process-resources
),因此根本不需要明确指定 maven-resources-plugin
。但是,我很想知道为什么 OP 的配置不起作用,因此查看了 maven-resources-plugin documentation 中 resources
mojo 的示例,其中似乎指定了 <resources>
<build>
.
Usage 文档中的措辞似乎暗示仅 copy-resources
mojo:
<resources>
配置
更新
应该从 maven-resources-plugin introduction 开始,它明确指出:
resources:resources copies the resources for the main source code to the main output directory.
This goal usually executes automatically, because it is bound by default to the process-resources life-cycle phase. It always uses the project.build.resources element to specify the resources, and by default uses the project.build.outputDirectory to specify the copy destination.
Intellij 的怪癖?
我想说 Intellij is/was 没有错。
使用 Intellij 15.0.2,从 Intellij 或命令行执行 mvn clean compile
时,过滤行为(即是否有效)是相同的。我会认为问题出在 plugin/pom 配置而不是 Intellij 本身,除非 Intellij 的 maven 集成中存在错误。对于它的价值,我在 Intellij 中使用 maven 时还没有遇到这个问题(从版本 12.x 开始使用它已经有一段时间了)。
您的 Intellij 使用的捆绑 mvn 是否与命令行使用的 mvn 不同?即在这里和从命令行看到的 Maven 是否相同?这是我能想到的 只有 的东西,除了 Intellij 的 Maven 集成中的一个错误(不太可能),它可能会解释您所看到的不同行为。
这就是我的解决方案。
转到运行>编辑配置。
在“服务器”选项卡>“启动前”。
删除工件并添加此 Maven 目标:清理编译
尝试将 ${pom.basedir}
添加到 <directory>
标签的开头:
来自
<build>
(...)
<testResources>
<testResource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</testResource>
(...)
</build>
到
<build>
(...)
<testResources>
<testResource>
<filtering>true</filtering>
<directory>${pom.basedir}/src/test/resources</directory>
</testResource>
</testResources>
(...)
</build>
我怀疑当 Maven 项目有多个模块时,Intellij 需要找到正确的资源文件来执行替换 pom.xml 属性。
对我来说,问题是我忘记配置 Intellij 以将构建委托给 mvn。
此处的文档中提供了更多详细信息:https://www.jetbrains.com/help/idea/delegate-build-and-run-actions-to-maven.html#delegate_to_maven。
我怀疑 Intellij 只将 src/main/resources 复制到 target/classes 而没有其他任何东西。