为什么在使用Android Studio / IntelliJ时不能正确执行我的pom?

我有一个使用Maven构build的Android应用程序。 使用buildnumber-maven-plugin和maven-resources-plugin我将maven项目版本和git commit散列插入到AndroidManifest中。 buildnumber-maven-plugin的create目标在validate阶段运行,maven-resources-plugin的resources目标在initialize阶段运行。

当通过命令行(使用mvn install )构build时,所有工作都正常,并且生成的编号在生成的清单中正确显示。

然而,当通过Android Studio或IntelliJ构build时,清单中的git commit hash不存在(Maven属性不会被实际值replace),但是maven项目版本是。

为什么?

仅供参考:Android Studio在Make之前运行Maven阶段进程资源,因此它应该可以工作。

在命令行中,我使用的是Maven 3.0.3,所以它可能是一个版本问题(尽pipe我找不到IntelliJ使用的是什么版本)。

这是我的POM的构build元素:

 <build> <sourceDirectory>src</sourceDirectory> <testSourceDirectory>test</testSourceDirectory> <resources> <resource> <directory>${project.basedir}</directory> <filtering>true</filtering> <targetPath>${project.build.directory}/filtered-manifest</targetPath> <includes> <include>AndroidManifest.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>buildnumber-maven-plugin</artifactId> <version>${maven.buildnumber.version}</version> <configuration> <doCheck>false</doCheck> <doUpdate>false</doUpdate> <shortRevisionLength>6</shortRevisionLength> <revisionOnScmFailure>000000</revisionOnScmFailure> </configuration> <executions> <execution> <phase>validate</phase> <goals> <goal>create</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>${maven.resources.version}</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>resources</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <extensions>true</extensions> <configuration> <androidManifestFile>${project.build.directory}/filtered-manifest/AndroidManifest.xml</androidManifestFile> </configuration> </plugin> </plugins> </build> 

而我的AndroidManifest文件中的versionName是:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.somecompany" android:versionCode="1" android:versionName="${project.version}-${buildNumber}" > 

从命令行$ {project.version}和$ {buildNumber}都正确地填充了它们的值,从IntelliJ $ {buildNumber}不是,只是显示为“$ {buildNumber}”:这将表明(因为我已经设置了revisionOnScmFailure )插件无法运行。

我试图改变create目标在initialize阶段运行(以防IntelliJ跳过validate ),但没有任何区别。

Solutions Collecting From Web of "为什么在使用Android Studio / IntelliJ时不能正确执行我的pom?"

IntelliJ有自己的内部构build系统,就像任何其他IDE一样,可以在没有外部工具的帮助下构build项目。 Intellij还通过解释项目中的pom.xml与Maven集成,并根据您定义的configuration将其构build。 这对于大多数编译任务来说都非常好,但是当你引入更复杂的插件(比如buildnumber-maven-plugin)的时候,这个工作就开始了。 不幸的是IntelliJ没有内部的equivilent来处理这个插件,所以$ {buildNumber}属性永远不会被填充。

可能的解决方法是:

  1. 不要使用IntelliJ的内置系统来构build项目,使用“Maven Projects”面板,您可以通过“View”>“Tool Windows”>“Maven Projects”显示该面板。 这使您可以访问所有标准的Maven阶段和其他function。

  2. 在你的IntelliJ“运行configuration”中添加一个名为“buildNumber”的环境variables,并给它任何你喜欢的值,例如:buildNumber = DEV。 这将在构build过程中使buildNumber属性可用并填充属性,但不会从SCM更新。

我们在多模块maven项目中使用了第一个解决方法,因为我们也遇到了与buildnumber-maven-plugin类似的限制。 当我们需要在IntelliJ中运行一个集成testing时,我们也使用了解决scheme2,因为我们的代码需要buildNumber属性来显示版本信息,只要我们给它一个值得高兴的值。

我希望这对你有些用处,唯一真正的解决scheme是让IntelliJ的内部构build系统了解buildnumber-maven-plugin,并在构build过程中向环境公开正确的属性。