Maven 을 사용한 archetype 관리

1,130 views
Skip to first unread message

양완수

unread,
Mar 16, 2011, 12:19:18 AM3/16/11
to Korea Spring User Group
안녕하세요!


프로젝트마다 공통적으로 작성되는 코드,설정,관례 등을 Maven Archetype을 통해 관리하려고합니다.
또한 지속적으로 "archetype 프로젝트" 을 관리하려했습니다.

헌데 "archetype 프로젝트" 의 빌드가 깨지지 않는 깨끗한 빌드인지 확인 하려면 "archetype 프로젝트"를 로컬에
install 한 후 install 된 archetype 으로 프로젝트를 생성하고 확인하는 절차가 부당하게 느껴졌습니다.

검색을 하다보니 일반 프로젝트를 archetype 프로젝트로 변환을 하는 방법이 archetype 플러그인에 create-
from-project 라는 것이란 걸 알았습니다.
"archetype 프로젝트"로 변환이 될 프로젝트 을 "템플릿 프로젝트" 라고 하겠습니다.

"템플릿 프로젝트" 를 CI를 통해 관리하고 create-from-project 를 사용해 얻어진 결과인 archetype를 넥
서스에 올려 배포 할 계획입니다.

문제는 "템플릿 프로젝트"가 깨끗한 빌드(테스트 통과등) 라는 것을 CI를 통해 확인이 가능하지만 archetype 을 넥서스
에 배포하는 방법을 찾지 못하고 있습니다.

혹 이 문제에 대한 경험을 가지신 분들계신가요???

어제 오늘 날이 차네요. 건강유념하세요!


양완수

unread,
Mar 16, 2011, 12:21:29 AM3/16/11
to Korea Spring User Group

심상호

unread,
Mar 17, 2011, 12:48:22 AM3/17/11
to ks...@googlegroups.com
Maven Archetype은 archetype-catalog.xml 파일로부터 읽어올 수 있습니다.
기본적으로 local, remote에 있는 archetype-catalog.xml 파일을 읽어옵니다.
(local은 settings.localRepository/archetype-catalog.xml,
또한 local, remote가 아닌 archetype-catalog.xml을 지정하여 generate할 수 있습니다.
 
기본적으로 archetype project를 작성하여 install할 경우 local에 있는 archetype-catalog.xml에는 추가가 됩니다. 하지만 이 경우 다른 PC에서는 사용할 수 없습니다. 따라서 remote에 deploy해야 하는데 일반적으로 내부 프로젝트의 경우 Open Source가 아니기 때문에 공개 Repository에 deploy하지는 않습니다. 양완수 님의 경우처럼 회사 내부 Repository(Nexus 등)에 배포하게 됩니다. (사실 Maven2 repository에 뭔가 deploy해본적이 없네요. -_ -;)
 
즉, 앞서 말씀드린것 처럼 remote(Maven2)가 아닌 내부 Repository에 배포하는 경우 내부 Repository용 archetype-catalog.xml 파일과 generate시 그 파일을 지정할 수 있어야 합니다.
 
1. Nexus용 Archetype Plugin
Nexus Plugin으로 archetype project를 deploy할 경우 해당 repository에 대한 archetype-catalog.xml을 자동으로 생성해주는 plugin이 있습니다.(아마 Nexus 홈페이지에서 찾으실 수 있을겁니다.)
 
2. archetype-catalog.xml 지정
Command Line으로 Maven을 사용하실 경우 생성된 archetype-catalog.xml URL을 지정하시면 되고,
Eclipse m2eclipse Plugin을 사용하시는 경우 Preferences/Mavan/Archetypes 에서 해당 Repository의 archetype-catalog.xml 파일을 추가하시면 됩니다.
 
* 저도 예전에 해본걸 기반으로 잠시 찾아보고 답변드리는거라 맞는건지는 확신이 서질 않네요.

양완수

unread,
Mar 24, 2011, 10:52:56 PM3/24/11
to Korea Spring User Group
심상호님 답변 감사 드립니다.

archetype을 로컬레파지토리가 아닌 사내 레파지토리를 통해 배포하고 이를 지속적인 통합 하기위해서는 archetype 에대
한 테스트가 진행이 되어야 된다고 생각이 됩니다.

테스트를 위해서는 탬플릿 프로젝트를 통한 archetype 생성은 필수라고 생각이 듭니다.
이 탬플릿 프로젝트를 CI 하고 테스트 통과 시 org.apache.maven.plugin:archetype:create-
from-project 을 통해 사내 레파지토리 nexus 에 반영 하려고 하는데 그것이 생각 처럼 쉽지가 않군요 ㅜㅜ

심상호 작성:

심상호

unread,
Mar 24, 2011, 11:40:40 PM3/24/11
to ks...@googlegroups.com
archetype:create-from-project 는 Template Project를 사용하여 Archetype Project를 생성하는 Goal 입니다.
 
Archetype 자체도 Maven Project 이기 때문에 deploy:deploy 로 Nexus에 배포해야 합니다.

wansu yang

unread,
Mar 25, 2011, 2:22:08 AM3/25/11
to ks...@googlegroups.com
내 맞습니다.

문제는 다음과 같은 시나리오시 나타나는데요

일단 템플릿 프로젝트를 허드슨에서 관리합니다.  
허드슨에서 잡을 하나 잡는데 이는 테스트를 하기 위한  Job 입니다.

또 하나의 잡을 생성하는데 이는 템플릿 프로젝트로 부터 create-from-project 의 Job 입니다.

후자 잡에서 생성되는 archetype을 deploy 할때 발생하는데요..

템플릿 프로젝트에서  create-from-project 을 하게 되면 만들어지는 결과물은 ${project.build.directory}/generated-sources/archetype 에 떨어지게 됩니다.
이 때 생성된 아키타입에 대해서 ${project.build.directory}/generated-sources/archetype 을 베이스로 한 단계나 골을 실행할 수 있는데요 기본은 pacakge 인것 같습니다.

그래서 말씀하신 바와 같이 deploy 를 하게 되면
     clean archetype:create-from-project -Darchetype.postPhase=deploy

 distributionManagement 을 정의하란 소리가 튀어나옵니다.

<distributionManagement>
  <!-- use the following if you're not using a snapshot version. -->
  <repository>
    <id>repo</id>
    <name>Repository Name</name>
    <url>scp://host/path/to/repo</url>
  </repository>
  <!-- use the following if you ARE using a snapshot version. -->
  <snapshotRepository>
    <id>repo</id>
    <name>Repository Name</name>
    <url>scp://host/path/to/repo</url>
  </snapshotRepository>
</distributionManagement>


결국 create-from-project 를 통해 생성되는 ${project.build.directory}/generated-sources/archetype/pom.xml 은 직접 정의하는 곳이 아니기 때문에 <distributionManagement> 을 포함할 수는 없는거죠..
이곳의 정의에 손을 댈수 있는 방법을 찾지 못했습니다.

그래서 settings.xml 에  profile 으로 넣고 사용할려했지만
 "Error reading settings.xml: Unrecognised tag: 'distributionManagement'" 라면서 정의 할 수 없는것 같습니다.



2011년 3월 25일 오후 12:40, 심상호 <shs...@crossent.com>님의 말:
archetype:create-from-project 는 Template Project를 사용하여 Archetype Project를 생성하는 Goal 입니다.
 
Archetype 자체도 Maven Project 이기 때문에 deploy:deploy 로 Nexus에 배포해야 합니다.

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.



--
===========================================================

 안녕하세요! 양완수 입니다.
+HP      : 010 2008 4167
+Email  : ywsa...@gmail.com , yang...@daumsoft.com
+
===========================================================

심상호

unread,
Mar 25, 2011, 5:34:04 AM3/25/11
to ks...@googlegroups.com
<distributionManagement> 대신에 deploy Goal에 'altDeploymentRepository' parameter 로 지정할 수 있다고 되어 있네요.
 
-DaltDeploymentRepository=id::layout::url 형식으로 쓰라고 되어 있는데, Eclipse의 m2eclipse로 테스트해보니 'archetype.postPhase', 'altDeploymentRepository' 를 따로 지정하면 되지 않고
 
Parameter Name : archetype.postPhase
Value : deploy -DaltDeploymentRepository=<id>::<layout>::<url>
 
이렇게 하니 deploy Goal까지 altDeploymentRepository parameter가 전달이 되네요.
 
*<id>, <layout>, <url> 은 deploy할 repository 설정
 
테스트해보니 권한 문제가 있는지 401 에러가 뜨는데, 일단 해당 repository에 deploy를 시도는 하는 듯 합니다.
 

wansu yang

unread,
Mar 25, 2011, 6:04:19 AM3/25/11
to ks...@googlegroups.com
내 저도 이렇게 해보았습니다.

archetype:create-from-project -Darchetype.postPhase="clean deploy  -DaltDeploymentRepository=snapshots::default::[url]"

settings.xml 에 서버대한 유저네임  패스워드 설정한 상태입니다. 

전 아래와 같이 안되는 군요 ㅜㅜ

Failed to configure plugin parameters for: org.apache.maven.plugins:maven-deploy-plugin:2.4

check that the following section of the pom.xml is present and correct:

<distributionManagement>
  <!-- use the following if you're not using a snapshot version. -->
  <repository>
    <id>repo</id>
    <name>Repository Name</name>
    <url>scp://host/path/to/repo</url>
  </repository>
  <!-- use the following if you ARE using a snapshot version. -->
  <snapshotRepository>
    <id>repo</id>
    <name>Repository Name</name>
    <url>scp://host/path/to/repo</url>
  </snapshotRepository>
</distributionManagement>

Cause: Class 'org.apache.maven.artifact.repository.ArtifactRepository' cannot be instantiated

헌데 전 
2011년 3월 25일 오후 6:34, 심상호 <shs...@crossent.com>님의 말:
 

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.

심상호

unread,
Mar 27, 2011, 9:10:02 PM3/27/11
to ks...@googlegroups.com
mvn.bat archetype:create-from-project -Darchetype.postPhase="clean deploy -DaltDeploymentRepository=[id]::default::[url]"
 
이렇게 해서 정상적으로 deploy되는걸 방금 확인했습니다.
제가 사용한 deploy Plugin 버전은 2.5입니다.
 
혹시 오타나 빠진게 있는지 확인해보시기 바랍니다. 일단은 가능한 것으로 보입니다.
 
* [id]에 해당하는 <server> 정보가 없는 경우 401 Error가 뜨고
* snapshot 버전을 release repository에 deploy하려고 하니 400 Error가 뜹니다.

wansu yang

unread,
Mar 27, 2011, 10:09:38 PM3/27/11
to ks...@googlegroups.com
심상호님 감사합니다. ㅜㅜ

2.5에서 버그가 픽스 되었더군요...

그런데 궁금한게 super pom 에 deploy 가 2.4로 되었는데 어떻게 2.5로 적용하셨는지요???

 

2011년 3월 28일 오전 10:10, 심상호 <shs...@crossent.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.

wansu yang

unread,
Mar 27, 2011, 10:16:51 PM3/27/11
to ks...@googlegroups.com
archetype:create-from-project -Darchetype.postPhase="clean package org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy -e -DaltDeploymentRepository=[id]::default::[url]"

요렇게 했더니 잘되네요 ^^ 



2011/3/28 wansu yang <ywsa...@gmail.com>

심상호

unread,
Mar 27, 2011, 10:46:42 PM3/27/11
to ks...@googlegroups.com
네. 축하드립니다. ^-^
전 deploy plugin을 별도로 설정을 안했더니 default로 최신인 2.5가 잡힌 듯 싶네요. ^-^;;;
 
저도 조만간 archetype 만들고 배포해야 해서 미리 해본다고 했는데 개인적으로도 도움이 될 것 같습니다. ^-^
Reply all
Reply to author
Forward
0 new messages