2010-12-21 5 views
4

다중 모듈 Maven-3 프로젝트가 있는데, 다른 모든 모듈에서 서브 모듈 중 하나가 <dependency>으로 사용됩니다. 동시에 모든 하위 모듈은 상위 모듈에서 상속받습니다. 이러한 구조는 주기적 종속성을 초래합니다. 어떻게 해결할 수 있습니까?보조 Maven 서브 모듈의 주기적 종속성을 해결하는 방법은 무엇입니까?

프로젝트 구조는 오히려 전형적인 :

[...] 
<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-checkstyle-plugin</artifactId> 
     <configuration> 
     <configLocation>checkstyle/checks.xml</configLocation> 
     </configuration> 
     <dependencies> 
     <dependency> 
      <groupId>${project.groupId}</groupId> 
      <artifactId>foo-testkit</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
     </dependencies> 
     <executions> 
     <execution> 
      <phase>prepare-package</phase> 
      <goals> 
      <goal>check</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 
[...] 

부모 foo/pom.xml에서 나는 방법을 지정하고 모든 서브 모듈에서 실행되는 checkstyle 플러그인을 때 :

/foo 
    /foo-testkit 
    /foo-core 

이 부모 foo/pom.xml입니다. 하지만 foo에서 상속받은 하위 모듈 인 foo-testkit에서 checkstyle을 실행할 필요는 없지만 동시에 종속성이 있습니다.

답변

4

foo-testkit의 pom.xml 파일에 아래를 추가하여 checkstyle plugin 모듈을 foo-testkit에 대해 비활성화하는 것이 한 가지 방법입니다. 그이 마음에 들지 않는다면

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-checkstyle-plugin</artifactId> 
    <configuration> 
    <skip>true</skip> 
    </configuration> 
</plugin> 

또 다른 방법은 부모 pom.xml 파일에서/pluginManagment/플러그인을 구축하는 빌드/플러그인에서 checkstyle 플러그인 구성을 이동하는 것입니다. 이것은 해당 모듈의 플러그인 및 부모의 pom.xml에 지정된 구성 아래를 호출

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-checkstyle-plugin</artifactId> 
</plugin> 

: 그럼 당신은 실행 checkstyle 할 각 모듈, 각 모듈의 pom.xml 파일의 빌드/플러그인 섹션이 추가 플러그인 관리 섹션이 적용됩니다. 해당 모듈에서 mvn help:effective-pom을 실행하여 올바르게 작동하는지 확인할 수 있습니다.

+0

내가 이해하는 한, 감사의 말로는 두 가지 옵션 만 사용할 수 있습니다. 첫 번째 코드는 많은'pom.xml' 파일에서 코드 중복을 일으키지 않으므로보다 효과적입니다 (12 개의 하위 모듈이 있습니다) – yegor256

1

그래서 부모 POM이 서브 모듈 중 하나를 참조하고 있습니다. 의존성으로? 상위 모듈에서 빌드 논리가 계속 진행중인 경우 새로운 하위 모듈로 밀어 넣는 것이 좋습니다. 부모는 <modules>, <pluginManagement><dependencyManagement> 섹션을 지정해야합니다. 다른 모든 작업은 서브 모듈로 수행되어야합니다.

http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html

+0

거기에 ''의''섹션을 사용해야합니다. 모든 하위 모듈에 공통적으로 사용되는 플러그인 ''을 선언해야합니다 (업데이트 된 질문 참조). – yegor256

+0

''섹션에서' '을 지정하는 것을 막을 수있는 방법은 없습니다. –

2

내가 Tim Clemons's answer에 동의하지만, 대안도있다, 프로젝트가 중첩합니다

은 멀티 모듈 프로젝트 구성에 대한 자세한 조언은 다음을 참조하십시오.

     root 
        /  \ 
       common sub-root 
         / | \ 
         sub1 sub2 sub3 

는 POM에 sub-root common에 종속성을 정의한다. 이것이 최선의 방법이라고 말하는 것은 아니지만 문제에 대한 해결책입니다.

+0

나는 그 아이디어가 마음에 들지만 지금은 그것보다 더 지저분해질 것이다. 나는'foo-testkit'을 상속 나무에서 옮기는 것이 낫습니다.이것은 솔직하고 정교하지만 우아한 것은 아닙니다. (위의 업데이트 된 질문 참조) – yegor256

0

foo (하위 모듈에만 있음)에 실제로 필요하지 않은 경우 빌드 정의의 플러그인 정의를 foo/pom.xml의 pluginManagement 세그먼트로 이동하여 순환 문제를 해결할 수 있습니다.