메이븐에서 ear 패키지를 만들어 주는 플러그인은 maven-ear-plugin이다.
ear 파일에 포함되어 함께 패키징될 아카이브 모듈들은 <modules> 엘리먼트 하위에 <ejbModule>, <jarModule>, <webModule> 식으로 설정해서 끼워 넣는다.

그런데 xxxModule 설정 옵션을 보자면, 모두가 groupId와 artifactId를 통해서 끼워넣을 모듈을 지정하고 있다. 아무리 찾아봐도 모듈 파일의 경로를 설정하는 건 없다 ! 내가 원하는 건 임의의 경로에 있는 아카이브를 ear에 포함하고 싶은건데.... ㅜ.ㅜ

여기까지만 보면, 메이븐 저장소에 등록된 모듈만 ear에 포함시킬 수 있다는 결론이 나온다. 내가 만든 모듈을 ear에 포함시키고 싶으면 먼저 모듈을 로컬이나 리모트 저장소에 등록해주어야 한다는 거다. 이 무슨 시츄에이션인가?

그러나 저장소에 등록하지 않고 포함시킬수 있는 방법이 있다. 포함되는 모듈의 의존성 scope를 system으로 잡고, 파일의 절대경로를 지정하면 된다.

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-ear-plugin</artifactId>
 <version>2.3.1</version>
 <configuration>
  <modules>
   <ejbModule>
    <groupId>mycom</groupId>
    <artifactId>myapp-ejb</artifactId>
   </ejbModule>
   <webModule>
    <groupId>mycom</groupId>
    <artifactId>myapp-web</artifactId>
   </webModule>
  </modules>
 </configuration>
</plugin>
.....
......
<dependencies>
 <dependency>
  <groupId>mycom</groupId>
  <artifactId>myapp-web</artifactId>
  <version>1.0</version>
  <type>war</type>
  <scope>system</scope>
  <systemPath>${project.basedir}/myapp-web.war</systemPath>
 </dependency>
 <dependency>
  <groupId>mycom</groupId>
  <artifactId>myapp-ejb</artifactId>
  <version>1.0</version>
  <type>ejb</type>
  <scope>system</scope>
  <systemPath>${project.basedir}/myapp-ejb.jar</systemPath>

 </dependency>
 .....
</dependencies>

이렇게 잡아놓고 mvn package를 날리면 저장소에 등록되지 않은 myapp-ejb.jar, myapp-web.war 파일이 ear에 함께 패키징되는 것을 확인할 수 있다.

Posted by 에코지오
,