어떻게 메이븐에게 최신 버전의 종속성을 사용하도록 말할 수 있습니까?
Maven에서는 의존관계는 보통 다음과 같이 설정됩니다.
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
릴리스가 빈번한 라이브러리를 사용하고 있는 경우,<버전>태그를 항상 갱신하는 것은 다소 귀찮을 수 있습니다.Maven에게 (저장소에서) 항상 사용 가능한 최신 버전을 사용하도록 지시할 수 있는 방법이 있습니까?
주의:
Maven 3의 플러그인 의존성에 대해 언급된 버전과 메타 버전은 6년 이상 전에 "재현 가능한 빌드를 위해. (일반적인 의존관계에서는 여전히 완벽하게 기능합니다.) 플러그인의 의존성에 대해서는, 이 Maven 3 준거 솔루션을 참조해 주세요.
항상 최신 버전을 사용하는 경우 Maven에는 버전 범위 대신 사용할 수 있는 두 가지 키워드가 있습니다.사용 중인 플러그인/의존성을 더 이상 제어할 수 없으므로 이러한 옵션을 신중하게 사용해야 합니다.
플러그인 또는 종속성에 의존하는 경우 버전 값인 LATTES 또는 RELEASE를 사용할 수 있습니다. LATTES는 특정 저장소에서 가장 최근에 배포된 아티팩트의 최신 릴리스 또는 스냅샷 버전을 나타냅니다.RELEASE는 저장소 내의 마지막 비스냅샷릴리즈입니다일반적으로 아티팩트의 특정 버전이 아닌 소프트웨어를 설계하는 것은 권장되지 않습니다.소프트웨어를 개발하는 경우 서드파티 라이브러리의 새 릴리스가 출시될 때 버전 번호를 업데이트할 필요가 없도록 RELEASE 또는 LATT를 사용할 수 있습니다.소프트웨어를 릴리스할 때는 반드시 특정 버전에 의존하여 빌드 또는 프로젝트가 사용자가 관리하지 않는 소프트웨어 릴리스의 영향을 받을 가능성을 줄여야 합니다.LATE 및 RELEASE를 사용할 경우 주의하여 사용하십시오.
상세한 것에 대하여는, 「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 슈퍼 POM에서 "release-profile"을 활성화해야 합니다."Prelease-profile" 또는 "-DperformRelease=true"를 사용하여 이 작업을 수행할 수 있습니다.
Maven이 종속 버전(LATest, RELEASE 및 버전 범위)을 선택할 수 있는 접근방식은 나중에 다른 동작을 할 수 있기 때문에 빌드 시간 문제에 개방적일 수 있습니다(예: 종속성 플러그인은 이전에 true에서 false로 기본값을 전환하여 결과를 혼란스럽게 합니다).
따라서 일반적으로 릴리스에서 정확한 버전을 정의하는 것이 좋습니다.Tim의 답변에서 알 수 있듯이 maven-versions-plugin은 종속성 버전, 특히 버전:use-latest-releases 목표를 업데이트하기 위한 편리한 도구입니다.
이 토픽이 오래된 것은 알지만, 질문과 OP가 제공한 답변을 읽어보면 Maven Versions Plugin이 실제로 그의 질문에 대한 더 나은 답변일 수 있습니다.
특히 다음과 같은 목표가 유용할 수 있다.
- versions:use-displaces-displaces는 새로운 버전의 모든 POM을 검색하여 최신 버전으로 바꿉니다.
- versions:use-latest-releases는 새로운 릴리스가 된 모든 비SNAPSHOT 버전을 검색하여 최신 릴리스 버전으로 대체합니다.
- versions:update-properties는 특정 종속성의 사용 가능한 최신 버전에 대응하도록 프로젝트에서 정의된 속성을 업데이트합니다.이것은 종속성 세트를 모두 하나의 버전으로 잠글 필요가 있는 경우에 유용합니다.
다음과 같은 다른 목표도 제공됩니다.
- versions:display-dependency-display는 프로젝트의 종속성을 스캔하여 사용할 수 있는 최신 버전이 있는 종속성에 대한 보고서를 생성합니다.
- versions:display-display-display-display-display는 프로젝트의 플러그인을 스캔하여 최신 버전을 사용할 수 있는 플러그인의 보고서를 생성합니다.
- 버전:update-parent는 사용 가능한 최신 버전을 참조하도록 프로젝트의 상위 섹션을 업데이트합니다.예를 들어 기업 루트 POM을 사용하는 경우 이 목표는 기업 루트 POM의 최신 버전을 사용해야 하는 경우에 도움이 됩니다.
- versions:update-child-module은 프로젝트의 하위 모듈의 상위 섹션을 업데이트하여 버전이 현재 프로젝트의 버전과 일치하도록 합니다.예를 들어 집약하는 프로젝트의 부모이기도 한 애그리게이터 POM이 있고 자녀 버전과 부모 버전이 동기화되지 않은 경우 이 mojo는 자녀 모듈의 버전을 수정하는 데 도움이 됩니다.(프로젝트가 버전 불일치로 인해 빌드할 수 없을 정도로 망가진 경우 이 목표를 실행하기 위해 -N 옵션을 사용하여 Maven을 호출해야 할 수도 있습니다).
- 버전: 잠금 스냅숏은 모든 버전의 POM을 검색하여 해당 버전의 현재 타임스탬프 버전으로 바꿉니다(예: -20090327.172306-4).
- 버전: unlock-snapshots는 pom에서 타임스탬프 잠긴 모든 스냅샷버전을 검색하여 -SNAPshot으로 바꿉니다.
- versions: versions-versions는 버전 범위를 사용하여 의존관계를 검색하여 사용 중인 특정 버전까지의 범위를 해결합니다.
- versions:use-releases는 출시된 모든 -SNAPSHOT 버전을 검색하여 대응하는 릴리스 버전으로 대체합니다.
- versions:use-next-releases - pom에서 새로운 릴리스가 된 모든 비SNAPSHOT 버전을 검색하여 다음 릴리스 버전으로 대체합니다.
- versions:use-next-module은 새로운 버전의 모든 POM을 검색하여 다음 버전으로 바꿉니다.
- versions:commit을 지정하면 pom.xml.versionsBackup 파일이 삭제됩니다.빌트인 "가난한 남자의 SCM"의 절반을 구성합니다.
- versions:revert는 pom.xml.versionsBackup 파일에서 pom.xml 파일을 복원합니다.빌트인 "가난한 남자의 SCM"의 절반을 구성합니다.
나중에 참고할 수 있도록 넣으려고요
이 페이지를 봐 주세요("Dependency Version Ranges" 섹션).여러분이 하고 싶은 일은 다음과 같습니다.
<version>[1.2.3,)</version>
이러한 버전 범위는 Maven2에서 구현됩니다.
당신이 항상 최신 버전을 원하는 이유는 여러 가지가 있다고 생각합니다.특히 지속적인 도입(하루 5개 정도의 릴리즈가 있을 수 있음)을 하고 멀티 모듈프로젝트를 하고 싶지 않은 경우에는 더욱 그렇습니다.
제가 하는 일은 허드슨/젠킨스가 모든 빌드에 대해 다음 작업을 수행하도록 하는 것입니다.
mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true
즉, 버전 플러그인과 scm 플러그인을 사용하여 종속성을 업데이트한 후 소스 제어에 체크인합니다.네, SCM 체크인을 CI에 맡깁니다(메이븐 릴리스 플러그인에 대해서는 이 작업을 수행해야 합니다).
원하는 버전만 업데이트하도록 버전 플러그인을 설정할 수 있습니다.
<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 versions 플러그인이 버그가 있어 일반적으로 결함이 있는 것이 큰 이유입니다.
버전 플러그인을 실행하여 버전을 조정하려면 기존 버전이 모두 존재해야 하므로 POM이 제대로 실행되기 때문에 결함이 있습니다.POM에서 참조된 버전을 찾을 수 없는 경우 플러그인은 최신 버전으로 업데이트할 수 없습니다.디스크 공간을 이유로 이전 버전을 정리하는 경우가 많기 때문에 이 작업은 실제로 상당히 성가신 일입니다.
버전을 조정하려면 maven과는 다른 툴이 필요합니다(따라서 올바르게 동작하기 위해 pom 파일에 의존하지 않습니다).나는 그런 도구를 Bash라는 비천한 언어로 썼다.스크립트는 버전 플러그인과 같은 버전을 업데이트하고 POM을 소스 제어로 다시 체크인합니다.또한 mvn 버전 플러그인보다 100배 더 빠르게 실행됩니다.불행히도 그것은 공공용으로 쓰여져 있지 않지만, 만약 사람들이 관심을 보인다면 나는 그것을 만들어서 요점이나 기투브에 넣을 수 있다.
다음과 같은 코멘트가 있는 워크플로우로 돌아갑니다.
- 20개 정도의 프로젝트가 저장소에 있고 젠킨스 직업도 있고
- 출시 시 maven release 플러그인이 사용됩니다.이에 대한 워크플로우는 플러그인의 설명서에서 다룹니다.maven 릴리즈 플러그인은 좀 구리다(그리고 친절하게 하고 있다) 하지만 작동한다.언젠가는 이 방법을 보다 최적의 방법으로 대체할 예정입니다.
- 프로젝트 중 하나가 jenkins를 출시하고 나서 특별한 작업을 실행할 때 우리는 update all versions 작업을 호출합니다(meven jenkins 릴리스 플러그인도 매우 엉망이기 때문에 jenkins가 릴리스에 대해 아는 것은 부분적으로 복잡한 방법입니다).
- Update all versions 작업은 20개의 모든 프로젝트에 대해 알고 있습니다.실제로는 모듈 섹션의 모든 프로젝트에 종속성 순서로 특정하기 위한 애그리게이터 폼입니다.Jenkins는 모든 프로젝트를 최신 버전으로 업데이트하고 poms를 체크인하는 마법의 groovy/bash foo를 실행합니다(모듈 섹션에 따라 종속 순서로 다시 실행).
- 각 프로젝트에 대해 (일부 의존관계에 있는 버전 변경으로 인해) 폼이 변경된 경우 폼이 체크인되고 즉시 jenkins에 ping하여 해당 프로젝트에 대응하는 작업을 수행합니다(이는 빌드 의존성 순서를 유지하기 위한 것이며 그렇지 않은 경우 SCM Poll 스케줄러의 권한에 맡겨집니다).
현시점에서는 릴리스와 자동 버전을 일반적인 빌드와는 다른 툴로 하는 것이 좋다고 생각합니다.
위에 열거된 문제 때문에 maven이 다소 형편없다고 생각할 수도 있지만, 확장 가능한 구문(XML)을 해석하기 쉬운 선언적 기능이 없는 빌드 도구에서는 실제로 이 작업이 상당히 어렵습니다.
실제로 네임스페이스를 통해 커스텀 XML 속성을 추가하여 bash/groovy 스크립트를 힌트합니다(예: 이 버전을 업데이트하지 마십시오).
종속성 구문은 종속성 버전 요구 사항 설명서에 있습니다.다음은 완전성을 위한 설명입니다.
존존 depend depend'
version
효과적인 종속성 버전을 계산하는 데 사용되는 버전 요구 사항을 정의합니다.버전 요건의 구문은 다음과 같습니다.
1.0
1. 1.0' '소프트'[1.0]
1.의 ': 1.0의 '하드' 요건(,1.0]
<= 1. x <= 1.0[1.2,1.3]
1.2 =x <= 3: 1.2 <= x <= 1.3[1.0,2.0)
1 <.0 : 1.0 <= x 2.0[1.5,)
> .5 : x > = 1.5(,1.0],[1.2,)
<1.0 x > 1.로 구분됩니다.x < = 1.0 는 xx > = 1.2 。 여러 세트는 쉼표로 구분됩니다.(,1.1),(1.1,)
1를 들어이 라이브러리와 하지 않는 ). 1.1은 제외됩니다.
같은 경우에는 될 것 같아요, 하다, 하다, 하다, 이런 식으로.<version>[1.2.3,)</version>
개발 중에 확실히 많이 바뀌는 개발 버전에 의존하고 있습니까?
개발 릴리스의 버전을 늘리는 대신 필요에 따라 덮어쓰는 스냅샷 버전을 사용하면 됩니다. 따라서 사소한 변경 때마다 버전 태그를 변경할 필요가 없습니다.1.0-SNAPSHOT...
하지만 당신은 다른 무언가를 성취하려고 하고 있을지도 모릅니다;)
LATT 를 사용하고 있는 유저는, U 를 사용하고 있는 것을 확인해 주세요.그렇지 않으면, 최신의 스냅샷이 취득되지 않습니다.
mvn -U dependency:copy -Dartifact=com.foo:my-foo:LATEST
// pull the latest snapshot for my-foo from all repositories
사실은 3.x에서도 여전히 작동하며, 놀랍게도 프로젝트는 구축되고 도입됩니다.그러나 LATTES/RELEASE 키워드로 인해 m2e에 문제가 발생하여 곳곳에서 이클립스가 발생합니다.또한 프로젝트는 LATTES/RELEASE를 통해 전개된 버전이 인식되지 않는 의존성에 따라 달라집니다.
버전을 속성으로 정의하고 다른 곳에서 참조하려고 해도 문제가 발생합니다.
결론은 가능하면 버전 맵 플러그인을 사용하는 것입니다.
이 질문이 제기되었을 때 버전 범위에 문제가 있었지만 새로운 버전의 maven에서 해결되었습니다.이 기사에서는 버전 범위의 구조와 버전을 이해하기 위한 베스트 프랙티스를 잘 소개합니다.https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
버전 범위를 사용하고 싶지 않은 경우가 있습니다.이는 의존관계를 해소하는 데 시간이 걸리는 것 같기 때문입니다.특히 지속적인 배포가 이루어지고 버전이 대량으로 존재하는 경우(주로 개발 중).
회피책 중 하나는 버전 맵플러그인을 사용하는 것입니다.예를 들어 다음과 같이 속성을 선언할 수 있습니다.
<properties>
<myname.version>1.1.1</myname.version>
</properties>
버전 maven-filer를 폼 파일에 추가합니다.
<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
Maven이 최신 버전의 종속성을 사용하도록 하려면 Versions Maven Plugin을 사용할 수 있습니다.또, 이 플러그인의 사용 방법에 대해서는, Tim이 이미 좋은 대답을 했습니다.그의 답변을 따르세요.
하지만 개발자로서, 나는 이런 종류의 실습을 추천하지 않을 것이다. 왜?
질문의 코멘트에서 파스칼 티벤트에 의해 왜 이미 주어졌는지에 대한 대답
빌드 재현성을 위해 이 프랙티스(버전 범위 사용도 권장하지 않습니다.알 수 없는 이유로 빌드가 갑자기 실패하는 것은 수동으로 버전 번호를 업데이트하는 것보다 훨씬 더 귀찮습니다.
다음과 같은 방법을 권장합니다.
<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의 솔루션에서는 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
'programing' 카테고리의 다른 글
API에서 데이터를 가져온 후 VueJ가 DOM을 업데이트하지 않습니까? (0) | 2022.08.08 |
---|---|
VueJS 컴포넌트 (0) | 2022.08.08 |
Vuex: 저장 상태를 빈 어레이로 지우는 중 (0) | 2022.08.08 |
vue 컨텍스트에서 getElementsByClassName (0) | 2022.08.08 |
Laravel Nova Tool에 Vuex를 추가하는 방법 (0) | 2022.08.08 |