[java] Maven에 최신 버전의 종속성을 사용하도록하려면 어떻게해야합니까?

Maven에서 종속성은 일반적으로 다음과 같이 설정됩니다.

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

이제 릴리스가 빈번한 라이브러리를 사용하는 경우 <version> 태그를 지속적으로 업데이트하면 다소 성 가실 수 있습니다. Maven에 항상 최신 버전 (저장소에서)을 사용하도록 지시 할 수있는 방법이 있습니까?



답변

노트:

이 답변은 Maven 2에만 적용됩니다! 언급 LATESTRELEASE메타 버전 6 년 전 Maven 3에서 “재생 가능한 빌드를 위해”삭제되었습니다 . 이 Maven 3 호환 솔루션을 참조하십시오 .


항상 최신 버전을 사용하려는 경우 Maven에는 버전 범위의 대안으로 사용할 수있는 두 개의 키워드가 있습니다. 더 이상 사용중인 플러그인 / 종속성을 제어 할 수 없으므로이 옵션을주의해서 사용해야합니다.

플러그인 또는 종속성에 의존 할 때 LATEST 또는 RELEASE의 버전 값을 사용할 수 있습니다. LATEST는 특정 저장소에서 가장 최근에 배포 된 아티팩트의 최신 릴리스 또는 스냅 샷 버전을 나타냅니다. RELEASE는 저장소에서 마지막 비 스냅 샷 릴리스를 나타냅니다. 일반적으로 아티팩트의 비 특정 버전에 의존하는 소프트웨어를 설계하는 것은 모범 사례가 아닙니다. 소프트웨어를 개발하는 경우 RELEASE 또는 LATEST를 편의상 사용하여 타사 라이브러리의 새 릴리스가 릴리스 될 때 버전 번호를 업데이트하지 않아도됩니다. 소프트웨어를 출시 할 때는 항상 프로젝트가 특정 버전에 의존하여 빌드 또는 프로젝트가 통제 할 수없는 소프트웨어 릴리스의 영향을받을 가능성을 줄 이도록해야합니다.

자세한 내용은 Maven 서적POM 구문 섹션 을 참조하십시오. 또는 종속성 버전 범위 에 대한이 문서를 참조하십시오 .

  • 대괄호 ( [& ])는 “닫힌”(포함)을 의미합니다.
  • 괄호 ( (& ))는 “열기”(독점)를 의미합니다.

다음은 다양한 옵션을 보여주는 예입니다. Maven 저장소에서 com.foo:my-foo에는 다음 메타 데이터가 있습니다.

<?xml version="1.0" encoding="UTF-8"?><metadata>
  <groupId>com.foo</groupId>
  <artifactId>my-foo</artifactId>
  <version>2.0.0</version>
  <versioning>
    <release>1.1.1</release>
    <versions>
      <version>1.0</version>
      <version>1.0.1</version>
      <version>1.1</version>
      <version>1.1.1</version>
      <version>2.0.0</version>
    </versions>
    <lastUpdated>20090722140000</lastUpdated>
  </versioning>
</metadata>

해당 아티팩트에 대한 종속성이 필요한 경우 다음 옵션이 있습니다 ( 물론 여기에 관련 옵션 만 표시하여 다른 버전 범위를 지정할 수 있음).

정확한 버전을 선언하십시오 (항상 1.0.1로 해결됨).

<version>[1.0.1]</version>

명시 적 버전을 선언하십시오 (Maven이 일치하는 버전을 선택할 때 충돌이 발생하지 않는 한 항상 1.0.1로 해결됨).

<version>1.0.1</version>

모든 1.x의 버전 범위를 선언하십시오 (현재 1.1.1로 해결됨).

<version>[1.0.0,2.0.0)</version>

개방형 버전 범위를 선언합니다 (2.0.0으로 해결).

<version>[1.0.0,)</version>

버전을 최신 버전으로 선언 (2.0.0으로 해결) (maven 3.x에서 제거됨)

<version>LATEST</version>

버전을 RELEASE (1.1.1로 해결됨)로 선언하십시오 (maven 3.x에서 제거됨).

<version>RELEASE</version>

기본적으로 자체 배포는 Maven 메타 데이터에서 “최신”항목을 업데이트하지만 “release”항목을 업데이트하려면 Maven super POM 에서 “release-profile”을 활성화해야합니다 . “-Prelease-profile”또는 “-DperformRelease = true”를 사용하여이 작업을 수행 할 수 있습니다.


Maven이 의존성 버전 (LATEST, RELEASE 및 버전 범위)을 선택할 수있는 모든 접근 방식은 이후 버전이 다른 동작을 가질 수 있기 때문에 시간 문제를 빌드 할 수있게 해줍니다 (예 : 의존성 플러그인이 이전에 기본값을 전환했습니다) 혼란스러운 결과와 함께 true에서 false 로의 값).

따라서 일반적으로 릴리스에서 정확한 버전을 정의하는 것이 좋습니다. 으로 팀의 답변이 지적은 받는다는 – 버전 – 플러그인은 의존성 버전, 특히 업데이트를위한 편리한 도구입니다 사용 – 최신 – 버전 : 버전버전 : 사용 – 최신 – 방출 목표를.


답변

이제이 주제가 오래 되었다는 것을 알고 있지만 질문과 OP 제공 답변을 읽으면 실제로 Maven Versions Plugin 이 그의 질문에 더 나은 답변 일 것 같습니다 .

특히 다음 목표가 사용될 수 있습니다.

  • versions : use-latest-versions 는 최신 버전 인 모든 버전을 pom에서 검색하여 최신 버전으로 바꿉니다.
  • versions : use-latest-releases는 최신 릴리스 인 모든 비 SNAPSHOT 버전을 pom에서 검색하여 최신 릴리스 버전으로 바꿉니다.
  • versions : update-properties 는 프로젝트에 정의 된 속성을 업데이트하여 사용 가능한 최신 버전의 특정 종속성에 해당합니다. 이는 종속 제품군이 모두 하나의 버전으로 잠겨 야하는 경우에 유용 할 수 있습니다.

다음과 같은 다른 목표도 제공됩니다.

  • versions : display-dependency-updates 는 프로젝트의 종속성을 스캔하고 사용 가능한 최신 버전이있는 해당 종속성에 대한 보고서를 생성합니다.
  • versions : display-plugin-updates 는 프로젝트 플러그인을 스캔하고 최신 버전이있는 플러그인에 대한 보고서를 생성합니다.
  • versions : update-parent 는 사용 가능한 최신 버전을 참조하도록 프로젝트의 상위 섹션을 업데이트합니다. 예를 들어 회사 루트 POM을 사용하는 경우 최신 버전의 회사 루트 POM을 사용해야하는 경우이 목표가 도움이 될 수 있습니다.
  • versions : update-child-modules 는 프로젝트 하위 모듈의 상위 섹션을 업데이트하여 버전이 현재 프로젝트 버전과 일치하도록합니다. 예를 들어, 집계하는 프로젝트의 상위이기도 한 수집기 pom이 있고 하위 및 상위 버전이 동기화되지 않은 경우이 모조가 하위 모듈의 버전을 수정하는 데 도움이 될 수 있습니다. (프로젝트가 너무 잘못되어 버전 불일치로 인해 빌드 할 수없는 경우이 목표를 실행하려면 -N 옵션으로 Maven을 호출해야 할 수도 있습니다).
  • versions : lock-snapshots 는 모든 -SNAPSHOT 버전에 대한 pom을 검색하여 해당 -SNAPSHOT의 현재 타임 스탬프 버전 (예 : -20090327.172306-4)으로 대체합니다.
  • versions : unlock-snapshots 는 모든 타임 스탬프 잠금 스냅 샷 버전에 대한 pom을 검색하여 -SNAPSHOT으로 바꿉니다.
  • versions : resolve-ranges 는 버전 범위를 사용하여 종속성을 찾고 사용중인 특정 버전으로 범위를 확인합니다.
  • versions : use-releases는 릴리스 된 모든 -SNAPSHOT 버전을 pom에서 검색하여 해당 릴리스 버전으로 바꿉니다.
  • versions : use-next-releases 는 최신 릴리스 인 모든 비 SNAPSHOT 버전을 pom에서 검색하여 다음 릴리스 버전으로 바꿉니다.
  • versions : use-next-versions 는 최신 버전 인 모든 버전을 pom에서 검색하여 다음 버전으로 바꿉니다.
  • versions : commit 은 pom.xml.versionsBackup 파일을 제거합니다. 내장 된 “Poor Man ‘s SCM”의 절반을 구성합니다.
  • versions : revert 는 pom.xml.versionsBackup 파일에서 pom.xml 파일을 복원합니다. 내장 된 “Poor Man ‘s SCM”의 절반을 구성합니다.

나중에 참조 할 수 있도록 포함시킬 것이라고 생각했습니다.


답변

살펴 보시기 바랍니다 이 페이지를 (섹션 “종속성 버전 범위”). 당신이하고 싶은 것은

<version>[1.2.3,)</version>

이 버전 범위는 Maven2에서 구현됩니다.


답변

다른 사람들과 달리 항상 최신 버전을 원할 많은 이유가 있다고 생각 합니다. 특히 지속적인 배포를 수행하는 경우 (하루에 5 개의 릴리스가있는 경우도 있음) 다중 모듈 프로젝트를 원하지 않습니다.

내가하는 일은 Hudson / Jenkins가 모든 빌드마다 다음을 수행하도록하는 것입니다.

mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true

즉, 버전 플러그인과 scm 플러그인을 사용하여 종속성을 업데이트 한 다음 소스 제어에 체크인합니다. 예, CI가 SCM 체크인을 수행하게했습니다 (어쨌든 maven 릴리스 플러그인을 위해해야합니다).

원하는 버전 만 업데이트하도록 버전 플러그인을 설정하려고합니다.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>versions-maven-plugin</artifactId>
    <version>1.2</version>
    <configuration>
        <includesList>com.snaphop</includesList>
        <generateBackupPoms>false</generateBackupPoms>
        <allowSnapshots>true</allowSnapshots>
    </configuration>
</plugin>

릴리스 플러그인을 사용하여 -SNAPSHOT를 처리하고 릴리스 버전 -SNAPSHOT (중요)가 있는지 확인하는 릴리스를 수행합니다.

내가하는 일을하면 모든 스냅 샷 빌드의 최신 버전과 릴리스 빌드의 최신 릴리스 버전이 제공됩니다. 빌드도 재현 할 수 있습니다.

최신 정보

이 워크 플로에 대해 구체적으로 묻는 의견이 있습니다. 필자는이 방법을 더 이상 사용하지 않으며 메이븐 버전 플러그인이 버그가 있고 일반적으로 결함이있는 큰 이유가 있다고 말할 것이다.

버전 플러그인을 실행하여 버전을 조정하면 pom이 올바르게 실행 되려면 기존 버전이 모두 있어야하기 때문에 결함이 있습니다. 즉, pom에서 참조 된 버전을 찾을 수없는 경우 버전 플러그인이 최신 버전으로 업데이트 할 수 없습니다. 디스크 공간 때문에 구 버전을 정리하기 때문에 실제로는 다소 성가신 일입니다.

실제로 버전을 조정하려면 maven과 별도의 도구가 필요합니다 (따라서 제대로 실행하려면 pom 파일에 의존하지 않음). 나는 Bash 인 낮은 언어로 그러한 도구를 작성했습니다. 스크립트는 버전 플러그인과 같은 버전을 업데이트하고 pom을 소스 제어로 다시 확인합니다. 또한 mvn 버전 플러그인보다 100 배 빠르게 실행됩니다. 불행히도 공용 사용법으로 작성되지는 않았지만 사람들이 관심이 있다면 그렇게하여 요지 또는 github에 넣을 수 있습니다.

몇 가지 의견이 우리가하는 일에 대해 물었을 때 워크 플로로 돌아갑니다.

  1. 우리는 자신의 젠킨스 작업과 함께 자신의 저장소에 20 개 정도의 프로젝트가 있습니다.
  2. 우리가 릴리스 할 때 maven 릴리스 플러그인이 사용됩니다. 그 워크 플로는 플러그인 설명서에서 다룹니다. maven release plugin 종류는 짜증나고 (그리고 친절합니다) 작동합니다. 어느 날 우리는이 방법을보다 최적의 것으로 대체 할 계획입니다.
  3. 프로젝트 중 하나가 jenkins를 릴리스 한 다음 특별한 작업을 실행하면 모든 버전 업데이트 작업을 호출합니다 (javen jenkins 릴리스 플러그인도 꽤 엉성하기 때문에 jenkins가 릴리스를 복잡한 방식으로 알고있는 방법).
  4. 모든 버전 업데이트 작업은 20 개의 모든 프로젝트에 대해 알고 있습니다. 실제로 모듈 섹션의 모든 프로젝트를 종속성 순서로 특정하는 것은 집 계기입니다. Jenkins는 매직 groovy / bash foo를 실행하여 모든 프로젝트를 최신 버전으로 업데이트 한 다음 폼을 체크인합니다 (모듈 섹션에 따라 종속성 순서로 다시 수행).
  5. 각 프로젝트에 대해 pom이 변경되면 (일부 종속성의 버전 변경으로 인해) pom이 체크인 된 다음 즉시 해당 프로젝트에 대해 해당 작업을 실행하기 위해 jenkins를 핑 (ping)합니다 (그렇지 않으면 빌드 종속성 순서를 유지하는 것입니다) SCM 설문 스케줄러의

이 시점에서 릴리스 및 자동 버전을 일반 빌드와 별도의 도구로 만드는 것이 좋습니다.

이제 위에 나열된 문제로 인해 maven 종류의 짜증을 느낄 수 있지만 확장 가능한 구문 (일명 XML) 을 구문 분석하기 쉬운 선언 도구가없는 빌드 도구로는 실제로 상당히 어려울 것 입니다.

실제로 우리는 네임 스페이스를 통해 사용자 정의 XML 속성을 추가하여 bash / groovy 스크립트를 암시합니다 (예 :이 버전을 업데이트하지 마십시오).


답변

종속성 구문은 Dependency Version Requirement Specification 문서에 있습니다. 완전성을위한 것입니다 :

종속성 version요소는 효과적인 종속성 버전을 계산하는 데 사용되는 버전 요구 사항을 정의합니다. 버전 요구 사항은 다음과 같은 구문을 갖습니다.

  • 1.0: 1.0의 “소프트”요구 사항 (종속성에 대한 다른 모든 범위와 일치하는 경우 권장 사항 임)
  • [1.0]: 1.0의 “하드”요구 사항
  • (,1.0]: x <= 1.0
  • [1.2,1.3]: 1.2 <= x <= 1.3
  • [1.0,2.0): 1.0 <= x <2.0
  • [1.5,): x> = 1.5
  • (,1.0],[1.2,): x <= 1.0 또는 x> = 1.2; 여러 세트는 쉼표로 구분됩니다
  • (,1.1),(1.1,): 1.1 제외 (예 :이 라이브러리와 함께 작동하지 않는 것으로 알려진 경우)

귀하의 경우에는 다음과 같은 일을 할 수 있습니다 <version>[1.2.3,)</version>


답변

개발하는 동안 분명히 많이 바뀌는 개발 버전에 의존하고 있습니까?

개발 릴리스 버전을 늘리는 대신 필요할 때 덮어 쓰는 스냅 샷 버전 만 사용할 수 있습니다. 즉, 사소한 변경마다 버전 태그를 변경할 필요가 없습니다. 1.0-SNAPSHOT과 같은 것 …

그러나 아마도 당신은 다른 것을 달성하려고 노력하고 있습니다.)


답변

LATEST를 사용하는 사람은 -U가 있는지 확인하십시오. 그렇지 않으면 최신 스냅 샷을 가져 오지 않습니다.

mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories