Maven은 mvn 종속성을 실행할 때 형제 모듈을 인식하지 못합니다.


90

다중 모듈 Maven 프로젝트를 설정하려고하는데 모듈 간 종속성이 올바르게 설정되지 않은 것 같습니다.

나는 가지고있다:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>

상위 POM (패키징 유형의 pom이 있음)과 하위 디렉터리에 commons/있으며 storage/동일한 이름으로 JAR pom 을 정의합니다.

저장소는 Commons에 따라 다릅니다.

기본 (마스터) 디렉토리에서 다음을 실행 mvn dependency:tree하고 봅니다.

[INFO] Building system
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT

리액터가 의존성 트리를 성공적으로 처리했기 때문에 분명히 보았지만 "커먼즈"에 대한 의존성이 실패하는 이유는 무엇입니까? 그것은 바로 거기에 있기 때문에 그것을 찾기 위해 '넷에 가지 않아야합니다 ...

저장을위한 pom :

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>
  <parent>
    <artifactId>system</artifactId>
    <groupId>domain</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>domain</groupId>
  <artifactId>storage</artifactId>
  <name>storage</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- module dependencies -->
    <dependency>
      <groupId>domain</groupId>
      <artifactId>commons</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- other dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

제안 해 주셔서 감사합니다!

(편집하다)

명확히하기 위해 여기서 찾고있는 것은 다음과 같습니다. 둘 다 동일한 상위 POM에서 참조되는 모듈이기 때문에 X에 의존하는 모듈 Y를 빌드하기 위해 모듈 X를 설치할 필요가 없습니다. 이것은 동일한 소스 트리에 두 가지 항목이있는 경우 빌드를 계속하기 위해 중간 제품을 설치할 필요가 없다는 것을 직관적으로 이해합니다. 제 생각이 여기에서 이해되기를 바랍니다 ...


2
Ahhh, 편집이 완벽합니다. 왜 첫 번째 의도로 이것을 쓰지 않았습니까? 또한 제목을 변경하는 것도 고려해보십시오. :) 까다 롭다는 뜻은 아닙니다. 이것은 명확성과 분류를위한 것입니다. 이는 향후 유사한 문제를 검색 할 때 전체 커뮤니티에 도움이 될 것입니다 (dependency : tree에 관한 실제 제목과 내용으로는 명확하지 않음)
Pascal Thivent

1
안녕하세요. 해결책을 찾았습니까?

1
컴파일이 실패합니까, 아니면 종속성 : 트리 목표 만 있습니까? Don Willis의 답변을 참조하십시오.
metamatt 2011 년

OMG 그래서 한 모듈에서 다른 모듈의 기호를 찾을 수 없어 실패하면 다른 모듈을 종속성으로 추가하고 JAR로 설치해야합니까? 이 .... 열쇠
WesternGun

슬픈 maven 3.6은 아직이 문제를 해결하지 못합니다
yuxh

답변:


21

문제는 종속성을 지정할 때 Maven이 적어도 로컬 리포지토리에서 패키지되고 사용 가능한 jar (또는 기타)로 가질 것으로 예상한다는 것입니다. mvn install커먼즈 프로젝트를 먼저 실행하면 모든 것이 작동 할 것이라고 확신합니다.


4
소스 트리에있는 모듈 버전을 사용하도록 지정하는 방법이 있습니까? 이 사건은 자동으로 처리 될 것이라고 생각했습니다. 나는 전체 프로젝트를 만들고 싶을 때마다 Maven이 빌드-설치-빌드-설치-빌드를 필요로하는 것을 원하지 않는다 / 생각하지 않는다!
Steven Schlansker 2009

38
설치를 실행하면 문제가 해결됩니다. 그러나 이제는 변경할 때마다 설치해야하는데, 이것이 내가 원하는 것이 아닙니다. 저장소 프로젝트가 커먼즈 프로젝트에서 최신 코드를 가져 오길 원합니다.
Steven Schlansker 2009

나는 실제로 비슷한 문제를 다루어야하는데 아쉽게도 지금까지 답을 찾을 수 없습니다. Maven은 종속성이 모듈에 연결되어 있는지 신경 쓰지 않는 것 같습니다. 즉시 repo로 이동합니다. 당신의 질문에 마음에 드는 것을 넣을 것입니다. 그래서 어떤 전문가가 대답 할 것입니다. 이 작업을 수행 할 수 있는지 알아 관심
Bostone

@Steven 우려 사항을 다른 질문으로 게시하십시오. 댓글로 답변하는 것은 편리하지 않으며 이것은 또 다른 주제입니다.
Pascal Thivent

6
그것이 주요 질문이되기위한 것이었고, 저는 단순히 명확히했습니다. 원래 질문에서 동일한 프로젝트에서 다른 모듈을 빌드하기 위해 빌드 된 제품이 로컬 저장소에있을 필요가 없다는 것을 명확히하지 않았습니까?
Steven Schlansker 2009

104

이 maven 메일 링리스트 스레드 에서 논의 된 바와 같이 , dependency : tree 목표는 그 자체로 리액터가 아닌 저장소에서 검색합니다. 이전에 제안한대로 mvn을 설치하거나 리액터를 호출하는 덜 부담스러운 작업을 수행하여이 문제를 해결할 수 있습니다.

mvn compile dependency:tree

나를 위해 작동합니다.


2
저렴한 해결 방법에 감사드립니다. 그러나 그것은 버그입니까? 나는 의존성 : 트리 목표가 어떤 트릭도없이 리액터에 의존 할 것으로 예상한다.
mcoolive

전역 적으로 실행되는 모든 작업에 대해 동일한 상황이 발생하지만 일부 하위 프로젝트에만 영향을 미칩니다.
tkruse

불행히도 compile전이 종속성의 다운로드를 트리거합니다. 실제로 다운로드하지 않고 종속성 트리를 나열하는 방법도 있습니까 (물론 POM 제외)?
sschuberth

다른 목표에도 같은 문제가있었습니다. 추가 compile( validate충분하지 않음)도 거기에 도움이되었습니다 : mvn compile animal-sniffer:check그리고mvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa

빌드에 따라 일부 모듈에는 이후 단계에서 빌드 된 아티팩트에 대한 종속성이있을 수도 있습니다. 제 경우에는 ZIP 파일 (maven-assembly-plugin 사용)이 package단계적 으로 빌드 되었으므로 예를 들어 mvn package animal-sniffer:check.
MSA

6

이것이 오래된 스레드라는 것을 깨닫는 것은 도구가 발전했거나 처음에는 놓친 것 같습니다.

리액터 빌드를 수행하여 설치하지 않고도 종속성을 해결하는 빌드를 수행 할 수 있습니다.

프로젝트의 모듈 구조를 설명하는 부모에서 빌드를 시작하면 내부 Maven 리액터를 통해 빌드 자체에서 모듈 간의 종속성이 해결됩니다.

물론 이것은 구조 내에서 단일 개별 모듈의 빌드를 해결하지 않기 때문에 완벽한 솔루션은 아닙니다. 이 경우 Maven은 리액터에 종속성이 없으며 저장소에서이를 해결하려고합니다. 따라서 개별 빌드의 경우 여전히 종속성을 먼저 설치해야합니다.

다음은 이 상황을 설명하는 몇 가지 참고 자료 입니다.


1
종속성을 먼저 설치하지 않고 완전한 상위 프로젝트를 빌드하지 않고 단일 모듈을 빌드하는 방법이 있습니까?
Has QUIT--Anony-Mousse

1
답변을 완료하려면-플러그인이 단계없이 직접 호출되는 경우 (예 : 단계 mvn dependency:tree를 호출하지 않는 한 소스에서 종속성을 해결하지 않습니다 compile.) 따라서 이것은 대신 작동합니다 mvn compile dependency:tree.
Stanislav Bashkyrtsev

3

나를 위해이 스레드로 이어진 것은 비슷한 문제였으며 해결책은 모든 모듈 종속성 pom이

 <packaging>pom</packaging>

부모는

내 모델 dep에는 pom이 있었으므로 찾을 수있는 항아리가 없었습니다.


그것은 나를 위해이 오류를 던졌습니다 .POM을 읽는 중 구문 분석 오류. 이유 : 인식 할 수없는 태그 : '포장'
hithwen

편집 : 나는 <packaging> pom </ packaging>이 ​​그것을 고쳤다는 것을 의미했습니다.
replace

4
이렇게하면 질문에 설명 된 문제가 해결되지만 이제 하위 모듈은 내보낼 수있는 아카이브 (예 : 항아리, 전쟁, 귀)를 생성하지 않습니다.
sheldonh

sheldonh이 오류를 수정하고 내보낼 수있는 아카이브를 생성하기위한 솔루션을 찾았습니까?
user3853134

3

나를 위해 일한 유일한 것 : gradle로 전환 :(

나는 가지고있다

Parent
  +---dep1
  +---war1 (using dep1)

그리고 war1에서 cd하고 mvn tomcat7 : run-war을 사용할 수 있습니다. war1이 부모를 참조하고 부모가 war1과 dep1 (모듈로)을 참조 함에도 불구하고 항상 전체 프로젝트를 설치해야하므로 모든 종속성을 알아야합니다.

나는 문제가 무엇인지 이해하지 못한다.


1
이것이 다중 모듈 프로젝트를 만들어야 할 때 gradle을 사용하는 이유입니다. :(
Zhuo YING

2

다음과 같은 Maven 모듈 구조에서 :

- parent
  - child1
  - child2

당신은 이것에있을 것입니다 parent pom:

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

당신은 지금에 의존하는 경우 child1child2당신에 다음을 넣어 <dependencies>에서 child2:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

JAR을 child1찾을 수 없다는 오류가 수신 됩니다. 이는 for에 <dependencyManagement>포함 child1된 블록 을 선언하여 해결할 수 있습니다 .pomparent

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1당신이 실행할 때 지금 빌드가 될 것이다 compilepackage에 등을 목표를 parent하고 child2찾을 수 child1의 컴파일 된 파일을.


2

오프 Bonusing 대답 에서 돈 윌리스 :

빌드가 리액터 서브 모듈간에 테스트 코드를 공유하기 위해 test-jars를 생성하는 경우 다음을 사용해야합니다.

mvn test-compile dependency:tree

dependency:tree이 경우 완료 될 수 있습니다.


-1

실패한 모듈이 pom에서 해결되고 모듈의 pom 파일에 구성을 포함하여 오른쪽 부모를 가리키는 지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.