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




download (11)

이븐에서 넥서스를 사용하여 메이븐 3.5.4에서 내 솔루션 :

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

eclipse에서 : atl + F5 를 선택하고 force update of snapshots/releaseforce update of snapshots/release 선택하십시오.

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

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

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

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


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

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

이 페이지를 보시기 바랍니다 ( "의존성 버전 범위"섹션). 네가하고 싶은게 뭔가있어.

<version>[1.2.3,)</version>

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


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

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

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


진실은 3.x 에서조차도 여전히 효과가 있으며 놀랍게도 프로젝트가 구축되고 배포됩니다. 그러나 LATEST / RELEASE 키워드는 m2e와 eclipse에서 문제를 일으키며, 프로젝트는 LATEST / RELEASE를 통해 배포 된 종속성에 따라 버전을 인식하지 못합니다.

또한 버전을 속성으로 정의하려고 시도하고 다른 곳에서 참조하려는 경우 문제가 발생할 수 있습니다.

따라서 결론은 가능한 경우 maven-versions-plugin 하는 것입니다.


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

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


누가 가장 최신 버전을 사용했는지 확인하십시오. 그렇지 않으면 최신 스냅 샷을 가져올 수 없습니다.

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

종속성 구문은 종속성 버전 요구 사항 설명서에 있습니다. 여기 그것이 완전을위한 것입니다 :

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

  • 1.0 : 1.0 "Soft"요구 사항 (종속성에 대한 다른 모든 범위와 일치하는 경우 권장 사항)
  • [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>


노트:

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

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

플러그인이나 의존성에 의존 할 때 버전 값으로 LATEST 또는 RELEASE를 사용할 수 있습니다. 최신은 특정 아티팩트의 최신 릴리스 또는 스 냄샷 버전, 특정 저장소의 가장 최근에 전개 된 아티팩트를 나타냄니다. RELEASE는 저장소의 마지막 비 스냅 샷 릴리스를 나타냅니다. 일반적으로 이슈의 비 특정 버전에 의존하는 소프트웨어를 설계하는 것은 최선의 방법이 아닙니다. 소프트웨어를 개발하는 경우 타사 라이브러리의 새 릴리스가 출시 될 때 버전 번호를 업데이트 할 필요가 없도록 RELEASE 또는 LATEST를 편리하게 사용할 수 있습니다. 소프트웨어를 릴리스 할 때 빌드 나 프로젝트가 사용자의 통제하에 있지 않은 소프트웨어 릴리스의 영향을받는 것을 줄이려면 프로젝트가 특정 버전에 의존하는지 항상 확인해야합니다. LATEST와 RELEASE는 신중하게 사용하십시오.

자세한 내용은 Maven 서적POM 구문 섹션 을 참조하십시오. 또는 Dependency Version Ranges 에있는이 문서를 참조하십시오.

  • 대괄호 ( [ ] )는 "닫힌"의미입니다 (포함).
  • 괄호 ( ( ) )는 "열기"(배타적)를 의미합니다.

다음은 다양한 옵션을 보여주는 예입니다. 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 메타 데이터의 "최신"항목을 업데이트하지만 "릴리스"항목을 업데이트하려면 Maven 슈퍼 POM 에서 "릴리스 프로필"을 활성화해야합니다. "-Prelease-profile"또는 "-DperformRelease = true"를 사용하여이 작업을 수행 할 수 있습니다.

Maven이 종속성 버전 (LATEST, RELEASE 및 버전 범위)을 선택할 수있는 방법을 사용하면 이후 버전이 다른 동작을 할 수 있으므로 (예 : 종속성 플러그인이 이전에 기본 true에서 false 로의 혼란스러운 결과).

따라서 일반적으로 릴리스에서 정확한 버전을 정의하는 것이 좋습니다. 팀의 답변에서 지적한 것처럼, maven-versions-plugin 은 의존성 버전, 특히 versions:use-latest-versionsversions:use-latest-releases 목표를 업데이트하기위한 편리한 도구입니다.


다른 사람들과 달리 항상 최신 버전을 원할 이유가 많이 있다고 생각합니다. 특히 지속적인 배포 (하루에 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 스크립트의 힌트를 얻을 수 있습니다 (예 :이 버전을 업데이트하지 마십시오).


나는 그것을 해결했다. 나는 달렸다 :

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386

오류는 오해의 소지가 있습니다. Unsupported major.minor version 51.0 . 이는 버전 51 (Java 7)이 지원되지 않는다는 인상을줍니다. Java 6을 사용해야합니다.

오류는 다음과 같아야합니다.

현재 Java 버전 인 50은 지원되지 않습니다. Java 버전 7 (51 : 0 이상)을 대신 사용하십시오 .`





java maven dependencies maven-2 maven-metadata