2012-01-12 5 views
8

많은 종속성을 가진 프로젝트가 있습니다. mvn deploy (또는 그 변형) 명령을 호출하면 프로젝트 자체를 원격 저장소에 배포 할뿐만 아니라 모든 종속 항목도 배포하고 싶습니다. 이것이 가능한가? 나는이 사이트에서 많은 '비슷한 질문'을 본다. 그러나 나는 이것으로 단순히 놓여있는 것을 찾을 수 없다. 내가 본 다른 모든 기능은 몇 가지 추가 기능을 기대합니다. 간단히 프로젝트를 배포하고 모든 의존성을 원격 저장소에 배포하기 만하면됩니다. maven 컴파일러 플러그인을 사용하고 있습니다. 1.5Maven - 원격 저장소에 의존성 배포

이것은 내 settings.xml의 스 니펫입니다. 내가 뭘 놓쳤는가? 사전에

<mirrors> 
<mirror> 
    <!--This is used to direct the public snapshots repo in the 
     profile below over to a different nexus group --> 
    <id>nexus-public-snapshots</id> 
    <mirrorOf>public-snapshots</mirrorOf> 
    <url>http://{ourServer}/nexus/content/groups/public-snapshots</url> 
</mirror> 
<mirror> 
    <!--This sends everything else to /public --> 
    <id>nexus</id> 
    <mirrorOf>*</mirrorOf> 
    <url>http://{ourServer}/nexus/content/groups/public</url> 
</mirror> 
    </mirrors> 
<profiles> 
<profile> 
    <id>development</id> 
    <repositories> 
    <repository> 
     <id>central</id> 
     <url>http://central</url> 
     <releases><enabled>true</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </repository> 
    </repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>central</id> 
     <url>http://central</url> 
     <releases><enabled>true</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </pluginRepository> 
    </pluginRepositories> 
</profile> 
<profile> 
    <!--this profile will allow snapshots to be searched when activated--> 
    <id>public-snapshots</id> 
    <repositories> 
    <repository> 
     <id>public-snapshots</id> 
     <url>http://public-snapshots</url> 
     <releases><enabled>false</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </repository> 
    </repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>public-snapshots</id> 
     <url>http://public-snapshots</url> 
     <releases><enabled>false</enabled></releases> 
     <snapshots><enabled>true</enabled></snapshots> 
    </pluginRepository> 
    </pluginRepositories> 
</profile> 
</profiles> 

감사
~ J

+0

나는 당신이 당신의 개발 환경에서 구축 및 서버에 대한 결과물 (항아리, 전쟁, 귀, 또는 OSGi 번들)를 배포 받는다는을 사용하여, 잘못지고있다 생각합니다. 당신은 원격 저장소에 의해 정확히 무엇을 의미합니까 ??? 그것 서버입니까 ?? 또는 코드 저장소 ??? –

+0

아니요. mvn deploy 명령 줄에서 (또는 m2Eclipse Eclipse 플러그인을 사용하여 "Run As -> Maven Deploy"를 사용하여) 회사 원격 Maven 저장소에 배포하는 것을 말합니다. – jacosta

+0

우리는 sonatype nexus를 사용하고 있습니다. 차이점은, 비록 mvn install/mvn deploy가 maven에만 국한되지는 않지만 넥서스가 아니라고 생각합니다. – jacosta

답변

2

당신은 깨끗하고 로컬 저장소, 응용 프로그램을 구축하고 종속성 실패, 기업 저장소에 해당 응용 프로그램을 배포하는 시도로 시작할 수 있습니다. 이렇게하면 응용 프로그램이 빌드되고 배포되기 전에 응용 프로그램이 필요로하는 모든 종속성이 회사 리포지토리에 있는지 확인할 수 있습니다.

이전에는 로컬 저장소가 central 및 기타 잘 알려진 리포지토리를 미러링하도록 구성하여 오픈 소스 타사 라이브러리가 수동으로 업로드하지 않고 자동으로 원격 리포지토리에 들어갈 수 있도록합니다.

수동으로 배포해야하는 타사 라이브러리가 너무 많지 않을 수 있습니다.

+0

"중앙 저장소 및 다른 잘 알려진 리포지토리를 미러링하도록 로컬 저장소 구성"에 대한 요지를 자세히 설명 할 수 있습니까? 나는이게 무슨 뜻인지 모르겠다. 내 로컬 저장소가 중앙 저장소를 미러링하는 경우 라이브러리는 원격 저장소에서 어떻게됩니까? 나는 사과한다, 나는 이것에 상당히 정통하지 않다. ... – jacosta

+0

@ jacosta. 일반적으로 저장소 관리자는 프로젝트 중앙 집중식 저장소와 기타 필요한 저장소를 미러링하고 프로젝트 별 아티팩트 배포를 허용하도록 구성됩니다. 후자는'mvn deploy'를 사용하여 수행됩니다. – Raghuram

+0

그래서 중앙 미러링하고'mvn deploy'를 실행하면 중앙에서 필요한 모든 것을 로컬 repo로 가져오고 필요한 모든 것을 원격 저장소에 배포합니다. – jacosta

3

원격 저장소 (Nexus, Artifactory 등) 및 settings.xml이 올바르게 구성되었다고 가정하면 간단하게 작동하는 방법은 다음과 같습니다.

commons-logging에 의존성이있는 프로젝트가 있다고 가정 해 보겠습니다. Maven이 프로젝트의 종속성을 빌드의 일부로 해결할 때 다음 단계를 수행합니다.

  1. 로컬 repo를 commons-logging으로 검사합니다.
  2. 발견되면 완료됩니다. 빌드를 계속하십시오.
  3. 찾을 수없는 경우 : 원격 저장소에서 commons-logging을 확인하십시오.
  4. 이슈가 발견되면 이슈를 로컬 저장소로 다운로드하십시오. 끝난; 빌드를 계속하십시오.
  5. 원격 저장소에없는 경우 : 원격 저장소commons-logging에 다운로드 센터에 문의하십시오. 그런 다음 Maven이 로컬 저장소로 다운로드 할 수 있습니다. 끝난; 빌드를 계속하십시오.

이 단계가 끝날 때 commons-logging은 더 이상 할 일없이 로컬 및 원격 저장소에 저장되어 있어야합니다. 그렇지 않은 경우 의존성을 검색 할 때 settings.xml이 원격 저장소에 연결하도록 구성되어 있지 않습니다 (중앙에 직접 연결되어 있습니까?) 또는 Nexus가 올바르게 구성되지 않았습니다. 편집 ----

---- 여기에 작동 내 Settings.XML이의 조각입니다. @Raghuram은 두 가지 프로파일을 모두 사용할 것을 제안 할 때 좋은 팁을주었습니다. 어떤 식 으로든 public-snapshots 프로필 만 사용하도록 설정하면 빌드가 중앙에서 직접 maven에 계속 충돌합니다.

.... 
<mirrors> 
    <!-- redirects all traffic to internal Nexus repo instead of Maven central --> 
    <mirror> 
     <id>maven2</id> 
     <mirrorOf>*</mirrorOf> 
     <url>http://repository.someCompany.com/maven2RepoOrGroupInNexus</url> 
    </mirror> 
</mirrors> 
.... 
<profiles> 
    <profile> 
     <id>repo-profile</id> 
     <repositories> 
      <repository> 
       <id>central</id> 
       <url>http://gotoNexus</url> <!-- URL is unimportant here --> 
       <snapshots> 
        <enabled>true</enabled> 
        <updatePolicy>daily</updatePolicy> 
       </snapshots> 
       <releases> 
        <enabled>true</enabled> 
        <updatePolicy>daily</updatePolicy> 
       </releases> 
      </repository> 
     </repositories> 
    </profile> 
</profiles> 
<activeProfiles> 
    <activeProfile>repo-profile</activeProfile> <!-- important --> 
</activeProfiles> 

아래쪽에 activeProfiles 요소가 있음에 유의하십시오. 그것이 모든 mvn 명령에 Maven 중심 대신 Nexus를 사용할 수 있도록하는 방법입니다.

<mirror>에 정의 된 URL에 Maven Central의 콘텐츠가 포함되도록 Nexus를 구성해야하지만 Nexus를 구성하는 방법은 별도의 질문입니다.

참조 :

+0

나는이 일을했다고 생각했지만, 나는 여전히 나의 원격 저장소와 중앙에서 동시에 설치하는 것처럼 보이지 않는다. 나는 그것을 하나 또는 다른 것으로부터 설치할 수있다. 내 settings.xml의 스 니펫을 원래의 질문에 추가했으면 좋겠다. – jacosta

1

Nexus docs for Maven configuration 내가 덜 기존의 답변에 비해 의존성을 해결하기위한 시행 착오처럼 많이 보이는 다음과 같은 솔루션을 제안한다.

기본 프로젝트를 배포 한 후에 mvn -Dmdep.copyPom=true dependency:copy-dependencies으로 전화를 걸어서 할 수 있습니다. 그러면 프로젝트의 모든 종속성이 각각의 pom 파일을 포함하여 target/dependency으로 일시적으로 복사됩니다.

그런 다음 모든 종속성을 반복하여 deploy:deploy-file을 사용하여 리포지토리에 배포 할 수 있습니다 (예 : deploy:deploy-file). 이러한 bash는 루프 :

for pom in target/dependency/*.pom; do mvn deploy:deploy-file -Durl=http://your/repo -Dfile="${pom%%.pom}.jar" -DgeneratePom=false -DpomFile="$pom"