개요

자주 쓰는 maven 프로젝트 템플릿이 있다면 maven archetype 으로 등록하고 archetype:generate 를 이용하여 재활용할 수 있다.

새로운 archetype 을 등록하는 작업은 생각보다 단순하고 쉽다.

작업 단계

크게 다음 4단계의 절차를 통해 새로운 archetype 을 만들고 추가할 수 있다.

  1. archetype descriptor(파일명: archetype-metadata.xml, 위치: src/main/resources/META-INF/maven/) 만들기.  이 파일에는 archetype 생성시 필요한 정보가 들어간다.
  2. generate시 archetype plugin에 의해 복사되는 prototype files 만들기(위치: src/main/resources/archetype-resources/

  3. prototype pom 파일 만들기 (파일명: pom.xml, 위치: src/main/resources/archetype-resources)
  4. a pom for the archetype (pom.xml in the archetype's root directory).

맨땅에서 archetype 생성하기

실제로 archetype 을 추가할때는 기존 프로젝트를 기반으로 하는게 좋으나 archetype 생성에 대한 이해를 높이기 위해 아무것도 없는 상태에서 생성하는 걸 설명한다.

  1. 새로운 archetype 을 위한 프로젝트 폴더를 생성한다. 편의상 폴더명은 my-archetype-first 으로 한다.

    mkdir my-archetype
    cd my-archetype
    CODE
  2. archetype artifact 용 pom 파일을 생성한다. 위치는 일반 pom 처럼 현재 위치에 놓는다

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.lesstif.archetypes</groupId>
      <artifactId>my-first-archetype</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>maven-archetype</packaging>
     
     <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <build>
        <extensions>
          <extension>
            <groupId>org.apache.maven.archetype</groupId>
            <artifactId>archetype-packaging</artifactId>
            <version>2.2</version>
          </extension>
        </extensions>
    
        <pluginManagement>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-archetype-plugin</artifactId>
              <version>2.2</version>
              <extensions>true</extensions>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    XML
    groupId, artifactId, version는 archetype:generate 시에 다음과 같이 전달될 파라미터이므로 주의깊게 설정한다.

    -DarchetypeGroupId=${groupId} -DarchetypeArtifactId=${artifactId} -DarchetypeVersion=${version}

  3. src/main/resources/META-INF/maven/archetype-metadata.xml 에 archetype descriptor 파일을 생성한다.

    mkdir -p src/main/resources/META-INF/maven/
    vi src/main/resources/META-INF/maven/archetype-metadata.xml
    CODE

     

     

    src/main/resources/META-INF/maven/archetype-metadata.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <archetype-descriptor xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0" xmlns:xsi="http://www.w3.org/
    2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.a
    pache.org/xsd/archetype-descriptor-1.0.0.xsd" name="my-first-archetype">
      <fileSets>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/main/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
          <directory>src/main/webapp</directory>
          <includes>
            <include>**/*.jsp</include>
            <include>**/*.xml</include>
          </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
          <directory>src/main/resources</directory>
          <includes>
            <include>**/*.xml</include>
            <include>**/*.properties</include>
          </includes>
        </fileSet>
        <fileSet filtered="true" packaged="true" encoding="UTF-8">
          <directory>src/test/java</directory>
          <includes>
            <include>**/*.java</include>
          </includes>
        </fileSet>
      </fileSets>
    </archetype-descriptor>
    XML

    name="my-first-archetype" 부분은 archetype 검색시 표시될 이름이다.

  4. archetype에 포함시킬 파일들은 src/main/resources/archetype-resources 폴더밑에 위치해야 한다. 해당 폴더를 생성한다.

    mkdir -p src/main/resources/archetype-resources/src/{main,test}/java
    CODE
  5. archetype 에 포함시킬 예제 소스 파일을 생성한다.
    예제 소스

    src/main/resources/archetype-resources/src/main/java/App.java

    package $package;
    /**
     *  Hello world!
     */
    public class App
    {
        public static void main( String[] args )
        {
            System.out.println( "Hello World!" );
        }
    }
    CODE

    예제 테스트 케이스 추가

    src/main/resources/archetype-resources/src/test/java/AppTest.java

     package $package;
    
    import org.junit.Test;
    import static org.junit.Assert.*;
    
    /**
     * Unit test for simple App.
     */
    public class AppTest 
    {
        @Test
        public void testApp()
        {
            assertTrue( true );
        }
    }
    CODE
  6. prototype pom.xml 을 생성한다. 이 파일은 mvn archetype:generate 로 생성된 프로젝트에 포함되는 pom.xml 이다. 자주 쓰는 dependency 나 repository 등 프로젝트에 필요한 내용을 추가한다.
    artifactId angroupId  는 프로젝트마다 동적으로 생성되어야 하므로 pom 파일에는 variable 로 기술한다.

    src/main/resources/archetype-resources/pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>${groupId}</groupId>
      <artifactId>${artifactId}</artifactId>
      <version>${version}</version>
      <packaging>jar</packaging>
    
      <name>A custom project</name>
      <url>http://www.myorganization.org</url>
      
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.8</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </project>
    XML
  7. mvn install 을 실행해서 local repository 에 archetype 을 등록한다.
  8. mvn archetype:generate 를 실행한다.

    mvn -DarchetypeCatalog=local archetype:generate       \
      -DarchetypeGroupId=com.my.archetypes                \
      -DarchetypeArtifactId=my-first-archetype            \
      -DarchetypeVersion=1.0-SNAPSHOT                     \
      -DgroupId=<my.groupid>                              \
      -DartifactId=<my-artifactId>
    CODE
  9. 제대로 생성되었는지 확인후 제대로 되었다면 mvn deploy 로 해당 archetype 을 사용하는 nexus repository 에 등록한다.

기존 프로젝트로부터 생성하기

mvn archetype:create-from-project 을 사용하여 기존 프로젝트에서 생성할 수 있다.

  1. 기존 mvn 프로젝트로 이동 (Ex: cd my-maven-proj)
  2. archetype 프로젝트 생성

    mvn archetype:create-from-project
    CODE
  3. maven archetype 프로젝트는 target/generated-sources/archetype 에 생성된다.
  4. cd target/generated-sources/archetype
  5. mvn install 로 local repository 에 추가
  6. 추가한 archetype 으로 부터 프로젝트 생성

    mvn archetype:generate -DarchetypeCatalog=local
    CODE
  7. 정상적으로 동작한다면 mvn deploy 에 nexus repository 에 배치

같이 보기

참고

There is no content with the specified labels