[java] Maven에게 의존성의 최신 버전을 사용하도록 어떻게 말합니까?


4 Answers

이제 나는이 주제가 오래되었다는 것을 알고 있지만, 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"의 절반을 형성합니다.

그냥 내가 미래의 참조를 위해 그것을 포함시킬 줄 알았다.

Question

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

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

이제 자주 릴리스가있는 라이브러리로 작업하는 경우 <version> 태그를 지속적으로 업데이트하는 것이 다소 짜증이 날 수 있습니다. Maven이 저장소에서 항상 최신 버전을 사용하도록 지시 할 수있는 방법이 있습니까?




아마도 개발 중에 분명히 많이 변하는 개발 버전에 의존하고 있습니까?

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

그러나 어쩌면 당신은 다른 것을 성취하려고 노력하고 있습니다.)




때로는 지속적인 배포가 있고 버전 개발이 많은 경우 (주로 무거운 개발 중에) 종속성 문제를 "느리게"처리하기 때문에 버전 범위를 사용하지 않는 경우가 있습니다.

한 가지 해결 방법은 maven-versions-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



다른 사람들과 달리 항상 최신 버전을 원할 이유가 많이 있다고 생각합니다. 특히 지속적인 배포 (하루에 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 release를 릴리즈 할 때 플러그인이 사용됩니다. 그 워크 플로는 플러그인의 문서에서 다룹니다. maven release plugin 일종의 sucks (그리고 저는 친절합니다)하지만 작동합니다. 언젠가는이 방법을 좀 더 최적의 것으로 대체 할 계획입니다.
  3. 프로젝트 중 하나가 릴리스 된 젠킨스를 가져 오면 특수한 작업을 실행하여 모든 버전의 작업을 업데이트합니다 (젠킨스는 릴리즈가 복잡한 방식이기 때문에 일부는 복잡한 방법이기 때문에 메이븐 젠킨스 플러그인은 꽤 엉터리입니다).
  4. 모든 버전 업데이트 작업은 20 개의 모든 프로젝트에 대해 알고 있습니다. 실제로는 모듈 섹션의 모든 프로젝트와 관련하여 종속성 순서로 특정되는 집계 자입니다. 젠킨스 (Jenkins)는 모든 프로젝트를 최신 버전으로 업데이트 한 다음 폼을 체크인합니다 (다시 모듈 섹션을 기반으로 한 의존성 순서로 완료)하는 매직 Groovy / bash foo를 실행합니다.
  5. 각 프로젝트에 대해 (일부 종속성의 버전 변경으로 인해) pom이 변경된 경우 체크인되고 그 프로젝트에 대한 해당 작업을 실행하기 위해 jenkins에 즉시 핑합니다 (이것은 빌드 종속성 순서를 보존하는 것입니다. 그렇지 않으면 자비심에 있습니다 SCM Poll 스케줄러).

이 시점에서 필자는 어쨌든 일반 빌드와는 별도로 릴리스 및 자동 버전을 별도로 구할 수있는 좋은 방법이라고 생각합니다.

이제 위에서 언급 한 문제로 인해 Maven이 멍청하다고 생각할 수도 있지만 확장 가능한 구문 (XML이라고도 함)을 쉽게 구문 분석 할 수있는 선언 도구가없는 빌드 도구로는 실제로 상당히 어려울 것입니다.

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




이 질문이 제기 될 무렵에는 버전 범위가 몇 가지 변덕 스러움이 있었지만 이것들은 새로운 버전의 maven에서 해결되었습니다. 이 기사에서는 버전 범위의 작동 방식과 베스트 프랙티스를 잘 이해하여 버전을 이해하는 방법을 더 잘 이해합니다. https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855




Related