Effective-pom 是超级 pom 和应用程序 POM 的合并吗

Posted

技术标签:

【中文标题】Effective-pom 是超级 pom 和应用程序 POM 的合并吗【英文标题】:Is effective-pom a merge between super pom and application POM 【发布时间】:2013-05-30 17:16:48 【问题描述】:

我尝试使用 mvn help:effective-pom 命令在示例应用程序上生成有效的 pom。 http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-pom.html 在这篇文章中,它说有效的 pom 是超级 pom 和应用程序 pom 之间的合并。

但是,当我查看我的有效 pom 时,它包含超级 pom 或有效 pom 中不包含的元素。

还有其他因素决定什么是有效的 pom.

下面给出的是超级 pom 和应用程序 pom,这两个 pom 都没有 mavne-jar-plugin 或 maven-compiler-plugin,但是在我的 Effective-pom 中,我可以在构建部分看到这些插件。那么它是如何添加的。

在此先感谢您对澄清此问题的任何帮助

超级POM

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!-- START SNIPPET: superpom -->
<project>
  <modelVersion>4.0.0</modelVersion>

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>http://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>$project.basedir/target</directory>
    <outputDirectory>$project.build.directory/classes</outputDirectory>
    <finalName>$project.artifactId-$project.version</finalName>
    <testOutputDirectory>$project.build.directory/test-classes</testOutputDirectory>
    <sourceDirectory>$project.basedir/src/main/java</sourceDirectory>
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>$project.basedir/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>$project.basedir/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>$project.basedir/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>$project.build.directory/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
<!-- END SNIPPET: superpom -->

应用程序POM

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.sonatype.mavenbook.ch08</groupId>
    <artifactId>simplest-project</artifactId>
    <packaging>jar</packaging>
    <version>1</version>
</project>

有效的pom

【问题讨论】:

我猜你忘了添加有效的 pom。 【参考方案1】:

Effective POM 由 Super POM + Application POM(s) + settings.xml 内容 + 插件组成,默认情况下基于所选的包装类型(因此,基于 Application POM 中的一个元素)绑定到生命周期。

您询问了maven-jar-pluginmaven-compiler-plugin。这些默认绑定到生命周期,因为您的应用程序 POM 指定 jar 打包。

您可以在$YOUR_REPO_LOCATION\org\apache\maven\maven-core\3.0.x\maven-core-3.0.x.jar\META-INF\plexus\components.xml 或documentation 中查看默认绑定。

【讨论】:

谢谢你的回答,还有一个问题需要澄清,所以maven会在执行默认生命周期的过程中对有效的pom起作用,对吗? Maven 构建有效的 pom,然后在执行任何给定命令期间使用它,无论是生命周期阶段(例如mvn install)还是特定目标(例如mvn versions:display-dependency-updates)。 @user944849 顺便说一句,我的maven-core-3.0.3.jar 不在我的本地存储库中,而是在$(MAVEN_HOME)/lib/maven-core-3.0.3.jar。这可能是什么原因? 我碰巧在我的本地存储库中找到了该工件,所以我停止在其他地方查找。您在应用程序安装中找到了它。如果版本相同,应该是相同的信息。【参考方案2】:

如果我没记错的话,有效的 POM 是指要使用的实际 POM。

在超级 POM 中加入设置是其中的一部分。它还包括许多其他内容,例如应用父 POM、应用配置文件、替换属性等。

我认为,如果你能提供一些你认为来自哪里的设置的 sn-p 会更好,这样我们就可以确定它们来自哪里。

【讨论】:

我已经用 Super POM、应用程序 pom 和有效 pom 中的新功能更新了问题

以上是关于Effective-pom 是超级 pom 和应用程序 POM 的合并吗的主要内容,如果未能解决你的问题,请参考以下文章

POM使用

Mule项目的超级pom配置

为啥eclipse能显示effective pom

如何在maven存储库中找到正确的JAR版本

Maven查看当前生效配置pom环境变量等命令(mvn help用法)

Maven查看当前生效配置pom环境变量等命令(mvn help用法)