본문 바로가기

Information Technology/Spring Framework

ant+maven으로 의존성 관리하기

maven
* antlib, call maven from ant
* wagon-webdav, deploy your jar using webdav
* deploy your jar, with antlib, wagon-webdav


ant+maven으로 의존성 관리하기
jar의 지옥에서 정말 빠져나올 수 있을까?

1. ant에서 maven사용.
http://maven.apache.org/ant-tasks.html

maven에서 제공하는 ant tasks를 이용하면 ant에서 의존성 관리, 리파지터리 등록, POM 정보 이용이 가능해 진다. 바로 사용 방법을 알아보자.

- http://maven.apache.org/download.html에서 최신 버젼의 maven-artifact-ant-*.*.*-dep.jar를 다운로드한다.

  (문서의 시점에서는 2.0.4가 최신 버젼이다.)


- 프로젝트의 lib 디렉토리에 복사한다. (본 예제에서는 lib/build/에 복사했다.)


- ant의 build.xml을 아래와 같이 수정
<?xml version="1.0" encoding="UTF-8"?>
  <project name="antven" xmlns:artifact="urn:maven-artifact-ant">
  <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" classpath="lib/build/maven-artifact-ant-2.0.4-dep.jar" />
  ....
</project>

 

이것으로 기본 설정은 끝났다. 다음장에서는 POM 정보 이용, 의존성 관리, 리파지터리 등록 방법을 차례로 살펴본다.

2. POM 정보 이용.

POM파일(pom.xml)은 maven에서 사용하는 Project Object Model 파일이다.  자세한 정보는 http://maven.apache.org/guides/introduction/introduction-to-the-pom.html 를 참조하면 된다. (maven의 문서화는 아직 부족하다. 이 문서를 작성하게 된 이유도 본인이 문서의 부족때문에 하루의 시간을 낭비했기 때문이다.)

사용 방법을 알아보자.

- pom.xml을 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.antven</groupId>
  <artifactId>antven</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0</version>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

 

- build.xml에 pom.xml을 등록한다.
<?xml version="1.0" encoding="UTF-8"?>
<project name="antven" xmlns:artifact="urn:maven-artifact-ant">
  <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" classpath="lib/build/maven-artifact-ant-2.0.4-dep.jar" />
  <artifact:pom id="pom" file="pom.xml" />
  ....
</project>

 

이것으로 POM에 등록된 여러 정보를 ant에서 이용할 수 있다. 예를 들어 프로젝트 버젼 정보는 ${pom.project.version}으로 조회 가능하다. 다음 장에서 어떻게 POM등록된 의존성 관리를 이용 하는지 설명한다.

 

 

3. 의존성 관리하기.

 

지금까지 ant에서 maven의 POM 정보를 이용하는 방법을 알아 봤다. 이제 본격적으로 이를 이용한 의존성 관리 방법을 알아 본다.

 

- build.xml에 dependencies등록
<?xml version="1.0" encoding="UTF-8"?>
<project name="antven" xmlns:artifact="urn:maven-artifact-ant">
  <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant" classpath="lib/build/maven-artifact-ant-2.0.4-dep.jar" />
  <artifact:pom id="pom" file="pom.xml" />
  <artifact:dependencies filesetId="pom.fileset" pathId="pom.classpath" pomRefId="pom" />
  ....
</project>

 

build.xml에 dependency를 등록할 수도 있지만 여기서는 깔끔한 역할 분리를 위해 maven을 에서 제공하는 정보는 pom.xml에 있는 것을 이용했다.

 

<artifact:dependencies filesetId="pom.fileset" pathId="pom.classpath" pomRefId="pom" />

위 태스크를 좀더 설명하면 pomRefId="pom"으로 위에서 정의한 pom.xml을 이용해서 dependency를 관리하겠다고 선언한 것이다. pom.fileset과 pom.classpath는 의존성이 있는 파일을 복사하거나 클래스패스에 추가할 때 유용하게 사용할 수 있다.

 

3.1 의존성 파일 복사하기.

 

웹 프로젝트에서 의존성있는 jar파일은 WEB-INF/lib에 복사해야한다. 이것은 앞절에서 소개한 pom.fielset을 이용해서 아래와 같이 태스크를 작성하면 된다.

 

<target name="import-dependency" description="copy dependency jar file to WEB-INF/lib">
  <copy todir="webapps/WEB-INF/lib">
    <fileset refid="pom.fileset"/>
    <mapper type="flatten" />
  </copy>
</target>

 

3.2 의존성 파일 이용해 컴파일 하기.

 

소스를 컴파일 할때 의존성있는 jar를 이용하려면 classpath의 refid에 pom.classpath를 이용하면 된다.

 

<javac srcdir="src" destdir="webapps/WEB-INF/classes">
  <classpath refid="pom.classpath" />
</javac>


 

4. 리파지터리에 등록하기.

 

개인적인 프로젝트에서는 maven의 중앙 리파지터리를 이용하는 것만으로 충분하지만 사내 큰 규모의 프로젝트에서는 사내의 리파지터리를 이용해야한다. 예를 들어 중앙 리파지터리에 접근하지 못하는 상항(중앙 리파지터리 장애, 사내 네트워크 장내등)이 발생하면 프로젝트의 빌드가 불가능해 질 수 있다. 또한 중앙 리파지터리에 없는 의존성 파일이 필요할 때도 사내 리파지터리가 있으면 편하게 등록해서 사용할 수 있다.


4.1 사내 리파지터리 준비하기.

 

httpd+mod_dav 사용하면 된다. maven과 상관없이 아파치 문서(http://httpd.apache.org/docs/2.2/en/mod/mod_dav.html)만 보고 설정하면 된다.


4.2 사내 리파지터리에 프로젝트 등록하기 (deploy)

 

이부분이 웹상에 잘 정리된 문서가 없다. maven 사용자 메일의 흔적을 이용해서 겨우 성공했다. 기본적으로 maven은 scp나 ftp를 이용해서 리파지터리에 등록하는 것을 지원 하는 것 같다. (정확히 모른다. ;;;) 하지만 여기서는 webdav를 이용해서 등록하는 방법을 설명한다.

 

- pom.xml에 사내 리파지터리 정보를 등록한다. (dav:http는 오타 아니다.)
<distributionManagement>
  <repository>
    <id>antven-repo</id>
    <name>antven-repo</name>
    <url>dav:http://repo.yourdomain.com/maven2</url>
  </repository>
</distributionManagement>


- build.xml에 아래의 태스크를 추가한다.
<artifact:install-provider artifactId="wagon-webdav" version="1.0-beta-2" />
<target name="deploy" description="deploy jar file to repository">
  <artifact:deploy file="target/antven.jar">
    <pom refid="pom" />
  </artifact:deploy>
</target>

 

아래 두개의 설정으로 리파지터리에 등록할때 이상한 에러 없이 정상적으로 등록 가능하다.

<url>dav:http://repo.yourdomain.com/maven2</url>

<artifact:install-provider artifactId="wagon-webdav" version="1.0-beta-2" />

 

wagon-webdav에 대한 설명은 http://maven.apache.org/wagon/wagon-providers/wagon-webdav/을 참조한다. (별 도움 안된다.)

 

ant를 이용해서 deploy를 실행하면 antven.jar가 아래와 같이 리파지터리에 등록된다.

 

com.antven/antven/1.0.0/
  - antven-1.0.0.jar
  - antven-1.0.0.jar.md5
  - antven-1.0.0.jar.sha1
  - antven-1.0.0.pom
  - antven-1.0.0.pom.md5
  - antven-1.0.0.pom.sha1

 

 

만약 리파지터리의 webdav 설정에 권한이 필요하다면 다음 파일에 권한 정보를 입력하면 된다.

(user home directory)/.m2/settings.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<settings>
 <servers>
  <server>
   <username>yourid</username>
   <password>yourpaddword</password>
   <id>antven-repo</id>
  </server>
 </servers>
</settings>

 

id는 pom.xml의 distributionManagement에서 정의한 id와 동일해야 한다.

 

 

5. 마무리.

 

maven은 best practices 라고는 하지만 그 best practices에서 조금만 벗어난 것을 하려면 너무 불편하다. 하지만 의존성 관리는 매력적인 기능이다. 이미 ant를 익숙하게 사용하고 있는 프로젝트라면 maven의 의존성 관리를 이용해서 더욱 편한 개발 생활은 즐기기 바란다. 과연 jar 지옥에서 벗어날 수 있을까?

 

기타 유용한 팁.

- create maven mirror repository

   http://maven.apache.org/guides/mini/guide-mirror-settings.html

   rsync -v -t -l -r mirrors.ibiblio.org::maven2 /data/maven2


- repository search, find jar in jar repository

  http://maven.ozacc.com/

 

더 조사해야 하는것.

- how to upload source to repository

- how to re-download jar from repository when it is same version but a little bit diffent -_ -

- subversion을 리파지터리로 이용하기

http://blogs.codehaus.org/people/brett/archives/001066_storing_your_maven_repository_in_cvssubversion.html

- 의존성 jar 분석

  http://www.kirkk.com/main/Main/JarAnalyzer

 

'Information Technology > Spring Framework' 카테고리의 다른 글

Jakarta Ant 2/2  (0) 2011.06.15
Jakarta Ant 1/2  (0) 2011.06.15
WAR (Web Application aRchive)  (0) 2011.06.07
ANT 사용법  (0) 2011.06.07
ANT 귀한 팁들.. [펌자료]  (0) 2011.06.07