[java] Maven의 DistributionManagement 조직 전체를 지정하는 방법은 무엇입니까?

중앙 넥서스 저장소에 배포 할 수 있도록 많은 (약 50 개 이상의) maven2 프로젝트를 구성하는 방법을 알아 내려고합니다. mvn deploy목표를 사용할 때 다음과 같이 distributionManagement 태그에 대상을 지정해야합니다.

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>

이제 모든 단일 pom.xml (50 개 이상)이이 블록을 반복해서 포함하는 것을 원하지 않습니다. 내 첫 번째는settings.xml 파일 파일이지만 (설계 상) 거기에서 정의하는 것이 불가능한 것 같습니다. 그래서, 첫 번째 질문은 왜 그럴까요? 가능하다면 모든 개발자에게 배포 할 수있는 maven2 배포의 settings.xml에서 지정할 수 있습니다.

내가 찾은 유일한 해결책은 이러한 설정을 포함하는 조직 전체의 master-pom 프로젝트를 만들고 다른 모든 pom.xml이 <parent>태그 를 통해이 master-pom에 종속되도록하는 것 입니다. 그러나 이것은 다중 모듈 빌드에서 다소 이상하게 보입니다.

- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
    - Project 1 module pom (with pm as parent)
    - Project 2 module pom (with pm as parent)

일반적으로 모든 문서에서 모듈 poms가 부모 pom을 사용해야한다고 읽었습니다. 그러나 Inheritance v. Aggregation에 대한 maven 웹 사이트를 읽은 후 실제로 가능하다고 기록되었습니다.

내가 찾은 한 가지 문제는 maven 사이트 생성과 관련 하여이 설정에 문제가있는 것 같습니다 (직접 역 참조가없는 경우 모듈이 올바르게 연결되지 않음)

그렇다면 이것이 유효한 접근 방식입니까? 문제에 대한 다른 더 분명하고 간단한 해결책이 있습니까?



답변

이를위한 가장 좋은 해결책은 조직의 모든 프로젝트에 대해 일반적으로 간단한 상위 pom 파일 프로젝트 ( ‘pom’패키징 포함)를 만드는 것입니다.

<?xml version="1.0" encoding="UTF-8"?>
<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>your.company</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <distributionManagement>
        <repository>
            <id>nexus-site</id>
            <url>http://central_nexus/server</url>
        </repository>
    </distributionManagement>

</project>

이는 모든 사람이 아티팩트에 액세스 할 수 있도록 로컬 넥서스에 구축, 출시 및 배포 할 수 있습니다.

이제 사용하려는 모든 프로젝트에 대해 다음 섹션을 포함하십시오.

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>

이 솔루션을 사용하면 회사의 모든 프로젝트에 다른 공통 사항을 쉽게 추가 할 수 있습니다. 예를 들어 JUnit 사용을 특정 버전으로 표준화하려는 경우 여기가 완벽한 장소입니다.

자체 상위가있는 다중 모듈 구조를 사용하는 프로젝트가있는 경우 Maven은 체인 상속도 지원하므로 프로젝트의 상위 pom 파일이 회사의 상위 pom을 참조하고 프로젝트의 하위 모듈이 사용자를 인식하지 못하도록하는 것이 완벽하게 허용됩니다. 회사의 부모.

귀하의 예제 프로젝트 구조에서 상위 프로젝트를 수집기 pom과 동일한 수준에 배치하려고 시도하고 있음을 알 수 있습니다. 프로젝트에 자체 부모가 필요한 경우 가장 좋은 방법은 나머지 모듈과 동일한 수준에 부모를 포함하고 모든 모듈의 디렉터리가있는 루트에 집계 자 pom.xml 파일을 두는 것입니다.

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

이 구조로 수행하는 작업은 어 그리 게이터에 상위 모듈을 포함 mvn install하고 루트 디렉토리에서 모든 것을 빌드하는 것입니다 .

우리는 조직에서이 정확한 솔루션을 사용하고 있으며 시간의 시험을 견뎌냈 고 우리에게 아주 잘 작동했습니다.


답변

부모 POM이 필요하지 않습니다.

poms에서 distributionManagement 부분을 완전히 생략하고 빌드 서버 또는 settings.xml에서 설정할 수 있습니다.

빌드 서버에서 수행하려면 다음 mvn명령에 전달하십시오 .

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html을 참조 하십시오.설정할 수있는 옵션에 대한 자세한 내용 을 .

이것을 설정하는 것도 가능합니다. settings.xml .

활성화되고 속성을 포함하는 프로필을 생성하십시오.

settings.xml 예 :

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

“스냅 샷”및 “릴리스”에 대한 자격 증명이 <servers> settings.xml 섹션에 있는지 확인합니다.

altSnapshotDeploymentRepository 및 altReleaseDeploymentRepository 속성은 maven-deploy-plugin 버전 2.8과 함께 도입되었습니다. 이전 버전은 오류 메시지와 함께 실패합니다.

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

이 문제를 해결하기 위해 최신 버전의 플러그인을 적용 할 수 있습니다.

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>


답변