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


110

중앙 넥서스 저장소에 배포 할 수 있도록 많은 (약 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 사이트 생성과 관련 하여이 설정에 문제가있는 것 같습니다 (직접 역 참조가없는 경우 모듈이 올바르게 연결되지 않음)

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



5
@OhadR : 그들은 단지 하나의 프로젝트에서 작성하는 방법만을 작성합니다. 포인트는 내가 500 배 ...에 대해 그것을 복제하고 싶지 않았다이다
mglauche

1
내가 참조. 요점을 알았어. 그래서 말했다 응답 한 하나로서, 당신이 프로젝트의 주요 치어을 가질 수 있습니다, 그 뜻합니다 ... 'distribMngmnt'를 포함
OhadR

답변:


144

이를위한 가장 좋은 해결책은 조직의 모든 프로젝트에 대해 일반적으로 간단한 상위 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하고 루트 디렉토리에서 모든 것을 빌드하는 것입니다 .

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


여기에 프로젝트 상속을 더 자세히 설명하고 복잡성을 상속하는 방법을 관리하는 방법에 대한 또 다른 답변이 있습니다. ;) stackoverflow.com/questions/6347913
Jesse Webb

7
작은 메모 : 회사 부모가 최상의 솔루션 인 이유에 대해서는 Maven 사용자 목록의 settings.xml 에서 distributionManagement를 지정할 수 없음 토론을 참조하십시오 .
Premek Brada 2011 년

"클라이언트가 코드를 소유"하는 고전적인 컨설팅 모델에서 개발 팀은 프로젝트 외부에서 작업 한 다음 최신 코드를 클라이언트 사이트로 가져와 다시 빌드해야합니다. 제 상황에서 다중 모듈 프로젝트로 작업 할 때 프로젝트 상위 POM에서 회사 POM을 참조하는 경우 클라이언트의 회사 POM을 가리 키도록 해당 참조를 업데이트해야합니다. 도움이된다면 settings.xml의 모든 환경 별 설정을 유지하려고 노력하고 싶습니다. 내 상황에 권장되는 접근 방식은 무엇입니까?
웹 사용자

2
@WebUser 귀하의 문제는이 답변이 해결하는 것과는 달리 POM 파일에 다른 값이 필요한 상황처럼 들립니다. 여러 모듈에서 중복 설정을 피하는 것입니다. settings.xml 파일을 통해 속성을 주입 해야한다고 생각 합니다 . 그래도 도움이되지 않는 경우 여기에서 새 질문을하고 여기에 링크하면 추가로 도움을 드리겠습니다.
Jesse Webb 2011

감사합니다 @JesseWebb 나는 그것을 시도하고 내가 설명한 상황에 대해 POM에서 이러한 값을 추상화하는 것이 유용합니다. 내 필요에 따라 활성 프로필과 POM에서 해결 된 속성 아래에 관련 속성을 추가했습니다.
웹 사용자

36

부모 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>

이 솔루션을 계속해서 시도하고 있지만 altDeploymentRepository 속성 만 작동합니다. altReleaseDeploymentRepositoryaltSnapshotDeploymentRepository 가 인식되지 않고 다음 오류가 발생합니다. Deployment failed : repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository = id :: layout :: url paramete. 어떤 제안이라도 도움이 될 것입니다. 감사합니다
Shabirmean

@Shabirmean 그 이유는 배포 플러그인의 너무 오래된 버전 때문입니다. 나는 해결책으로 내 대답을 확장했습니다.
Michael Wyraz

네, 알았어요. 대단히 :) 감사
Shabirmean
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.