ProgramingTip

Maven에게 최신 버전의 사용 지시를 사용합니까?

bestdevel 2020. 9. 29. 08:13
반응형

Maven에게 최신 버전의 사용 지시를 사용합니까?


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

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

이제 자주 릴리스되는 라이브러리로 작업하는 경우 <version> 태그를 업데이트하면 다소 업데이트됩니다. Maven에 항상 저장소에서 사용 가능한 최신 버전을 사용하는 지시하는 방법이 있습니까?


노트 :

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


항상 최신 버전을 사용하려는 경우 Maven에는 버전 범위의 대안으로 사용할 수있는 두 개의 키워드가 있습니다. 더 이상 제어 할 수있는 더 이상 제어 할 수 있습니다.

LATEST 또는 RELEASE의 버전 값을 사용할 수 있습니다. 최신은 특정 아티팩트의 최신 릴리스 또는 스냅 샷 버전을 의미하며, 특정 저장소에 가장 최근에 배포 된 아티팩트입니다. 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 메타 데이터의 "latest"항목을 업데이트하지만 "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이 있고 하위 및 상위 버전이 동기화되지 않은 경우이 mojo는 하위 모듈의 버전을 수정하는 데 도움이 될 수 있습니다. (프로젝트가 심하게 손상되어 버전 불일치로 인해 빌드 할 수없는 경우이 목표를 실행하기 위해 -N 옵션으로 Maven을 호출해야 할 수 있습니다.)
  • versions : lock-snapshots 는 pom에서 모든 -SNAPSHOT 버전을 검색하고 해당 -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의 릴리스 버전이 있는지 확인합니다 (중요 함).

내가하는 일을하면 모든 스냅 샷 빌드에 대한 최신 버전과 릴리스 빌드에 대한 최신 릴리스 버전을 얻을 수 있습니다. 빌드도 재현 가능합니다.

최신 정보

이 워크 플로의 세부 사항을 묻는 댓글이 몇 개 있습니다. 나는 우리가 더 이상이 방법을 사용하지 않는다고 말할 것이며, maven 버전 플러그인이 버그가 있고 일반적으로 본질적으로 결함이있는 가장 큰 이유입니다.

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

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

일부 의견에 따라 워크 플로로 돌아가서 이것이 우리가하는 일입니다.

  1. 자체 젠킨스 작업이있는 자체 저장소에 20 개 정도의 프로젝트가 있습니다.
  2. 우리가 릴리스 할 때 maven 릴리스 플러그인이 사용됩니다. 그 작업 흐름은 플러그인 문서에서 다룹니다. maven 릴리스 플러그인은 일종의 짜증나지만 (나는 친절합니다) 작동합니다. 언젠가는이 방법을보다 최적의 방법으로 대체 할 계획입니다.
  3. 프로젝트 중 하나가 릴리스되면 젠킨스가 특별한 작업을 실행하면 모든 버전 업데이트 작업을 호출합니다 (젠킨스가 릴리스를 아는 방법은 부분적으로는 메이븐 젠킨스 릴리스 플러그인도 매우 형편 없기 때문에 복잡한 방식입니다).
  4. 모든 버전 업데이트 작업은 20 개의 프로젝트를 모두 알고 있습니다. 실제로 모듈 섹션의 모든 프로젝트를 종속성 순서로 특정하는 것은 집계 자 pom입니다. Jenkins는 모든 프로젝트를 최신 버전으로 업데이트 한 다음 poms를 체크인하는 매직 groovy / bash foo를 실행합니다 (다시 모듈 섹션에 따라 종속성 순서대로 수행됨).
  5. 각 프로젝트에 대해 pom이 변경된 경우 (일부 종속성의 버전 변경으로 인해) 체크인 된 다음 즉시 젠킨스에 핑하여 해당 프로젝트에 대한 해당 작업을 실행합니다 (이는 빌드 종속성 순서를 유지하기위한 것입니다. SCM 폴 스케줄러).

이 시점에서 나는 어쨌든 릴리스 및 자동 버전을 일반 빌드와 별도의 도구로 사용하는 것이 좋은 것이라고 생각합니다.

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

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


종속성 구문은 종속성 버전 요구 사항 사양 문서에 있습니다. 완전성을위한 것입니다.

종속성 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

이 질문이 제기되었을 때 maven의 버전 범위에 약간의 꼬임이 있었지만 이는 최신 버전의 maven에서 해결되었습니다. 이 기사는 버전 범위가 작동하는 방식과 maven이 버전을 이해하는 방법을 더 잘 이해하기위한 모범 사례를 잘 포착합니다. https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855


사실은 3.x에서도 여전히 작동하며 놀랍게도 프로젝트가 빌드되고 배포됩니다. 그러나 LATEST / RELEASE 키워드는 m2e에서 문제를 일으키고 모든 곳에서 일식을 일으키며, 또한 프로젝트는 LATEST / RELEASE를 통해 배포 된 종속성에 따라 버전을 인식하지 못합니다.

버전을 속성으로 정의하고 다른 곳에서 참조하려는 경우에도 문제가 발생합니다.

따라서 결론은 가능하면 versions-maven-plugin을 사용 하는 것입니다.


때로는 버전 범위를 사용하지 않으려는 경우가 있습니다. 특히 지속적인 배포가 있고 많은 버전이있는 경우-주로 과도한 개발 중에 종속성을 해결하는 것이 "느리게"보이기 때문입니다.

한 가지 해결 방법은 versions-maven-plugin 을 사용하는 것 입니다. 예를 들어 다음과 같이 속성을 선언 할 수 있습니다.

<properties>
    <myname.version>1.1.1</myname.version>
</properties>

pom 파일에 versions-maven-plugin을 추가하십시오.

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <properties>
                    <property>
                        <name>myname.version</name>
                        <dependencies>
                            <dependency>
                                <groupId>group-id</groupId>
                                <artifactId>artifact-id</artifactId>
                                <version>latest</version>
                            </dependency>
                        </dependencies>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

그런 다음 종속성을 업데이트하려면 목표를 실행해야합니다.

mvn versions:update-properties validate

1.1.1보다 최신 버전이 있으면 다음과 같이 알려줍니다.

[INFO] Updated ${myname.version} from 1.1.1 to 1.3.2

당신은 메이븐 종속성의 최신 버전을 사용해야 원하는 경우에, 당신이 사용할 수있는 버전 메이븐 플러그인 방법이 플러그인을 사용하는 방법과, 팀이 이미 좋은 답변을 주신 그의 따라 답을 .

그러나 개발자로서 이러한 유형의 관행을 권장하지 않습니다. 왜?

질문 에 대한 의견에서 Pascal Thivent 가 이미 제공 한 이유 에 대한 답변

빌드 재현성을 위해이 방법을 권장하지 않습니다 (버전 범위 사용도 권장하지 않음). 알 수없는 이유로 갑자기 실패하기 시작하는 빌드는 버전 번호를 수동으로 업데이트하는 것보다 훨씬 더 성가신 일입니다.

이 유형의 연습을 권장합니다.

<properties>
    <spring.version>3.1.2.RELEASE</spring.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

유지 관리 및 디버그가 쉽습니다. 즉시 POM을 업데이트 할 수 있습니다.


maven 3.5.4의 내 솔루션은 Eclipse에서 nexus를 사용합니다.

<dependency>
    <groupId>yilin.sheng</groupId>
    <artifactId>webspherecore</artifactId>
    <version>LATEST</version> 
</dependency>

그런 다음 이클립스에서 : atl + F5, 그리고force update of snapshots/release

그것은 나를 위해 작동합니다.

참고 URL : https://stackoverflow.com/questions/30571/how-do-i-tell-maven-to-use-the-latest-version-of-a-dependency

반응형