2009-01-06 2 views
36

Maven2을 동일한 버전 번호의 많은 인공물을 포함하는 프로젝트의 빌드 시스템으로 사용하면 결과 빌드의 버전이 모든 pom.xml에 분산됩니다. 그 중 많은 부분에서 인공물의 버전 태그와 부모의 버전 태그에서 두 번까지도 마찬가지입니다. 따라서 모든 버전 전환시 모든 pom.xml의 새 버전을 변경하고 체크인해야합니다. 특히 버그 수정과 개발 버전을 병렬로 코딩해야하는 경우에는 다소 짜증이납니다. 그 주위에 방법이 있습니까?버전 번호가 분산되지 않은 maven 프로젝트의 계층 구조

CLARIFICATION : 내 질문은 pom의 버전 번호 및/또는 상위 pom의 버전 번호 만 다른 소스 제어 시스템에서 시간이 지남에 따라 얻을 수있는 모든 단일 pom.xml의 버전에 관한 것입니다. 이상적으로는 의존성 등을 추가 할 때마다 pom을 변경해야합니다.

예를 들어 유물 foo-pom (모두 pom to all), foobar-jar, foobaz-jar 및 foo-war가있는 프로젝트가 있습니다. 첫 번째 버전에서 버전은 1.0으로 모든 pom.xml에 나타납니다. 두 번째 릴리스에서 버전은 1.1이며 모든 pom.xml에도 다시 표시됩니다. 따라서 모든 pom.xml을 변경해야합니다. 자주 릴리스해야하는 경우 성가 시게됩니다.

업데이트 : 중요하다고 생각하는 경우 : 상위 버전을 지정하지 않아도 이미 고려 중입니다. maven JIRA issue으로 가서 더 많은 주목을 받고 향후 출시 될 기능 향상에 추가 될 가능성이 높아지도록 투표하십시오. 이를 위해 JIRA 로그인을 생성하거나 가지고 있어야합니다.

기본적으로 거의 동일한 문제 인 another Stackoverflow Question이 있습니다.

답변

7

내 프로젝트에서 그런 문제가 있습니다.

<properties> 
    <project-version>1.0.0</project-version> 
    <!-- Same version than the parent for the module 'commons' --> 
    <project-commons-version>${project-version}</project-commons-version> 
    <!-- A specific version for the 'business' module --> 
    <project-business-version>1.0.1</project-business-version> 
    ... 

을 그리고, 각 모듈의 pom.xml 파일에서, 나는 이러한 속성을 사용 : 내 부모에 정의 버전의 수를 줄이기 위해 각 모듈의 버전에 해당하는 일부 속성을, pom.xml 파일. 문제는이 pom.xml에 상위 버전을 명확하게 입력해야한다는 것입니다. 예를 들어, 내 사업의 pom.xml에, 내가 가진 :

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <!-- I must indicate the version of the parent --> 
    <parent> 
    <groupId>my.project</groupId> 
    <artifactId>parent</artifactId> 
    <version>1.0.0</version> 
    </parent> 
    ... 
    <dependencies> 
    <!-- However, in my dependencies, I use directly the properties defined in the parent's pom.xml --> 
    <dependency> 
     <groupId>my.project</groupId> 
     <artifactId>project-persistence</artifactId> 
     <version>${project-persistence-version}</version> 
    </dependency> 

그러나, 나는 정말 당신을 위해 모든 버전 번호를 수정 담당하게 될 것 release plugin에 모습을 가지고하는 것이 좋습니다.

+0

이것은 릴리스 플러그인을 제외하고 우리가 사용하고있는 패턴입니다. 어떻게 든 모든 pom.xml에 부모 버전을 두는 것을 피할 수 있는지 궁금합니다. 하지만 부모 버전에서만 다른 소스 제어에서 많은 버전의 pom으로 살아야합니다. –

+1

이 방법은 Maven 버전 플러그인으로 보완 될 수 있다고 생각합니다. http://mojo.codehaus.org/versions-maven-plugin 자식 프로젝트에서 parent.version 태그를 자동으로 증가시킬 수 있습니다. 버전보기 : update-child-modules goal. – Dan

7

article이 문제를 해결하기 위해 제공합니까?

아이디어는 전체 프로젝트의 버전 번호를 속성 (예 : "장난"(말장난 의도))으로 부모 pom에 선언하는 것입니다. 부모 pom의 자체 버전 번호는 "SNAPSHOT"으로 끝나는 한 무엇이든 될 수 있습니다.

하위 모듈의 버전은 $ {aversion} 속성을 통해 지정됩니다. 자녀의 부모 버전에 대한 참조는 하드 코딩되어 있습니다. 그러나 상위 pom의 버전은 SNAPSHOT이므로 하위 모듈은 상위 pom의 변경 사항을 보게됩니다. 특히 parent pom이 $ {aversion}의 값을 변경하면 자식이 변경 사항을 볼 수 있습니다.

의견에 따르면 완벽한 해결책이 아닙니다.

그리고 릴리스 플러그인은 실제 문제를 해결하지 않습니다 : 을 병합합니다.
모든 곳에서 버전 번호를 끊임없이 복사하면 분기를 다시 가져올 때 많은 충돌이 발생합니다.

참고 : 메이븐 2.0.9와

(최신 일 - 4 월 2008) 그들의 부모로부터 버전을 상속으로 단순히 개별 모듈에서 버전 요소를 생략하고있다. 이것은 모듈이 부모와 같은 groupId를 공유하는 경우 groupId와 함께 작동합니다.

+2

VonC는 부모님과 같기를 원할 경우 부모님의 groupId와 artifactId를 생략 할 수 있다는 점에서 옳습니다. 그러나 멀티 모듈 계층 구조 에서조차 부모 버전을 명시 적으로 선언해야한다는 과제가 여전히 존재합니다. –

3

이것은 문제를 해결할 수있는 maven의 확장을위한 아이디어입니다. 현재 pom.xml에 이슈 및 상위 pom의 버전을 작성해야합니다.

<parent> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>my-parent</artifactId> 
    <version>2.0</version> 
    <relativePath>../my-parent</relativePath> 
</parent> 

상위의이 치어 IFF 받는다는 버전 모두 생략이 상대 경로로 부모 치어를 액세스 할 수 있도록하는 경우 : 이미 부모 치어의 절대 위치를 제공 할 수있는 방법이있다 , 당신은 끝났습니다. 버전은 상위 pom과 다른 곳에서만 언급됩니다. 제 생각에는

메이븐 2로 만든 대형 시스템에서 작업하는 동안

+0

비교 http://jira.codehaus.org/browse/MNG-1012 –

8

나는 비슷한 문제로 실행했습니다, 전형적인 멀티 모듈 구조의 단점은이 모든 모듈이 동일한 버전을 공유 할 수 있다는 것입니다 . 다음 릴리스는 foobar-jar의 버그 수정으로 구성 되더라도 (수동 또는 maven-release-plugin)으로 전역 버전을 변경하고 모든 구성 요소의 새 릴리스를 롤업해야합니다. 필자의 경우 다양한 WAR/EAR 응용 프로그램을 만들었으므로 app1에만 영향을 미쳤을 때 app1app2의 새 버전을 제공 한 이유를 묻습니다.

반대의 방법은 각각의 구성 요소를 독립적 인 프로젝트로 관리하는 것입니다. 이것은 이 부분 릴리스를 허용하므로 더 유연하지만 모든 버전을 수동으로 추적해야합니다 (다음 번 전송할 버전을 확인하고 내부 종속성이 일치하는지 확인하는 등). 이것은 빠르게 큰 응용 프로그램에서 악몽이 될 수 있습니다.

저는 시스템의 글로벌 일관성을 포기하지 않고 독립적 인 버전의 유연성이라는 두 가지 접근 방식을 결합하는 방법에 대해 오랫동안 생각해 왔습니다. 나는 romaintaz와 같은 접근법을 시도했고, 같은 문제에 부딪쳤다. 마지막으로, 나는이 아이디어를 내놓았다 : http://out-println.blogspot.com/2008/10/maven-modules-with-independent-versions.html.

'실험적'으로 생각하십시오. 기술적으로는 비 기술적 인 이유로 끝까지 살려고 시도하지 않았습니다. 그러나 나는 그것이 트릭을 할 것이라고 생각한다.

+0

블로그 링크가 죽었습니다. 새로운 링크를 제공해주십시오. –

0

maven issue이 해결 될 때까지는 다른 간단한 해결책이 있습니다. 하나의 커다란 프로젝트에서 우리는 더 이상 pom.xml 자체를 버전 컨트롤에 넣지 않고 pom-template.xml에 버전 번호에 대한 자리 표시 자만 포함합니다.버전 관리에서 프로젝트 트리를 업데이트 한 후에는 모든 디렉토리에 실제 pom.xml을 생성하는 작은 개미 스크립트를 실행해야합니다. 이것은 짜증나지만, 그 모든 귀찮은 pom 버전을 참 아야하는 것보다 덜 짜증나게합니다.

1

정확하게이 문제가 있습니다. 우리는 서로 다른 프로젝트의 상당수 (약 10 개)를 가지고 있습니다. 프로젝트가 포함 된 폴더에는 전체 프로젝트 세트에 대한 부모 pom이 있습니다. 우리가 새로운 지사를 만들 때마다 우리는 각각의 모든 pom 파일에 들어가서 부모를 위해 < 버전> 요소와 < 버전>을 변경해야했습니다.이 모든 편집은 성가 셨습니다.

이 질문과 답변을 읽은 후 나는 상황이 절망적이라는 것을 깨달았습니다. 각 프로젝트는 부모 pom의 < 버전 요소를 상속 받아 삭제하기 쉽지만 부모가 < 인 경우 < 버전을 상속받지 못했습니다.

불행히도, 제 동료에게 불가능하다고 말한 것을 잊어 버렸기 때문에 고쳐졌습니다.

<version>${currentVersion}</version> 

내가 왜이 작품을 모르는 : 우리는이 같은 상위 버전 태그를 선언 하위 POM 파일에서 다음

<properties><currentVersion>2.6.1-SNAPSHOT</currentVersion></properties> 

: 그의 해결책은 부모 치어 파일에 속성을 추가하는 것이 었습니다 . 버전 번호를 지정하지 않고 올바른 부모를 찾을 수있는 방법을 모르겠다. 하지만 나를 위해 (Maven 버전 1.5.0_22) 입니다.

+0

대신이 릴리스 플러그인을 사용해보십시오. 버전 번호를 변경하는 데 도움이됩니다. – JohnnyK

+1

예, Jakrabbit, 두 가지를 제외하고. (1) 우리는 릴리스 플러그인을 사용하는 데 어려움을 겪고있는 릴리스 프로세스의 다른 특성을 가지고 있으며, (2) 내가 설명한대로 더 이상 문제가 발생하지 않습니다. – mcherm

+0

왜이 답변이 다운 되었습니까? 그것은 godd 해결책입니다 (나는 부모님에서' $ {version}'을 사용하고 있습니다. – Tommaso