Nexus & Maven Corporate Pom - 它应该包含什么?

Nexus & Maven Corporate Pom - What should it contain?

我们目前正在评估为我们的 java 开发建立内部公司关系存储库。

遗憾的是,仍有一些问题未得到解答,但也许您可以提供帮助。

公司内部所有项目的父 pom 似乎是最佳实践。不清楚的是这个 pom 应该包含什么,除了 <organization> 部分。

在此 pom 中也指定 <distributionManagement> 是否是最佳实践?如果是,它应该包含什么?如果我们想引用公司关系(<site><repository><snapshotRepository>),它应该是什么样子?

如何处理(根据 sonatype)每个项目都有自己的存储库而无需在每个 pom 中指定 nexus 根路径是最佳实践这一事实?

我们是否还应该在此处指定 <repositories><pluginRepositories> 部分(引用我们的内部联系)?

此外,我们希望基本上每个项目都可以部署它自己的站点,我们可以在父 pom 中也指定这一点吗?如果是,站点插件配置应该是什么样的?

最好是有人可以提供一个完整的、示例性的公司 pom,可以与内部 nexus 存储库一起使用。

或者将这些东西放在 settings.xml 中而不将项目绑定到某个存储库会更好吗?但是据我所知<distributionManagement>不能在settings.xml里面指定?如果关系 url 有朝一日发生变化,这将是一项繁琐的更新工作?

我对这整件事真的很困惑,尽管我试着阅读了很多。

提前致谢!


UPDATE/Solution

感谢下面 Michael-O 的回答,我得到了我需要的信息。

  1. <repositories><pluginRepositories> 标签属于 settings.xml。这是指定nexus仓库的地方 对于 "Downloading"(可选地包括使用 <servers>
  2. 的凭据
  3. <distributionManagement>属于企业基地pom, 为发布和快照引用一个基本的 Nexus 存储库。这是为 "Uploading"(部署)指定 nexus 存储库的地方。
  4. 如果需要子存储库(用于逻辑分组项目),它们在项目内部指定 pom.xml,因此覆盖公司 pom.xml 中的子存储库。为了简化这一点并保持基本关系 url 仅在公司 pom 中(注意 url 更改)可能是 useful/possible 在下面的 <distributionManagement> 中指定存储库方式:

    <repository>
      <id>company-repository</id>
      <name>Internal Releases</name>
      <url>http://my.nexus.repo/releases/${subRepositoryId}-releases</url>
    </repository>
    
  5. 可以在

  6. 中找到示例性的公司 pom
  7. 为了防止 pom 文件或设置中的配置更改,可以为关系使用别名 url。虽然这意味着管理方面需要付出额外的努力。
  8. 如果项目需要站点,则不能使用公司 pom 中的通用定义,必须为每个项目 pom 单独声明它。为了简化这个过程,站点关系 url 可以存储在公司 pom 的 属性 中,然后可以在项目 poms 的站点分发管理中引用它。

公司 pom 可能包含类似于此的内容:

  <project>
    ....
    <properties>
      <repository.group>common</repository.group>
      <repository.url.base>http://my.nexus:port/nexus/content</repository.url.base>
      <repository.url.repositories>${repository.url.base}/repositories</repository.url.repositories>
      <repository.url.sites>${repository.url.base}/sites</repository.url.sites>
    </properties>

    <distributionManagement>
      <repository>
        <id>company-repository</id>
        <name>Internal Releases</name>
        <url>${repository.url.repositories}/${repository.group}-releases</url>
      </repository>
      <snapshotRepository>
        <id>company-repository</id>
        <name>Internal Snapshots</name>
        <url>${repository.url.repositories}/${repository.group}-snapshots</url>
      </snapshotRepository>
    </distributionManagement>
    ....
  </project>

项目pom与此类似:

  <project>
    ...
    <properties>
      <repository.group>project-group</repository.group>
    </properties>

    <distributionManagement>
      <site>
        <id>company-repository</id>
        <name>Internal Releases</name>
        <url>dav:${repository.url.sites}/project-site</url>
      </site>
    </distributionManagement>
    ...
  </project>

警告:有人可能想知道为什么不直接将站点部分包含到公司 pom.xml 文件中。这是不可能的,因为您不能在不造成混乱的情况下将多个站点部署到同一个站点存储库。使用上面的方法不需要为每个项目创建一个存储库,而是能够将它们逻辑地分组到更大的组中或者将它们留在 common-releases/snapshots group/repository.

您可以查看 Apache Parent POM 或 Maven Parent POM。一个最小的企业 POM 应该是这样的:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>example-parent</artifactId>
  <version>1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Exmaple Parent POM</name>
  <organization>
    <name>Example Inc.</name>
  </organization>

  <!-- This marked as deprecated for Maven 3.x. This is checked by maven-enforcer-plugin -->
  <!-- http://jira.codehaus.org/browse/MNG-5297 -->
  <prerequisites>
    <maven>${maven.version}</maven>
  </prerequisites>

  <scm>
    <connection>scm:svn:https://example.com/repos/svn/ExmapleJava/example-parent/trunk/</connection>
    <developerConnection>scm:svn:https://example.com/repos/svn/ExmapleJava/example-parent/trunk/</developerConnection>
    <url>https://example.com/repos/websvn/browse/ExmapleJava/example-parent/trunk/</url>
  </scm>

  <distributionManagement>
    <repository>
      <id>nexus-example</id>
      <name>Nexus Exmaple Release Repository</name>
      <url>https://example.com/nexus/content/repositories/example-releases</url>
    </repository>
    <snapshotRepository>
      <id>nexus-example</id>
      <name>Nexus Exmaple Snapshot Repository</name>
      <url>https://example.com/nexus/content/repositories/example-snapshots</url>
    </snapshotRepository>
  </distributionManagement>

  <properties>
    <maven.version>3.2</maven.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <surefire.version>2.19</surefire.version>
    <javadoc.version>2.10.3</javadoc.version>
  </properties>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.4</version>
          <configuration>
            <excludeResources>true</excludeResources>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.6</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.6</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
          <configuration>
            <mavenExecutorId>forked-path</mavenExecutorId>
            <autoVersionSubmodules>true</autoVersionSubmodules>
            <useReleaseProfile>false</useReleaseProfile>
            <tagNameFormat>@{project.version}</tagNameFormat>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-help-plugin</artifactId>
          <version>2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>${javadoc.version}</version>
          <configuration>
            <quiet>true</quiet>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>2.7</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>${surefire.version}</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>2.6</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.10</version>
        </plugin>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>2.6.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.4</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>buildnumber-maven-plugin</artifactId>
          <version>1.4</version>
          <configuration>
            <buildNumberPropertyName>buildRevision</buildNumberPropertyName>
            <timestampPropertyName>buildTimestamp</timestampPropertyName>
            <scmBranchPropertyName>buildScmBranch</scmBranchPropertyName>
            <revisionOnScmFailure>non-SCM</revisionOnScmFailure>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>versions-maven-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <generateBackupPoms>false</generateBackupPoms>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>appassembler-maven-plugin</artifactId>
          <version>1.10</version>
          <configuration>
            <includeConfigurationDirectoryInClasspath>false</includeConfigurationDirectoryInClasspath>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>build-helper-maven-plugin</artifactId>
          <version>1.9.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-enforcer-plugin</artifactId>
          <version>1.4.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.8</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <artifactId>maven-enforcer-plugin</artifactId>
        <executions>
          <execution>
            <id>enforce-maven</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireMavenVersion>
                  <version>${maven.version}</version>
                  <message>This project requires at least Maven ${maven.version}</message>
                </requireMavenVersion>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>example-release</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>

插件当然会因您的公司而异,但这可以帮助您入门。这实际上是我们的家长刚刚删除了我们的本地信息。

没有站点部署的信息,因为我们不使用它。要用就设置。

没有 的时候你的 POM 应该包含 <repositories><pluginRepositories> 因为这是不好的做法。理想情况下,您在 Nexus 镜像(在 settings.xml 中)中使用一个回购组来处理您的所有请求。

继承并快乐。

如何处理网站: 通常,每个项目都有自己的站点,应该在 dist mngt 部分中覆盖。这与人工制品不同。您将托管在 Nexus 上还是托管在像 Apache 这样的网络服务器上取决于您。底线是每个项目站点都需要其独特的 URL.