2009-12-18 3 views
9

여기 질문은 "메이븐 빌드에서 여러 유물"내 변화입니다. 내 응용 프로그램은 EAR로 패키징 된 EJB 서버이지만 다른 클라이언트 응용 프로그램에서 사용할 클라이언트 JAR도 노출합니다. 이 jar에는 EJB 인터페이스, facade 클래스 및 일부 헬퍼가 포함되어 있습니다.메이븐 (EJB) 프로젝트는

Maven 방식은 프로젝트 당 하나의 아티팩트 (PIF)가 있다는 것을 알고 있습니다. 하지만 두 소스 (서버 EAR 및 클라이언트 JAR)는 동일한 소스 트리 (예 : EJB 및 '홈'인터페이스)에서 서버 및 클라이언트 공유로 빌드해야합니다.

어떻게하면 Maven에서이 작업을 수행 할 수 있습니까?

두 개의 POM이 포함 된 프로젝트 (예 : server-pom.xml & client-pom.xml)가 있습니까? 나는 또한 하나의 파울 스풀로 클라이언트와 서버를 빌드하는 데 사용할 수있는 부모 POM (pom.xml)을 가질 수 있다고 생각하고 있었습니까? 그러나 서버는 어셈블리 (tar/gzip)를 거쳐야하기 때문에 '패키지'단계 이후에 수명주기가 다른 반면 클라이언트는 '패키지'이후에 완료되며 저장소에 간단히 설치할 수 있습니다.

이 문제를 해결하는 가장 좋은 방법에 대한 조언이나 경험이 있으십니까?

답변

18

내가 메이븐 방법은 가지고 것을 알고

는 부모의 pom.xml은 modules 태그를 사용 프로젝트 당 하나의 이슈 (POM); 하지만 두 소스 (서버 EAR 및 클라이언트 JAR)는 동일한 소스 트리 (예 : EJB 및 '홈'인터페이스)에서 서버 및 클라이언트 공유로 빌드해야합니다.

"프로젝트 당 하나의 아티팩트"규칙에 예외가 있습니다. EJB 프로젝트 중 하나가 그 규칙입니다. 그래서, maven-ejb-plugin 클라이언트 JAR이 같은 EJB 항아리를 생성하도록 구성 할 수 있습니다

<project> 
    [...] 
    <dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>ejb-project</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>ejb-client</type> 
    </dependency> 
    </dependencies> 
    [...] 
</project> 
:

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-ejb-plugin</artifactId> 
     <configuration> 
      <generateClient>true</generateClient> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

<type>ejb-client</type>의 종속성으로 추가, 다른 프로젝트에서 EJB 클라이언트를 사용하려면

자세한 내용 (ejb 클라이언트에 포함/제외 된 클래스를 사용자 정의하는 방법 포함)은 Generating an EJB client, Using the ejb-client as a dependencyejb mojo의 설명서를 참조하십시오.

+0

우수! 그것을 시도하게하십시오. –

+1

@Pascal, 이것은 EJB 클라이언트가 동일한 다중 모듈 프로젝트 내에서 다른 모듈의 종속성 인 경우를 제외하고는 잘 작동합니다. 첫째, EJB 클라이언트는 자체 폴더가 없으므로 부모 모듈 목록에서 중첩 모듈로 사용할 수 없습니다. EJB 모듈의 부산물 일뿐입니다. 두 번째로, EJB 클라이언트 아티팩트는 패키지 단계에서만 생성되므로 리액터는 결합 된 클래스 경로에 어쨌든이를 추가 할 수 없습니다. –

+1

그래서이 방법을 포기하고 EJB 클라이언트에 대한 명시 적 모듈을 만들어야 만하는 것 같습니다. 그러나 이것은 새로운 'ejb-client'모듈이 Java 소스를 메인 'ejb'모듈과 공유해야한다는 것을 의미합니다 (EJB 인터페이스는 공유됩니다). 나는 주 'ejb'모듈에서 소스를 유지하고 'ejb-client'모듈이 동일한 소스 폴더 (예 : ../ejb/src)를 가리 키도록 구성한다고 가정합니다. –

6

전에 이것을 해결하기 위해 multimodule projects을 사용했습니다.

project/ 
    pom.xml <- type=pom, lists sub modules 
    ejb/ 
     src/main/java, etc. 
     pom.xml <- type=ejb, describes ejb module, has dependency on "jar" module 
    jar/ 
     src/main/java, etc. 
     pom.xml <- type=jar, simple, builds jar 
    ear/ 
     pom.xml <- type=ear, has reference to ejb module that it should use 
    ... 

나는이 방법을 함께 구축해야하는 12 개의 서로 다른 모듈을 가지고있는 다소 복잡한 프로젝트에 사용했습니다. ejb를 참조하려면 ear docs을 참조하십시오.

<modules> 
    <module>jar</module> 
    <module>ejb</module> 
    <module>ear</module> 
</modules> 

그리고 하위의 pom.xml의 사용 parent 태그 :

<parent> 
    <groupid>mygroup</group> 
    <artifactId>parentName</artifactId> 
</parent> 
+0

@ 존, 나는 멀티 모듈 방식에 동의합니다.나는 클라이언트 * 용 * EAR 패키징의 사용법을 잘 모르겠다. * 클라이언트 * 항아리는 EAR 내에 있으면 안되며, 동일한 코드베이스 (src/main/java)로 빌드해야한다.)를 EAR 코드로 사용합니다. 두 이슈가 모두 EJB 인터페이스/홈 클래스를 공유하기 때문입니다. –