2010-03-24 3 views
12

OK, 나는 하나의 Maven 모듈을 다른 모듈에 의존하게하려면 어떻게해야합니까?

내가 하위 프로젝트 A, BC이있는 마스터 프로젝트 M을 가지고 ... 내가 메이븐을 사용하는 방법을 이해 생각했다. C에는 AB에 필요한 몇 가지 공통 기능 (주로 인터페이스)이 포함되어 있습니다. 나는 프로젝트 루트 디렉토리 ( M 디렉토리)에서 을 실행하고 A.jar, B.jarC.jar JAR 파일을 얻을 수 있습니다. (모든 산출물에 대한 버전은 현재 2.0-SNAPSHOT 수 있습니다.)

<dependencyManagement> 태그에서 M 디렉토리 목록 C의 마스터 pom.xml 파일, AB 그냥과 같이, 참조를 포함하여 C를 참조 할 수 있도록 :

<dependency> 
    <groupId>my.project</groupId> 
    <artifactId>C</artifactId> 
</dependency> 

지금까지는 그렇게 좋았습니다. 명령 줄에서 mvn compile을 실행할 수 있으며 모든 것이 잘 동작합니다. 그러나 NetBeans에서 프로젝트를 열면 "일부 종속성 아티팩트가 로컬 저장소에 없습니다"라는 메시지가 나타나 누락 된 아티팩트는 C입니다. 마찬가지로 명령 줄에서 A 또는 B 디렉토리로 변경하고 mvn compile을 실행하려고하면 "빌드 오류 : 이슈 분석에 실패했습니다."라는 메시지가 나타납니다.

은 내가 수동으로 C.jar이 구축 된 곳으로 이동 mvn install:install-file를 실행할 수 있습니다 기대하지만, 차라리 나를 그냥 넷빈즈 (및/또는 m2eclipse에를 사용하여 이클립스)에서 직접 작업 할 수있는 해결책을 찾을 것입니다.

내가 뭘 잘못하고 있니?

답변

22

Maven은 바이너리 의존성의 개념에 의존하고 로컬 저장소를 통해이를 해결합니다. 즉, 로컬 저장소에 패키지를 "설치"해야합니다. 종속성이있는 경우에는 컴파일 및 패키징 코드로는 충분하지 않습니다. 그렇게하려면 install을 실행해야합니다 (은 다른 프로젝트의 종속성으로 로컬로 사용하기 위해 패키지를 로컬 저장소에 설치합니다)).

사이드 노트 : 당신은 mvn compile jar:jar를 호출하지만 mvn package 선호하지 않아야합니다.먼저 package 단계를 실행하면 package (compile 포함) 및 package 그 자체 앞에 모든 단계가 트리거됩니다. 둘째, package을 실행하면 프로젝트의 <packaging> 값에 따라 jar:jar 또는 war:war 등이 호출됩니다 (이에 대한 자세한 내용은 introduction to the lifecycle을 확인하십시오). 이것은 Maven의 가장 큰 장점 중 하나입니다. 프로젝트가 JAR, WAR, EJB 등인지 알 필요가 없으며 패키지를 작성하기위한 적절한 목표를 실행해야합니다. 표준화 된 package 단계를 실행하면 Maven이 기본 목표 바인딩을 사용하여 작업을 수행합니다.

이것은 Maven 이론적 부분을위한 것입니다. IDE 내부에서, Maven과 함께 작업하는 것이 더 편리 할 수있는 것들이 약간 다를 수 있습니다. IDE는 이진 종속성 대신 프로젝트 종속성 (즉, IDE 내부의 코드에 대한 종속성)을 사용하여 mvn install을 실행하지 않고도 한 프로젝트의 변경 사항을 다른 모듈에서 볼 수 있습니다. 이것은 Eclipse + M2Eclipse의 경우입니다. 그리고 이것은 다음과 같은 조건에서 넷빈즈에도 적용 (Dependency Management 참조)

사실이 아닙니다

Hint: If you open a project that other projects depend on, the icon in other projects changes to a "maven project" icon to denote that the IDE knows about link between the projects. However such a link is only established when the groupId, artifactId and version all match in the dependency and project declaration. Frequently occurring problem is that you change an API signature in your library project, but the application is not picking up. Often it's caused by the fact that the application is using an older version of the library artifact. The artifact icon can help you track down these problems.

+0

감사합니다. 필자는'mvn compile '대신'mvn package'를 사용하는 것을 알고있었습니다. 그러나 알림을 보내 주셔서 감사합니다. 그러나 wiki.netbeans.org의 "Maven Best Practices"링크가 특히 유용했기 때문에이 대답을 받아 들였습니다. –

+0

@Daniel 대단합니다. 그러나 사이드 노트는'mvn 패키지'와'mvn jar : jar'에 대해 더 많은 것이 었습니다 :) 당신이 유용한 링크를 찾았 기 때문에 다행입니다. –

+0

모듈의'install'을 부모의'compile'의 일부로 실행할 수 있습니까? –

6

mvn compile 대신 mvn install을 실행해야합니다. install 목표는 빌드 된 jar를 컴파일하고 패키징 한 후 로컬 저장소에 복사합니다. 컴파일 만 실행하면 클래스 파일을 target 디렉토리로 컴파일하고 다른 프로젝트에서는 사용할 수 없게됩니다.

최상위 레벨에서 pom을 가져 오는 경우 하위 프로젝트를 별도의 Eclipse 프로젝트로 가져 와서 관련 프로젝트의 종속성을 설정 한 다음 각 프로젝트의 클래스 경로를 다른 프로젝트에 따라 설정합니다. 나는 Netbeans에 익숙하지 않지만 같은 일을 할 수있는 방법이 있음을 확신한다.

3

netbeans는 로컬 저장소 내용으로 프로젝트를 서로 연결하므로 대부분의 시나리오에서 mvn install이 필요합니다.

관련 문제