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

다중 모듈 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를 설치할 필요가 없습니다. 이것은 동일한 소스 트리에 두 가지 항목이있는 경우 빌드를 계속하기 위해 중간 제품을 설치할 필요가 없다는 것을 직관적으로 이해합니다. 제 생각이 여기에서 이해되기를 바랍니다 …



답변

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


답변

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

mvn compile dependency:tree

나를 위해 작동합니다.


답변

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

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

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

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

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


답변

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

 <packaging>pom</packaging>

부모는

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


답변

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

나는 가지고있다

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

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

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


답변

다음과 같은 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의 컴파일 된 파일을.


답변

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

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

mvn test-compile dependency:tree

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