我希望为定义特定属性的模块提供公共构建配置文件。在我的情况下,我正在运行jar-with-dependencies
插件,并希望它仅在模块定义main.class
属性时运行。
我的父母POM中有以下内容:
<profiles>
<profile>
<id>executable-jar</id>
<activation>
<property>
<name>main.class</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
除非我在运行Maven命令时定义-Dmain.class
,否则不会构建它,因此看起来它没有检测到它所计算的模块中的属性。这可以被触发吗?
答案 0 :(得分:2)
你是以错误的方式去做的。 Profiles are not intended to be used this way。您的配置不起作用,因为使用<property>
激活的配置文件仅针对系统属性的存在(或不存在),而不仅仅是任何Maven属性。这是因为活动配置文件需要从构建开始直接计算,而Maven属性在此之后设置(您甚至可以在构建期间设置属性)
您真正想要做的是在父POM中分解maven-assembly-plugin
的配置。 Maven的方式是通过声明<pluginManagement>
:
插件管理包含插件元素的方式大致相同,除了不是为此特定项目构建配置插件信息,它旨在配置从此继承的项目构建。但是,这只配置了子节点中plugins元素中实际引用的插件。
这意味着您可以为maven-assembly-plugin
配置插件管理,并让您想要调用该插件的项目引用它。
因此,在您的父POM中,您将拥有以下内容:
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
这声明了maven-assembly-plugin
的管理部分。为了让您的模块使用它,您需要在您的孩子POM中使用以下内容:
<properties>
<main.class>MyMainClass</main.class>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
这声明该模块将引用父POM中的管理部分。在这种情况下,Maven将正确使用构建属性main.class
。
对于不调用此插件的模块,您只需要省略maven-assembly-plugin
的插件声明,不会发生任何事情。