首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当子模块pom定义属性时执行Maven构建配置文件

当子模块pom定义属性时执行Maven构建配置文件
EN

Stack Overflow用户
提问于 2016-02-14 18:55:47
回答 1查看 1.6K关注 0票数 3

我希望为定义特定属性的模块提供一个通用的构建概要文件。在我的例子中,我运行的是jar-with-dependencies插件,希望它只在模块定义main.class属性时运行。

我的父母POM中有以下内容:

代码语言:javascript
复制
<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,否则不会构建它,因此它似乎没有检测到模块中的属性。这能触发吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-14 19:20:21

你走错路了。配置文件不打算以这种方式使用。。您的配置无法工作,因为使用<property>激活的配置文件只针对系统属性的存在(或缺失),而不仅仅是任何Maven属性。这是因为活动配置文件需要从构建开始就开始计算,而Maven属性则是在此之后设置的(您甚至可以在构建过程中设置属性)。

您真正想要做的是在父POM中筛选出maven-assembly-plugin的配置。这方面的Maven方法是遍历的声明

Plugin以同样的方式包含插件元素,只不过它不是为这个特定的项目构建配置插件信息,而是为了配置从这个项目中继承的项目构建。但是,这只会配置实际上在子元素的plugins元素中引用的插件。

这意味着您可以为maven-assembly-plugin配置插件管理,并让要调用该插件的项目引用它。

因此,在您的父POM中,您将拥有以下内容:

代码语言:javascript
复制
<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中使用以下内容:

代码语言:javascript
复制
<properties>
  <main.class>MyMainClass</main.class>
</properties>
<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
    </plugin>
  </plugins>
</build>

这表明模块将引用父POM中的管理部分。在本例中,Maven将正确地使用build属性main.class

对于不调用该插件的模块,只需省略maven-assembly-plugin的插件声明,就不会发生任何事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35395785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档