Maven은 MVN 의존성을 실행할 때 형제 모듈을 인식하지 못합니다 : 트리

StackOverflow https://stackoverflow.com/questions/1677473

문제

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

나는 가지고있다:

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

상위 POM (포장형 POM이있는 POM) 및 하위 디렉토리에서 commons/ 그리고 storage/ 같은 이름의 항아리 폼을 정의합니다.

저장소는 커먼즈에 따라 다릅니다.

메인 (마스터) 디렉토리에서 나는 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를 설치하고 싶지 않습니다. 이것은 동일한 소스 트리에 두 가지가 있다면 빌드를 계속하기 위해 중간 제품을 설치할 필요가 없다는 것을 직관적으로 이해합니다. 바라건대 내 생각이 여기서 의미가 있습니다 ...

도움이 되었습니까?

해결책

문제는 의존성을 지정할 때 Maven이 그것을 포장하여 최소한 로컬 리포에서 사용할 수있는 JAR (또는 무엇이든)로 기대할 것으로 기대한다는 것입니다. 당신이 달리면 확실합니다 mvn install 커먼즈 프로젝트에서 먼저 모든 것이 작동합니다.

다른 팁

논의 된 바와 같이 이 Maven 메일 링리스트 스레드, 의존성 : 트리 목표 자체는 원자로가 아닌 저장소에서 사물을 찾을 것입니다. 이전에 제안한대로 MVN 설치 또는

mvn compile dependency:tree

나를 위해 일합니다.

이것이 오래된 스레드라는 것을 깨닫지 만 도구가 진화했거나 이것이 처음으로 놓친 것 같습니다.

원자로 빌드를 수행하여 설치하지 않고 종속성을 해결하는 빌드를 수행 할 수 있습니다.

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

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

여기에 있습니다 참조 이 상황을 설명합니다.

나를 위해,이 스레드로 이어진 것은 비슷한 문제였으며 해결책은 모든 모듈 의존성 POM이

 <packaging>pom</packaging>

부모는 가지고있었습니다

POM

내 모델 DEP에는 POM이 있었기 때문에자를 찾을 수 없었습니다.

나를 위해 일하는 유일한 것 : Gradle로 전환 :(

나는 가지고있다

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

그리고 나는 WAR1에서 CD 만 CD를 만들고 mvn tomcat7 : run-war를 사용할 수 있습니다. WAR1은 그의 부모와 부모 참조 WAR1 및 DEP1 (모듈로)을 참조하여 항상 전체 프로젝트를 설치해야하므로 모든 종속성을 알아야합니다.

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

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

- parent
  - child1
  - child2

당신은 할 것입니다 parent pom 이것:

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

당신이 지금 의존한다면 child1 안에 child2 당신의 다음을 넣음으로써 <dependencies> 안에 child2:

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

항아리에 대한 오류를 받게됩니다 child1 찾을 수 없다. 이것은 선언하여 해결할 수 있습니다 <dependencyManagement> 블록을 포함하여 child1 에서 pom ~을 위한 parent:

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

child1 이제 a compile 또는 package 등의 목표 parent, 그리고 child2 찾을 것이다 child1의 컴파일 된 파일.

보너스 오프 대답 ~에서 돈 윌리스:

빌드가 테스트 자르를 생성하여 원자로 서브 모듈간에 테스트 코드를 공유하는 경우 사용해야합니다.

mvn test-compile dependency:tree

허용 할 것입니다 dependency:tree 이 경우 완료됩니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top