매번 신규 프로젝트를 생성할때마다 디렉토리 구조를 작성하고 POM 파일을 작성하고 dependency 를 설정하는 등의 불편함을 해소하고 위해 Maven 은 archetype 플러그인을 통한 프로젝트 생성을 지원한다.

Whiteship님이 archetype에 자세한 글을 올려놓으셨다. 글을 마지막부분을 보면 다음과 같이 적혀있다.

위에있는 Atchetype 중에서 맘에 드는 것이 없거나, 자신이 자주 사용하는 프로젝트 템플릿이 있다면 그것을 mvn install로 등록하여 사용할 수도 있습니다.

오호라... 자신만의 archetype 생성이 가능하다라. 이제까지 기본 형태를 만들어두고 zip 압축을 해놓았다가 복사해서 풀어서 쓰곤 했었는데 이번 기회에 archetype 으로 만들어보기로 했다.

작성법은 메이븐 공식 홈페이지Whiteship님의 글을 참고했다.

1. archetype 프로젝트 생성

mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes
                               -DarchetypeArtifactId=maven-archetype-archetype
                               -DarchetypeVersion=1.0
                               -DgroupId=net.arawn
                               -DartifactId=arawn-springweb-base

위 명령을 실행하면 아래와 같은 구조의 프로젝트가 생성된다.

사용자 삽입 이미지

여느 일반적인 maven 프로젝트와는 구조가 조금 다르다. arawn-springweb-base/pom.xml 은 여느 maven 프로젝트와 유사한 내용을 가지고 있다. 후에 버전 변경이나 배포 저장소를 변경시에는 몇가지 추가할 내용이 있겠지만 기본값을 그대로 사용해도 문제없다. src/main/resources/ 하위의 디렉토리들이 실제 archetype 으로 생성될 내용들이다.

2. archetype 프로젝트 작성(pom.xml, .java 등)

빌드시 src/main/resources/META-INF/maven/archetype.xml 에 정의된 내용을 바탕으로 archetype-resources 의 파일들을 packing 한다.

src/main/resources/archetype-resources/pom.xml 에 소스 디렉토리 설정, 플러그인, 라이브러리 의존성 등을 설정하고 하위에 java source 나  resources file 들을 작성한다.

src/main/resources/META-INF/maven/archetype.xml 에는 archetype-resources 디렉토리에 있는 파일들을 목록을 정의해주어야한다.

<archetype>
    <id>arawn-springweb-base</id>
    <sources>
        <source>src/main/java/WebApplicationContext.xml</source>
        <source>src/main/java/controller/HelloController.java</source>
        <source>src/main/java/webservice/HelloService.java</source>
    </sources>
    <testSources>
        <source>src/test/java/ApplicationContext.xml</source>
        <source>src/test/java/webservice/HelloServiceTest.java</source>
    </testSources>
    <resources>
        <resource>src/main/webapp/WEB-INF/view/jsp/hello.jsp</resource>
        <resource>src/main/webapp/WEB-INF/web.xml</resource>
        <resource>src/main/webapp/index.jsp</resource>
    </resources>
</archetype>

sources, testSources 는 source(src/main/java, src/test/java) 디렉토리에 넣어준다. 기본적으로 프로젝트 생성시 설정한 groupId 를 기본값으로 package 를 배치해주는데 아래와 같이 프로젝트 생성시...

mvn archetype:create -DarchetypeGroupId=net.arawn
                               -DarchetypeArtifactId=arawn-springweb-base
                               -DarchetypeVersion=1.0.0
                               -DgroupId=net.arawn
                               -DartifactId=webtest

HelloController.java 의 위치는 아래와 같이 생성된다.

src/main/java/net/arawn/webservice/HelloService.java

여기서 주의해야 할 점이 있다. HelloService.java 파일의 내용은 아래와 같다.

package webservice;

public class HelloService {
    ...
}

소스를 작성하는 시점에서의 package 구조는 단순히 webservice 만이 존재한다. 배포 후 프로젝트를 생성시에는 패키지 구조가 변해버리면서 오류가 발생한다. 이 문제를 해결하는 방법은 아직까지 두가지 밖에 찾지 못했다. 첫번째는 모든 작업을 종료하고 배포 직전에 아래와 같이 소스를 변경하는것이다.

package ${groupId}.webservice;

public class HelloService {
    ...
}

${groupId} 는 프로젝트 생성시 자동적으로 설정한 groupId 의 값으로 변경될 것이다. 두번째 방법은 프로젝트 생성시 pkackageName 옵션을 설정해주는 것이다. 소스는 변경없이 아래 같이 pkackageName 값을 비워놓고 생성하면 된다.

mvn archetype:create ... -DpackageName=

어떤 방법을 사용하던 그리 깔끔하지 못한거 같다. 좀 더 좋은 방법을 찾아봐야겠다.

resources 는 디렉토리 구조 그대로 복사해준다. 만약 eclipse 프로젝트 형태로 archetype 을 만들생각이라면 이 태그에 eclipse 설정 파일(.project, .classpath 등)들을 등록하면된다.

3. archetype 설치 및 배포

Local Repository 에 설치하려면 /arawn-springweb-base 에서 mvn install 명령만 내리면 된다. 만약 mvn archetype:generate 명령을 통해서 프로젝트를 생성하려면 archetype-catalog.xml 파일을 작성해주어야 한다. 수동으로 작업해서 등록해도 되지만 mvn archetype:update-local-catalog 명령을 통해서 간단하게 등록 할 수 있다.

만약 사내(또는 본인)에서 운영하는 Repository(Artifactory, Nexus)가 있다면 deploy Goal 을 통해서 배포가 가능하다. 배포 방법에 관해서는 javajigi 님의 강좌글을 참고!

4. 새로운 Archetype 으로 프로젝트 생성하기

mvn archetype:create -DarchetypeGroupId=net.arawn
                               -DarchetypeArtifactId=arawn-springweb-base
                               -DarchetypeVersion=1.0.0
                               -DgroupId=net.arawn
                               -DartifactId=webtest

archetype-catalog.xml 를 작성했다면 mvn archetype:generate 도 가능하다.
Posted by Arawn Trackback 0 : Comment 2