Maven이 아티팩트를 검색하기 위해 원격 저장소로 이동하는 대신 로컬 저장소를 사용하도록 강제하는 방법은 무엇입니까?


101

Mac Yosemite에서 Java 8과 함께 Maven 3.3.3을 사용하고 있습니다. 다중 모듈 프로젝트가 있습니다.

    <modules>
            <module>first-module</module>
            <module>my-module</module></modules>

"mvn clean install"을 사용하여 위의 "my-module"과 같은 자식 모듈 중 하나를 빌드 할 때 빌드는 ~ / .m2에 정의한 원격 저장소에서 자식 모듈 아티팩트를 다운로드하려고합니다. /settings.xml 파일. 출력은 다음과 같습니다.

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom

원격 저장소에서 다운로드를 시도하기 전에 Maven이 내 로컬 ~ / .m2 / repository를 먼저 확인하도록 강제하는 방법은 무엇입니까? 아래는 ~ / .m2 / settings.xml 파일에 정의 된 원격 저장소가있는 곳입니다.

<profile>
    <id>releases</id>
    <activation>
        <property>
            <name>!releases.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>releases</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
<profile>
    <id>snapshots</id>
    <activation>
        <property>
            <name>!snapshots.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

편집 : 아티팩트가 없을 때 다운로드가 발생한다는 답변에 대한 응답으로 아래는 파일이 내 저장소에 있음을 증명했지만 Maven이 어쨌든 다운로드를 시도하는 터미널 출력입니다 ...

Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar 
-rw-r--r--  1 davea  staff  10171 Nov  5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-   module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml

2
Maven 원격 저장소에서 아티팩트를 다운로드하기 전에 로컬 저장소를 확인합니다. 이 빌드를 시도하기 전에 지역에 이러한 유물이 있었습니까? 지금 로컬 저장소를 검사하고 어쨌든 다른 빌드를 다시 시도 할 수 있습니다. 또한 로컬 저장소가있는 위치를 지정할 수 있습니다 settings.xml( 여기 참조 ).
mystarrocks 2015

내 settings.xml 파일에 내 저장소를 지정하지 않았지만 Maven이 나를 위해 설정 한 기본값 인 ~ / .m2 / repository입니다. 기본값 인 경우에도 지정해야합니까?
Dave

나를 위해 * .sha1 또는 * .lastUpdate와 같은 다른 파일이 내 로컬 저장소에 있습니다. * .jar 및 * .pom을 제외한 다른 파일을 삭제하면 maven이 원격 저장소에서 파일을 다시 다운로드하지 못합니다
Harun

답변:


46

종속성에 스냅 샷 버전이 있습니다. 스냅 샷의 경우 Maven은 로컬 저장소를 확인하고 로컬 저장소에서 발견 된 아티팩트가 너무 오래된 경우 원격 저장소에서 업데이트 된 항목을 찾으려고 시도합니다. 그것은 아마도 당신이보고있는 것입니다.

이 동작은 updatePolicy저장소 구성 의 지시문 ( daily기본적으로 스냅 샷 저장소의 경우)에 의해 제어됩니다 .


16
콘솔 명령 인수로 이것을 "덮어 쓰기"할 수 있습니까? 좋아요 : mvn clean install -FORCE_COMMAND
Naxos84

21
"너무 늙었다"는 의미는 무엇입니까? 로컬이든 원격이든 찾을 수있는 최신 스냅 샷을 선택합니까? 그것은 확실히 끔찍한 행동이 될 것입니다. 스냅 샷을 방금 구축했다면 CI 구축이 잠시 후에 구축 한 스냅 샷이 아닌 스냅 샷을 사용하고 싶습니다.
Tom Quarendon

"너무 오래됨"이 무엇을 의미하는지 자세히 설명해주세요.
Đỗ Công Bằng

34

사용 mvn --help하면 옵션 목록을 볼 수 있습니다.

다음과 같은 옵션이 있습니다. -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

따라서 명령 mvn install -nsu을 사용하면 로컬 저장소로 강제 컴파일 할 수 있습니다.


10
-o"오프라인"maven 동작에 사용할 수도 있습니다
Sean

8
-nsu 옵션은 아티팩트가 로컬로 빌드되고 설치 될 때와 같이 로컬 빌드를 사용하는 대신 아직 다운로드되지 않은 경우 mvn이 아티팩트를 원격으로 다운로드하려고 시도하고 실패하는 것을 방지하지 않습니다. –
user1767316

아티팩트가 아직 다운로드되지 않은 것과 동일한 문제가 발생하여이 문제가 해결되었습니다. maven.apache.org/general.html#importing-jars
Luigi Cristalli

16

maven이 로컬 repo 사용 하도록 강제 하려면 . 는 당신이 "오프라인"작업 할 수 있도록하고, 네트워크를 계속 꺼져 받는다는 알려줍니다.mvn <goals> -o-o


5
-o 옵션은 아티팩트가 로컬로 빌드되고 설치되었을 때와 같이 로컬 빌드를 사용하는 대신 아직 다운로드되지 않은 경우 mvn이 아티팩트를 원격으로 다운로드하려고 시도하고 실패하는 것을 방지하지 않습니다.
user1767316

2
사실입니다. 로컬 사본이 없으면 운이 좋지 않습니다. 이는 이전에 빌드 한 프로젝트에 유용하지만 관심이없는 최근 SNAPSHOT 변경 사항이있을 수 있습니다.
Sean

또는 프로젝트를 구축 한 적이 없더라도 오프라인 구축을 준비 할 수 있습니다mvn dependency:go-offline
Aldian

방금 설치 한 로컬 복사본이있는 경우 (따라서 원격 스냅 샷 저장소에서 배포 / 사용할 수 없음)?
Vivek Chavda

1
아, 방금 종속성 모음이있는 pom 프로젝트를 만들었지 만 소비 프로젝트에서 <type> pom </ type>을 지정하지 않았으므로 항아리를 찾고있었습니다 (물론 찾을 수 없었습니다. 오프라인 모드)
Vivek Chavda

4

제 경우에는 당신과 같은 다중 모듈 프로젝트가있었습니다. 내 프로젝트가 의존하고있는 외부 라이브러리 중 하나의 그룹 ID를 아래와 같이 변경해야했습니다.

에서:

<dependencyManagement>
    <dependency>
        <groupId>org.thirdparty</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

에:

<dependencyManagement>
   <dependency>
      <groupId>org.thirdparty.module</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

<groupId> 섹션에주의하십시오. pom 파일 에서이 종속성을 정의하는 하위 모듈의 해당 섹션을 수정하는 것을 잊었습니다.

모듈을 로컬에서 사용할 수 있었기 때문에 그것은 나를 매우 미치게 만들었습니다.


4

아래 단계를 따르십시오.

    1. 보관하려는 jar를 제외하고 로컬에있는 jar 폴더의 모든 내용을 삭제해야합니다.
      예를 들어 .repositories, .pom, .sha1, .lastUpdated 등과 같은 파일.
    1. mvn clean install -o명령 실행

이렇게하면 저장소에 연결하는 대신 로컬 저장소 jar 파일을 사용하는 데 도움이됩니다.


1
만 제거 *.repositories하고 *.sha1파일 나를 위해 일한
DLight

2

아티팩트가 아직 개발 중이고 아직 업로드되지 않았기 때문에 -o 옵션이 작동하지 않았으며 maven (3.5.x)은 오류에 따라 처음이기 때문에 여전히 원격 저장소에서 다운로드를 시도합니다.

그러나 이것은 나를 위해 수정했습니다 : https://maven.apache.org/general.html#importing-jars

이 수동 설치 후에는 오프라인 옵션도 사용할 필요가 없습니다.

최신 정보

방금 종속성을 다시 작성했고 다시 가져와야했습니다. 일반 파일 mvn clean install이 충분하지 않았습니다.


2

위의 모든 답변을 고려하더라도 오류로 인해 maven 오프라인 빌드를 종료하는 문제가 발생할 수 있습니다. 특히 다음과 같은 경고가 발생할 수 있습니다.

[WARNING] The POM for org.apache.maven.plugins:maven-resources-plugin:jar:2.6 is missing, no dependency information available

경고는 즉시 추가 오류가 발생하고 maven이 종료됩니다.

위의 힌트에 따라 생성 된 maven 오프라인 캐시로 오프라인을 구축하는 가장 안전한 방법은 다음 maven 오프라인 매개 변수를 사용하는 것입니다.

mvn -o -llr -Dmaven.repo.local=<path_to_your_offline_cache> ...

특히 -llr 옵션 은 답변 # 4에서 제안한대로 로컬 캐시를 조정할 필요가 없도록합니다.

또한 settings.xml의 localRepository 매개 변수가 다음과 같이 설정되어 있는지 확인하십시오.

<localRepository>${user.home}/.m2/repository</localRepository>

0

나는 똑같은 문제가 있었다. 해결하는 mvn clean install대신 실행 중 mvn clean compile입니다. 프로젝트 종속성은 install을 사용하여 로컬 저장소에 업로드되기 때문에 multi-maven-project를 사용할 때만 차이가 발생합니다.


-1

Maven은 항상 로컬 리포지토리를 먼저 확인하지만 Maven이이를 찾으려면 리포지토리에 종속성을 설치해야합니다.

mvn install먼저 종속성 모듈에서 실행 한 다음 종속 모듈을 빌드하십시오.


1
아티팩트가 저장소에 있음을 보여주기 위해 내 질문을 편집했습니다 (내가 실행하는 "ls -al"명령에 유의하십시오. 그러나 Maven은 어쨌든 다운로드를 시도하고 있습니다. 다른 아이디어가 있습니까?
Dave

6
@Oliver : 로컬 저장소의 아티팩트에 대해 아티팩트가 너무 오래된 스냅 샷 인 경우 Maven이 여전히 원격 저장소를 참조 할 수 있다는 사실이 누락되었습니다.
Andreas Veithen 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.