Whiteship's Note


Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?

Build/Maven : 2008.03.03 19:03


그런데 요즘, Maven과 JIA, Confluence, Bamboo, Clover, FishEye를 사용해서 Continuous Integration을 하면서 매우 재밌는 일들(주로 Maven과 관련된)이 많이 발생하고 있습니다. 그 중 방금전에 있었던 Maven과 관련된 매우 따끈따끈한 이슈 하나를 소개해 드리고자 합니다.

프로젝트 라이브러리들 간의 종속성을 "Out of 안중"까지는 아니더라도.. 아~주 편하게 쓰려고 Maven을 공부하기 시작했었습니다. 그런데...

잘~ 돌던 빌드가 실패했다는 이메일이 저에게 날아왔습니다. 구글토크를 항상 켜두는 저는 Bamboo에서 빌드 결과를 매번 메일로 보내도록 설정해 두었기 때문에, 금방 알 수 있었습니다. 그리고 누가 작업을 한 것인지가 바로 이메일 제목에 나와있습니다. 정말 사용자가 원하는 정보를 원하는 위치에 보여주는 Atlasian의 Considerable Email(이런 용어 없습니다. 그냥 제가 붙인겁니다.)에 놀라지 않을 수가 없었습니다.

Anyway, 왜 빌드에 실패했는지 보기 위해 로그를 봤습니다. 빌드 과정을 Bamboo가 그대로 로깅 해두고, 보여주기 때문에 에러 메시지를 금방 확인할 수 있었습니다.

빌드 실패의 원인은 컴파일 실패. 컴파일 실패시 발생한 에러는

cannot find symbol: ClassUtils.

ClassUtils는 스프링에서 제공하는 수 많은 유틸성 클래스들(언제 한 번 싹다 정리하려고 합니다.) 중에 하나입니다.

ClassNotFound도 아니고..이게 무슨 에러인가 생각해보면서, 자바 기초가 이리도 없는가 하는 생각에 잠기기 시작하면서 구글에서 저 에러 메시지로 검색해서 어떤 상황에 발생할 수 있는지도 대강 살펴봤지만.. 그리.. 도움이 되는 메시지는 못봤습니다.

이 빌드 전에는 빌드가 성공했는데, 이번 빌드가 실패했다.

그럼 문제는 이번에 어떤 수정 사항으로 인한 것인데, 어떤 수정이 있었는지도 Bamboo에서 확인할 수 있습니다. (글을 쓰다보니 이게 Maven 이슈 글인지, Bamboo 마케팅 글인지 점점 햇갈리네요.) 암튼 거길 보니까 pom.xml밖에 없습니다.

pom.xml을 보니까, spring-security 라이브러리가 추가되었습니다. 그래.. 문제는 여기 있을꺼다. 라고 거의 확신을 하고, 이전에도 Maven 종속성 출동 문제 때문에, 일일히 라이브러리르 뒤져본적이 있었기 때문에, 이번에는 그나마 좀 수월하게, spring-security의 pom.xml 파일을 찾을 수 있었습니다.

그 파일을 열어보니, spring을 모듈별로 가져와서 사용하고 있는데, 버전도 명시가 되어 있지 않고, 이미 이 프로젝트에 추가되어 있는 라이브러리들도 중복해서 가져오고 있었습니다. 그것만 보고는 100% 확신할 수는 없었지만. 대략 정리가 되었습니다.

ClassUtils가 이미 있는데, spring-secutiry가 또 가져오고(spring-support 모듈에서), 그래서 두 개의 다른 버전의 클래스가 존재하는데 이 둘 중에 뭘 써야 할지 모르니까. Cannot find symbol 이군..

그래서 현 프로젝트의 pom.xml을 수정해서 spring-security를 가져올 때, 이미 프로젝트에 존재하는 라이브러리들은 가져오지 않도록 설정을 해주었습니다. 비록 이 작업이 한 문장으로 표현이 되긴 하지만, 결코 엘레강트한 작업은 아닙니다.

1. 일일히 어떤 라이브러리들을 가져오는지 pom.xml에서 확인하고, 현재 프로젝트의 pom.xml에 존재한 녀석인지 확인하고, 있으면 빼줍니다. exclunsion 엘리먼트를 사용합니다.

2. 현 프로젝트의 pom.xml에 없는 라이브러리인데, spring의 pom.xml에 optional로 등록되어 있다. 그럼 그 중에 버전이 높은 녀석을 등록해줍니다.

3. 현 프로젝트의 pom.xml에 없는 라이브러리이고, spring의 pom.xml에 optional로도 등록되어 있지 않다. 그러면 추가합니다. 추가할 때는 별도의 코드를 적을 필요는 없습니다. 다만 주석으로 어떤 라이브러리가 추가되는지 적어두면 나중에 용이하겠죠.

자.. 이 정도되면, 제목에 대한 답은 안해도 되겠죠?
top


Archetype 만들기

Build/Maven : 2007.12.21 11:49


참조 : http://sonatype.com/book/archetypes.html#creating_your_own_archetypes

새로운 프로젝트 구조를 만들고 싶을 때 사용합니다.

1. 프로젝트 생성

mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes
                     -DarchetypeArtifactId=maven-archetype-archetype
                     -DarchetypeVersion=1.0
                     -DgroupId=com.mycompany
                     -DartifactId=my-archetype

2. pom.xml 파일 수정하기

이곳에서 기본 소스 디렉터리 설정, 기본으로 사용할 의존성들을 설정합니다.

3. src/main/resources/META-INF/maven/archetype.xml 파일 작성하기

특정 파일을 리소스로 등록하는 xml 파일 인듯 합니다.
<archetype>
  <id>my-archetype</id>
  <allowPartial>true</allowPartial>
  <resources>
    <resource>src/main/resources/META-INF/MANIFEST.MF</resource>
  </resources>
</archetype>

토비님께서 이 파일을 자동으로 만들어주는 애플리케이션을 만들어 두셨습니다.
Maven archetype 설정파일 자동생성기 - ArchetypeXmlWriter

4. 설치

mvn install

5. 새로운 아치타입으로 프로젝트 생성하기

mvn archetype:create -DarchetypeGroupId=com.mycompany \
                     -DarchetypeArtifactId=my-archetype \
                     -DarchetypeVersion=1.0-SNAPSHOT
                     -DgroupId=com.mycompany \
                     -DartifactId=my-project \


'Build > Maven' 카테고리의 다른 글

이클립스용 Maven 플러그인 Q4E  (10) 2008.04.18
기본적인 managed dependency 사용법  (2) 2008.04.17
Managed Depedency 네 녀석의 정체를 드디어 알았다.  (0) 2008.04.17
Managed dependency는 무슨 뜻인가요?  (0) 2008.04.14
Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?  (2) 2008.03.03
Archetype 만들기  (4) 2007.12.21
Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
top


Assemblies

Build/Maven : 2007.12.04 23:37


maven-assembly-plugin 플러그인은 프로젝트를 특정 파일로 묶을 때 사용할 수 있습니다.

이 플러그인은 다음의 7개의 goal을 제공합니다.
assembly
attached
directory
directory-inline
single
directory-single
unpack

가장 간단하게 이 플러그인을 사용하는 방법은 미리 정의되어 있는 타입으로 패키징을 하는 것입니다. 제가 참조하는 문서가 작성되는 시점에서 다음과 4가지 타입으로 묶을 수 있습니다.
  • bin : 프로젝트 base 폴더 위치한 README*, LICENSE*, NOTICE* 파일들을 묶어줍니다.
  • src : 프로젝트의 src 폴더에 위치한 모든 파일과 README*, LICENSE*, NOTICE*, pom.xml 파일들을 묶어줍니다.
  • project : 프로젝트의 target 디렉터리와 CVC>> 나 <<.svn과 같은 파일들을 제외한 모든 파일을 묶어줍니다.
  • jar-with-dependencies : Explodes all dependencies of this project and packages the exploded forms into a jar along with the project's outputDirectory. Note that this default assembly descriptor only creates a jar, not the three zip types.
묶기를 수행하는 방법은 두 가지 입니다. 커맨드 창에서 assembly:assembly 골을 실행할 때 명령을 -DdescriptorId 인자를 주는 방법을 사용하거나...

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

묶을 프로젝트의 POM의 configuration 엘리먼트를 다음과 같이 설정합니다.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
            <descriptorRef>src</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

물론 위와 같이 이미 정의되어 있는 묶기 방식을 사용해도 되지만, 이것도 역시 커스터마이징 할 수 있습니다. 그 방법은.. 밤이 깊어져가는 관계로.. 나중에 봐야겠네요.

'Build > Maven' 카테고리의 다른 글

기본적인 managed dependency 사용법  (2) 2008.04.17
Managed Depedency 네 녀석의 정체를 드디어 알았다.  (0) 2008.04.17
Managed dependency는 무슨 뜻인가요?  (0) 2008.04.14
Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?  (2) 2008.03.03
Archetype 만들기  (4) 2007.12.21
Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
top


Maven 괜찮은데~

Build/Maven : 2007.12.04 13:37


Maven을 거의 초딩 수준으로 사용하고 있는데도 벌써부터 장점이 나타나고 있습니다.
사용자 삽입 이미지
위에 보이는 Jar 파일들은 매우 간단한 Spring 기반 ActiveMQ JMS 애플리케이션을 돌려보기 위해 필요한 의존성들입니다.

제가 이 프로젝트를 구성할 때 신경 쓴 것은 그림에 표시되어있는 단 4개의 파일에 대한 의존성입니다. 그 파일들이 어떤 프로젝트에 종속적인지(추이적 종송성)조차 다 알아내기란 상당히 귀찮은 일이며 짜증나는 일일 수 밖에 없습니다.(물론 spring이 commons-logging을 사용한다는 것은 방금 언급한 짜증나는 경험을 통해 머리속에 박혀서 알고있지만 말이죠.)

단 네 개의 의존성만 알면, 나머진 Maven이 알아서 가져옵니다. 의존성을 추가하는 일도 어렵지 않습니다. Jar 파일을 가지고 있는 프로젝트를 일일히 다운로드 받고 압축을 풀고 라이브러리 찾고(보통은 lib 폴더, 스프링은 dist 폴더) 복사해서 붙여넣으면 되겠지만.. Maven을 사용할 때는 http://mvnrepository.com/ 이 곳에서 원하는 프로젝트를 검색한 다음 <dependency> 엘리먼트를 찾아낸 다음 복사해서 POM에 붙여넣으면 됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>ActiveMQTest</groupId>
    <artifactId>ActiveMQTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description></description>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>
</project>

공부하는데 시간은 좀 오래 걸리고 있지만, 벌써부터 수확이 생기다니 기쁩니다. 공부할 수록 더 많은 수확이 있으리라 예상해봅니다.

'Build > Maven' 카테고리의 다른 글

Managed Depedency 네 녀석의 정체를 드디어 알았다.  (0) 2008.04.17
Managed dependency는 무슨 뜻인가요?  (0) 2008.04.14
Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?  (2) 2008.03.03
Archetype 만들기  (4) 2007.12.21
Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
top


Site Generation

Build/Maven : 2007.12.03 20:57


Maven이 프로젝트 웹 사이트 관리에 주는 장점.
  • 프로젝트 상태 리포트와 그 밖에 코드와 관련된 문서를 작성해 준다.
  • 웹 사이트 네비게이션 엘리먼트 관리
  • 소스-문서 포맷으로 웹 사이트 컨텐츠 랜더링
  • XHTML이나 PDF와 같이 다양한 형태로 컨텐츠로  배포 가능
  • 프로젝트 바이너리 파일에 포함시킬 포터블한 문서 생성.
mvn site:run

위 명령을 실행한 뒤, http://localhost:8080 으로 접속하면 Maven이 생성해주는 프로젝트 웹 사이트를 볼 수 있습니다.

사용자 또는 개발자들이 프로젝트 웹 사이트에서 참조하고자 하는 정보는 다음과 같습니다.
  • feature lists
  • screenshots of the application in action
  • project news and release changelogs
  • downloads for released distributions
  • installation instructions
  • usage and configuration how-to's
  • architectural diagrams
  • frequently asked questions
  • forums
프로젝트 사이트 구성은 다음의 순서대로 합니다.
  1. site 서술자 작성하여 웹 사이트의 메뉴 구성하기.(src/site 디렉터리에 site.xml 파일을 작성합니다.)
  2. Maven이 제공하는 형식으로 프로젝트 문서 작성하기.(src/site 하위에 문서 형식에 따라 디렉토리를 구성하고, 그 밑에 파일들을 위치합니다. )
  3. 웹 사이트 배포하기.(mvn clean site-deploy )
웹 사이트 배포할 서버 설정은 settings.xml에서 합니다.

프로젝트 웹 사이트 튜닝
- css 파일은 src/site/resources/css/site.css 작성.
- 템플릿 구성은 벨로서티 파일


'Build > Maven' 카테고리의 다른 글

Managed dependency는 무슨 뜻인가요?  (0) 2008.04.14
Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?  (2) 2008.03.03
Archetype 만들기  (4) 2007.12.21
Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
top

TAG maven, site

http://mvnrepository.com/

Build/Maven : 2007.12.02 11:20


이 사이트는 Maven으로 종속성을 관리할 때 필수 사이트 인 것 같습니다. 외울 수가 없어서 블로그에 게시해둡니다. 사용하는 방법은 박재성님의 블로그의 "Maven을 이용하여 Dependency 라이브러리 관리 방법"에 잘 설명되어 있습니다. 진작에 박재성님 블로그를 보면서 공부하면 좀 더 빨랐을 것을 한글로 된 문서가 없는 줄 알고 영어로 공부하느라 고생했네요. ㅜ.ㅜ

Anyway, Maven을 사용하다보면, 종속성을 추가해야하는데, Jar 파일 다운 받아서 추가하는 것보다는 훨씬 간단하고 하나의 Jar 파일을 여러 프로젝트에서 복사해서 가지고 있지 않아도 되기 때문에, workspace의 용량이 기하급수적으로 늘어나는 것을 방지할 수도 있습니다.

종속성을 추가하기 위해서는

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
        </dependency>

이런 식으로 Maven Repository에 등록되어 있는 프로젝트의 groupId, artifactId, version을 알아야 합니다. 그런데 위의 사이트에 바로 이러한 정보들을 알 수 있습니다. 매우 친절하게 <dependencies> 엘리먼트 안에 어떠한 엘리먼트 묶음(위에 보이는 것과 같은)을 붙여 넣으면 되는지 보여줍니다. 귿이죠.

Eclipse에 Maven 플러그인을 설치해서 add Dependecy 메뉴를 사용하면 검색이 되긴 하지만, 제 경우에 Spring 2.5는 검색이 되질 않았습니다. 따라서 위 사이트에서 찾아서 등록해주었습니다. 하지만 한 번 Local Repository에 다운 받은 다음에 Maven 플러그인의 add Dependecy 메뉴를 사용해보니, Spring 2.5가 검색 되었습니다. 아마도.. Local Repository에서만 검색해주는 기능인가 봅니다.

'Build > Maven' 카테고리의 다른 글

Maven을 쓴다고 해서 종속성을 안중에서 Out 시킬 수 있느냐?  (2) 2008.03.03
Archetype 만들기  (4) 2007.12.21
Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
top


Profile

Build/Maven : 2007.11.30 13:12


Maven에 있는 Profile의 주 목적은 서로 다른 빌드 환경간의 portability입니다. 개발 환경, 테스트 환경, 성능 테스트 환경, 클라이언트 환경 등 상상할 수 있는 모든 환경에 단일 프로젝트를 이식할 수 있도록 합니다.

Portability 종류

Non-Portability

이런 프로젝트는 오직 특정한 환경에서만 빌드를 할 수 있습니다. 프로젝트를 다른 환경으로 이식할 계획이 없다면 그냥 이렇게 사용해도 상관없습니다.

Environmental Protability

테스트 환경에서는 테스트 데이터베에스를 참조하고, 배고 환경에서는 배포용 데이터베이스를 참조할 수 있는 프로젝트입니다. 하지만 프로파일이 만들어져이지 않은 환경으로 이식한다면, 해당 프로젝트는 동작하지 않을 것입니다. 따라서 오직 정의되어 있는 환경으로만 이식할 수 있습니다.

In-House Portability

특정한 도구나 연결 접근이 필요한 프로젝트를 말합니다.

Wide Portability

Maven에서는 wide portability 프로젝트 소스를 누구나 다운받을 수 있습니다. 프로젝트를 빌드하려는 사람이 어떠한 추가작업도 필요로하지 않을때 Wide Portablilty 프롤젝트라고 합니다. 예를 들어, MySQL을 사용한다면, 해당 프로젝트를 빌드 할 때 MySQL이 없는 사람은 설치를 해야합니다. 이런 프로젝트는 Wide Protability를 가졌다고 할 수 없습니다. 반면에, HSQLDB를 사용한다면, hsql.jar 종속성을 추가하면 되기떄문에 widely protable합니다.

가능하면 프로젝트를 최대한 이식성이 좋도록하는 것이 목적입니다. 이식성이 넓어질 수록 빌드 작업을 하는 사람의 수고를 덜 수 있습니다. Maven의 Profile은 특정 환경의 기본 값이 설정 값들을 대체할 수 있습니다. Maven을 사용하면, Non-portable 프로젝트를 Environmentally portable 프로젝트로 변경시킬 수 있습니다.

POM Profiles

project 엘리먼트 내부에 profiles 엘리먼트 안에 모든 가용한 설정들을 합니다. 그 안에서 설정할 수 있는 엘리먼트들은 project 엘리먼트 레벨에서 사용할 수 있는 것들과 동일합니다.

<project>
  ...
  <profiles>
    <profile>
      ...
      <reporting>...</reporting>
      <modules>...</modules>
      <dependencies>...</dependencies>
      <dependencyManagement>...</dependencyManagement>
      <distributionManagement>...</distributionManagement>
      <repositories>...</repositories>
      <pluginRepositories>...</pluginRepositories>
      <properties>...</properties>
    </profile>
  </profiles>
</project>

Activation

activation 엘리먼트는 오직 profile 엘리먼트 내부에서만 사용할 수 있으며, 이 엘리먼트에 정의한 환경과 실행 환경이 일치하면 profile에 설정한 값들이 project에 설정한 값들을 대체합니다.

<project>
  ...
  <profiles>
    <profile>
      <id>dev</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>mavenVersion</name>
          <value>2.0.5</value>
        </property>
        <file>
          <exists>file2.properties</exists>
          <missing>file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
</project>

Build

profile의 build 엘리먼트는 POM의 build 엘리먼트의 서브셋에 해당하는 정보를 가지고 있습니다.

<project>
  ...
  <profiles>
    <profile>
      <build>
        <defaultGoal>install</defaultGoal>
        <directory>${basedir}/target</directory>
        <finalName>${artifactId}-${version}</finalName>
        <filters>
          <filter>filters/filter1.properties</filter>
        </filters>
        <resources>
          <resource>
            <targetPath>META-INF/plexus</targetPath>
            <filtering>false</filtering>
            <directory>${basedir}/src/main/plexus</directory>
            <includes>
              <include>configuration.xml</include>
            </includes>
            <excludes>
              <exclude>**/*.properties</exclude>
            </excludes>
          </resource>
        </resources>
        <testResources>
          <testResource>...</testResource>
        </testResources>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.1</version>
            <extensions>false</extensions>
            <inherited>true</inherited>
            <configuration>
              <sourceRoot>${project.build.directory}/generated-sources</sourceRoot>
            </configuration>
            <dependencies>
              <dependency>
                <groupId>ant</groupId>
                <artifactId>ant-optional</artifactId>
                <version>1.5.2</version>
              </dependency>
            </dependencies>
            <executions>
              <execution>
                <id>echodir</id>
                <goals>
                  <goal>run</goal>
                </goals>
                <phase>verify</phase>
                <inherited>false</inherited>
                <configuration>
                  <tasks>
                    <echo>Build Dir: ${project.build.directory}</echo>
                  </tasks>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
        <pluginManagement>
          <plugins>...</plugins>
        </pluginManagement>
      </build>
    </profile>
  </profiles>
</project>

External Profiles

proflie들을 POM에서 빼내고 싶을 수 있습니다. 이럴 때는 \${basedir}에 profilesxml을 생성하고 그 안에 profiles 엘리먼트를 넣어주면 됩니다.

Settings Profiles

settings.xml에서도 profile을 설정할 수 있는데, 이 것은 project의 profile과 기능은 같으나, project의 profile은 여러 시스템들 중에 특정한 설정 값을 overriding 할 때 사용하고, settings의 profile은 모든 시스템 통채를 대상으로 합니다.

activeProfiles 엘리먼트를 사용하여 모든 빌드에서 자동으로 동작시킬 profile을 지정할 수 있습니다. 물론 이때의 profile은 project의 profile이 아니라 settings의 profile입니다.

<settings>
  ...
  <activeProfiles>
    <activeProfile>dev</activeProfile>
  </activeProfiles>
</settings>


어렵네요. -_-;;

'Build > Maven' 카테고리의 다른 글

Archetype 만들기  (4) 2007.12.21
Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
top

TAG maven, profile

Archetype

Build/Maven : 2007.11.29 14:21


Archetype은 한국어로 원형(prototype), 전형과 같은 뜻이라고 네이버 사전이 알려줬습니다. Maven에서도 그와 비슷하게 프로젝트의 기본 레이아웃 구조를 생성할 때 사용할 템플릿으로 사용하고 있습니다. RoR의 scaffold랑 비슷한 것 같네요.

archetype:create Goal을 실행하면 다음과 같은 구조의 기본 Archetype을 만들어 줍니다. 이것을 quickstart라고 하며, Hello World 를 출력하는 자바 코드를 가지고 있습니다.

mvn archetype:create -DgroupId=com.mycompany -DartifactId=my-proj

my-proj
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- AppTest.java

이런 프로젝트 구조를 만들어 낸 기반은 META-INF/maven/archetype.xml 리소스 정의 파일과 src/main/resources/archetype-resources 디렉터리 밑에 위치한 Archetype 리소스 파일들 입니다.

maven-quickstart-archetype
|-- pom.xml
`-- src
    `-- main
        `-- resources
            |-- META-INF
            |   `-- maven
            |       `-- archetype.xml
            `-- archetype-resources
                |-- pom.xml
                `-- src
                    |-- main
                    |   `-- java
                    |       `-- App.java
                    `-- test
                        `-- java
                            `-- AppTest.java

Maven에서 가용한 Archetype들은 http://repo1.maven.org/maven2/org/apache/maven/archetypes/ 에서 확인할 수 있습니다.
사용자 삽입 이미지
위에있는 Atchetype 중에서 맘에 드는 것이 없거나, 자신이 자주 사용하는 프로젝트 템플릿이 있다면 그것을 mvn install로 등록하여 사용할 수도 있습니다. 자세한 내용은 http://sonatype.com/book/archetypes.html
위 글의 후반부에는 사용자 정의 archetype 구성에 대하 나왔습니다.

'Build > Maven' 카테고리의 다른 글

Assemblies  (0) 2007.12.04
Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
top


Plugin

Build/Maven : 2007.11.28 10:54


플러그인 역시 Maven의 핵심 요소로 Goal이라는 실행 단위들을 집합으로 구성되어 있습니다. 플러그인은 새로운 패키징 타입을 도입하여 빌드 라이프사이클을 만들어낼 수도 있습니다.

플러그인 이름 살펴보기

여태까지 사용했었던 clean:clean 이라는 Goal은 실제로는 org.apache.maven.plugins:maven-clean-plugin:clean 이었습니다. 특정 버전의 플러그인을 사용하기 위해 다음과 같이 버전을 명시할 수도 있습니다. org.apache.maven.plugins:maven-clean-plugin:2.1.1:clean

위 Goal의 맨 앞의 값 org.apache.maven은 groupId로 기본값이 org.apache.maven입니다.

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>

따라서 플러그인을 등록할 때도 groupId가 빠져있는데, 기본으로 org.apache.maven.plugins 와 org.codehaus.mojo 는 생략해도 됩니다. 생략해도 되는 groupId를 추가하고 싶다면, settings.xml 의 pluginGroups 엘리먼트에 다음과 같이 추가해주면 됩니다.

<settings>
  ...
  <pluginGroups>
    <pluginGroup>com.training.plugins</pluginGroup>
  </pluginGroups>
</settings>

=> mvn maven-zip-plugin:zip
이제 위와 같이 사용할 수 있습니다.

중간에 위치한 플러그인 이름은 <<<maven-${name}-plugin>> 이런 형식이거나 ${name}-maven-plugin 이기 때문에 컨벤션에 따라 플러그인을 찾습니다. 따라서 다음과 같이 플러그인 이름도 줄여서 사용할 수 있습니.다

=> mvn zip:zip

플러그인 설정하기

플러그인 정보를 build 엘리먼트의 plugins 목록에 넣어줍니다. 그리고 각각의 플러그인이 필요로 하는 기본 설정을 해줍니다. 이 부분이 다소 복잡할 수 있지만 CoC에 입각하여 기본 설정 값들을 사용할 수 있습니다. 특정 Goal들은 기본적으로 빌드 라이프사이클의 특정 Phase과 연관을 맺게 됩니다. 하지만 이런 기본 설정을 변경할 수도 있습니다.
  • 이미 라이프사이클의 일부로 등록되어 있는 플러그인이나 특정 Goal을 설정하기
  • 라이프사이클에 등록되어 있지 않은 플러그인이나 특정 Goal을 설정하기
  • 라이프사이클의 일부로 특정 Goal을 추가하고 설정하기
  • 플러그인 종속성 목록 변경하기
  • 플러그인 확장기능을 빌드 클래스로더에 추가하기
위에서 세 번째 까지는 plugin 엘리먼트의 configuration 엘리먼트를 사용하며, 나머지는 다른 것을 사용합니다. 다음은 complie 플러그인의 기본 값을 JDK 1.4로 변경하는 설정입니다.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.4</source>
          <target>1.4</target>
        </configuration>
      </plugin>

특정 Goal의 설정을 변경하고 싶다면, 다음과 같이 execution 엘리먼트 안에서 하나의 Goal과 그것의 설정을 변경할 수 있습니다.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <source>1.4</source>
              <target>1.4</target>
            </configuration>
          </execution>
        </executions>
      </plugin>

빌드 라이프사이클에 등록되어 있지않은 플러그인을 설정하는 방법은 다음과 같습니다.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <configuration>
          <tasks>
            <echo>The JAVA_HOME var is ${env.JAVA_HOME}</echo>
          </tasks>
        </configuration>
      </plugin>

이렇게 하면, 이 Goal을 실행시키기 위해서 mvn antrun:run 을 실행해야 합니다. 특정 Phase에 연과시키기 위해서드는 다음과 같이 설정해 줍니다.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <configuration>
          <tasks>
            <echo>The JAVA_HOME var is ${env.JAVA_HOME}</echo>
          </tasks>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>run</goal>
            </goals>
            <phase>verify</phase>
          </execution>
        </executions>
      </plugin>



'Build > Maven' 카테고리의 다른 글

Maven 괜찮은데~  (0) 2007.12.04
Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
top

TAG maven, plugin

Build Lifecycle(site)

Build/Maven : 2007.11.27 12:16


site

지금까지 생성된 파일(구조물 artifact)을 저장소에 빌드하고 위치시키는 과정에 대해 살펴봤습니다. 그러나 Maven은 단순히 코드를 생성하는 것보다 뭔가를 더 해줍니다, 프로젝트에 대한 리포트나 다큐먼트를 생성해주기도 합니다. 그런 일들을 해주는 site는 다음과 같은 Phase로 구성되어있습니다.

pre-site
site - site와 보고서를 생성
post-site
site-depoly - site를 원격 서버에 배포

site 라이프사이클에 묶여있는 기본 Goal은 다음과 같습니다.

site - site:site
site-deploy - site:deploy

default 빌드 라이프사이클과 다르게, 패키징 타입에 따라 달라지는 것이 없습니다. 이전에도 이 Phase를 사용해 본적이 있습니다.

mvn site

이것에 대해서는 나중에 다른 챕터에 다룹니다.

'Build > Maven' 카테고리의 다른 글

Site Generation  (0) 2007.12.03
http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
top


Build Lifecycle(default 자세히)

Build/Maven : 2007.11.27 12:11


Resources

process-resource는 간단하게, src/main/resources 디렉터리에 있는 파일들을 복사하여 target/classes 디렉터리에 복사한다고 생각할 수 있습니다. 이때, ${...}를 텍스트로 대체할 수 있는 필터를 사용할 수 있습니다.

예를들어, src/main/resources/META-INF/service.xml 이 다음과 같을 때..

<service>
  <!-- This URL was set by project version ${project.version} -->
  <url>${jdbc.url}</url>
  <user>${jdbc.username}</user>
  <password>${jdbc.password}</password>
</service>

src/main/filters/default.properties 파일에 그 값들을 외부로 빼낼 수 있습니다.

jdbc.url=jdbc:hsqldb:mem:mydb
jdbc.username=sa
jdbc.password=

이 두개의 파일을 다음과 같이 설정하여 사용할 수 있습니다.

<build>
  <filters>
    <filter>src/main/filters/default.properties</filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

POM에 프로퍼티 파일에 명시했던 값들을 설정하면, 프로퍼티 파일을 사용하지 않을 수도 있다고 합니다.

Compile

컴파일 할 자바 버전을 명시할 수 있습니다. 기본으로 JDK 1.3 호환 코드로 컴파일 것으로 가정하기 때문에, 다음과 같이 명시적으로 사용할 버전을 설정해주어야 합니다.

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

Test Resource

process-test-resource는 process-resource와 거의 같습니다. 차이가 있다면 POM에 testResources 엘리먼트 내부에 testResouce 엘리먼트로 정의해둔 Test Resource들을 target/test-classes에 복사합니다.

Test

이 Phase는 surefire:test Goal과 연관되어있습니다. Surefire는 *Test.java로 끝나는 파일들을 기본으로 실행합니다. 물론 별도로 설정할 수도 있는데, Appendix A에서 다룹니다. JUnit을 기본 테스트 프레임워크로 기대하고 있지만, TestNG를 다음과 같이 설정할 수도 있습니다.

<dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>4.7</version>
      <scope>test</scope>
      <classifier>jdk14</classifier>
</dependency>

'Build > Maven' 카테고리의 다른 글

http://mvnrepository.com/  (0) 2007.12.02
Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
top


Build Lifecycle(default)

Build/Maven : 2007.11.27 11:48


default

이 라이프사이클은 Maven의 action 프레임워크의 핵심입니다. 표준적인 빌드 절차 순으로 구성되어 있습니다.

vlidate - 프로젝트가 올바른지 그리고 필요로 하는 정보가 모두 가용한지 확인
generate-sources - 컴파일과 관련된 소스 코드 생성
process-srouces - 소스 코드 처리
generate-resources - 패키지에 포함되어 있는 리소스 생성
process-resources - 목적지로 리소스를 복사하고 처리, 패키징 준비
compile - 소스 코드 컴파일
process-classes - 컴파일 후 생성된 파일들의 전 처리.
generate-test-srouces
process-test-sources
generate-test-resources
process-test-resources
test-compile
test - 단위 테스트 프레임워크를 사용하여 테스트를 실행
prepare-package - 패키징하기 전에 필요한 작업을 수행
package - 컴파일 된 코드를 JAR와 같은 배포용 형태로 묶음
pre-integration-test - 통합 테스트에 필요한 작업 수행
integration-test - 통합 테스트를 수행할 곳에 패키지를 배포하고 실행
post-integration-test - 통합 테스트 후에 해야할 일 수행
verify - 패키지를 올바른지 검증
install - 패키지를 로컬 저장소에 설치
deploy - 최종 패키지를 원격 저장소에 복사

프로젝트의 패키징 타입에 따라 위의 Phase들에 연관되어 있는 Goal들이 다릅니다. 따라서 pom 패키징 타입인 프로젝트와 jar 패키징 프로젝트가 같은 빌드 라이프사이클을 가지고 있더라고 각각의 Phase를 실행할 때마다 하는 일이 달라집니다. 예를들어, 위의 경우 package Phase에서 pom 패키징 타입의 프로젝트는 site:attach-descriptor Goal을 실행하고, jar 패키징 타입의 프로젝트는 jar:jar를 실행합니다.

각각의 패키징 타입에 따라 연관되어있는 goal들은 다음과 같습니다.

jar :: 기본 패키징 타입.

process-resources - resources:resources
compile - compiler:compile
process-test-resources - resources:testResources
test-compile - compiler:testCompile
test - surefire:test
package - jar:jar
install - install:install
deploy - deploy:deploy

pom :: 가장 간단한 패키징 타입. 생성되는 파일은 pom 뿐. 별도의 jar나 ejb같은 패키지는 없음.

package - site:attach-descriptor
install - install:install
deploy - deploy:deploy

mvn-plugin :: 몇 가지 기술 파일들과 저장소의 데이터에 변경을 가합니다. 모든 Goal들은 플러그인에 들어있다는 것만 알고 넘어가라네요.

generate-resources - plugin:descriptor
process-resources - resources:resources
compile - compiler:compile
process-test-resources - resources:testResources
test-compile - compiler:testCompile
test - surefire:test
package - jar:jar, plugin:addPluginArtifactMetadata
install - install:install, plugin:updateRegistry
deploy - deploy:deploy

ejb :: ejb 플러그인을 필요로 합니다.

process-resources - resources:resources
compile - compiler:compile
process-test-resources - resources:testResources
test-compile - compiler:testCompile
test - surefire:test
package - ejb:ejb
install - install:install
deploy - deploy:deploy

war :: src/main/webapp/WEB-INF/ 디렉터리에 web.xml 설정 파일을 필요로 합니다.

process-resources - resources:resources
compile - compiler:compile
process-test-resources - resources:testResources
test-compile - compiler:testCompile
test - surefire:test
package - war:war
install - install:install
deploy - deploy:deploy

ear :: 배포 기술자(applicaion.xml)로 구성되어있는 간단한 Java EE 구조체. 만약 application.xml 파일이 없다면, POM 파일에 기반하여 파일을 생성해줍니다.

generate-resources - ear:generate-application-xml
process-resources - resources:resources
package - ear:ear
install - install:install
deploy - deploy:deploy

par :: 뭔지 모르겠음.

process-resources - resources:resources
compile - compiler:compile
process-test-resources - resources:testResources
test-compile - compiler:testCompile
test - surefire:test
package - par:par
install - install:install
deploy - deploy:deploy

커스텀 패키징 타입을 만들 수도 있으며, 그에대한 내용은 나중에 다룹니다. 다음에는 위에서 간단하게 살펴봤던 default Phase들을 조금만 더 들여다보겠습니다.

'Build > Maven' 카테고리의 다른 글

Profile  (0) 2007.11.30
Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
top


Build Lifecycle(clean)

Build/Maven : 2007.11.27 11:33


Maven의 기반이 되는 두 가지 요소 중에 하나를 어제 살펴봤습니다. 프로젝트 하나를 객체로 보는 POM이었죠. 그리고 오늘은 또 다른 하나 빌드 라이프사이클을 공부할 차례입니다.

빌드 라이프사이클은 "여러 개의 Goal들에 순서를 매겨둔, Phase들의 연속체"라고 할 수 있습니다. Goal들은 Phase를 실행 할 프로젝트의 패키징 타입에 따라 달라집니다.

Maven에는 세 개의 표준 라이프 사이클이 존재 합니다. clean, default(또는 build), site 가 있습니다.

clean


세 개의 Phase로 구성되어 있는 매우 간단한 라이프사이클 입니다.
pre-clean
clean
post-clean

대부분은 clean:clean Goal과 연결되어 있는 "clean" Phase를 사용합니다. SuperPOM에 기본값으로 "target"이라고 설정되어 있는 빌드 디렉터리 안에 있는 모든 파일을 삭제하는 일을 합니다. mvn clean을 실행하면, clean Phase까지 연관되어 있는 모든 Goal들을 실행합니다.

사용자 삽입 이미지
clean 플러그인을 사용할 때 특정 파일을 삭제 대상에서 제외시키거나, 특정 파일만 삭제하도록 fileSet 엘리먼트 내부에 include 엘리먼트와 exclude 엘리먼트를 사용할 수 있습니다.

<project>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-clean-plugin</artifactId>
        <configuration>
          <filesets>
            <fileset>
              <directory>othertarget</directory>
              <includes>
                <include>*.class</include>
              </includes>
            </fileset>
          </filesets>
        </configuration>
      </plugin>


'Build > Maven' 카테고리의 다른 글

Archetype  (0) 2007.11.29
Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
top


POM

Build/Maven : 2007.11.26 11:05


Maven은 두 개의 주요 개념에 기반하여 프로젝트를 관리하고 있습니다. 하나는 "Object" 또 하나는 "Tasks" 입니다. Object는 프로젝트 자체를 하나의 개체로 보겠다는 것이고 이 개념이 Ant에는 없고 단지 Task만 있습니다. Task는 Maven 용어 정리에서 살펴봤었던 Goal이나 Action 또는 Verb(Phase와 같은 뜻으로 사용하는 듯)입니다.

오늘은 위의 두 개념중에 첫 번째인 Object(프로젝트 자체를 나타내는 개체)에 대해 살펴봅니다. POM은 다음 그림과 같이 프로젝트와 관련된 모든 정보를 담고 있습니다. 프로젝트 하나 당 POM 파일 하나가 존재합니다.
사용자 삽입 이미지
물론 Maven에서는 프로젝트와 관련된 정보 외에도 추가로 필요한 정보(빌드 서버의 인증 정보와 같은)가 있기 때문에 settings.xml 이라는 파일도 존재합니다. 하지만 일단은 POM만 집중해서 살펴보겠습니다.

다음은 참조 문서에 있는 예제 POM 파일입니다.

<project>
  <modelVersion>4.0.0</modelVersion>
 
<parent>
    <groupId>com.training.killerapp</groupId>
    <artifactId>killerapp</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>killerapp-stores</artifactId>
  <name>Killer App Stores</name>
  <packaging>pom</packaging>

  <dependencies>
    <dependency>
      <groupId>com.training.killerapp</groupId>
      <artifactId>killerapp-api</artifactId>
    </dependency>
  </dependencies>

  <modules>
    <module>killerapp-store-memory</module>
    <module>killerapp-store-xstream</module>  
  </modules>

</project>


크게 두 부분, 세밀하게는 네 부분으로 나누어 살펴볼 수 있습니다.

1. General Project Information

위 예제에서 분홍색 부분에 해당합니다.

이 부분은 이 전에 간단하게 살펴본 적이 있는 것 같습니다. 이 부분에 있는 정보들 중에 groupId, artifactId, packaging, version 네 개를 조합하여 프로젝트 식별자로 사용합니다. 그런데 위의 예제는 groupId와 version이 명시되어 있지 않습니다. 명시하지 않으면, 부모 POM의 version과 groupId를 사용합니다.

상속받을 수 있는 정보들은 다음과 같습니다.
  • 종속성 dependencies
  • 개발자과 기여자 developers and contributors
  • 플러그인 목록 plugin lists
  • 리포트 목록 reports lists
  • 플러그인 실행 plugin executions with matching ids
  • 플러그인 설정 plugin configuration
버전

버전의 다음의 순서대로 표시합니다.
major.minor.bug_fix-qualifier-build_number

스냅샷 snapshot

버전 뒤에 붙여주는 이 표시는 현재 개발중이라는 표시입니다.

예) 1.3.5-alpha-1-SNAPSHOT

2. Project Relationships

SuperPOM

SuperPOM은 모든 프로젝트에서 공통으로 사용하는 정보를 모아 둡니다. 예를들어 빌드 정보와 같은 것을 다음과 같이 담아 두고 모든 프로젝트에서 이 POM을 상속하여 사용하도록 할 수 있습니다.


종속성 관리 엘리먼트

위 예제에는 없지만, <dependencyManagement> 라는 엘리먼트를 사용하며, 하위 프로젝트들이 종속성을 가지는 프로젝트들에 대한 정보를 미리 기술해 둘 수 있습니다. 그러면, 하위 프로젝트에서는 종속성을 가지는 프로젝트의 groupId와 artifactId만 명시해두면됩니다. version 정보는 SuperPOM의 저 엘리먼트를 참조하여 원하는 프로젝트를 참조하게 됩니다.

종속성

프로제트 간의 관계를 관리할 수 있습니다. 종속성은 해당 프로젝트가 어떤 기능을 수행하기 위해서 필요로 하는 프로젝트들을 나타냅니다. <dependencies> 엘리먼트를 사용하여 나타내며, JUnit을 사용한다면 다음과 같이 나타낼 수 있습니다.

종속성을 나타낼 때 scope을 명시할 수 있는데, 컴파일 할 때만 사용할지, 테스트 할 때만 사용할지 등을 나타냅니다. scope에는 다음의 값들을 사용할 수 있습니다.

compile
provided
runtime
test
system

멀티 모듈

<modules> 엘리먼트안에 여러 개의 <module> 엘리먼트를 사용하여 나타내며, POM 파일에 이 엘리먼트를 가지고 있는 프로젝트는 멀티 모듈 프로젝트라고 합니다. 이 프로젝트는 자신을 빌드하는 것이 아니라, 여러 개의 다른 프로젝트들을 빌드합니다. 따라서 이 프로젝트의 packaging 타입은 pom으로 설정합니다.


'Build > Maven' 카테고리의 다른 글

Plugin  (4) 2007.11.28
Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
top


mvn site

Build/Maven : 2007.11.20 10:07


Maven에서 제공하는 빌드 라이프사이클 단계Phase 중에서 site를 사용하면, 프로젝트에 대한 정보를 보여주는 html 파일을 작성해 줍니다. 참고로 빌드 라이프사이클 단계를 실행 할 때마다 관련된 플러그인과 해당 플러그인이 참조하는 jar 파일들을 다운로드 하느라 다소 시간이 소요됩니다.
사용자 삽입 이미지

실행을 마치고, 프로젝트를 다시로딩Refresh 해주면, target 폴더에 다수의 html 파일이 생성된 것을 확인할 수 있습니다. 그 중에서 index.html을 열어보겠습니다.

사용자 삽입 이미지
첫 화면은 위와 같습니다. 왼쪽의 메뉴를 보니, 공부할 것이 태산 같다는 생각이 듭니다. Continuous Integration. 와우.. CI 툴과 연동하면, 그 결과를 이 페이지에서 참조할 수 있을 것 같습니다. Dependencies
 
사용자 삽입 이미지
Dependencies를 보시면, 현재 JUnit만 정의해 두었기 때문에, 썰렁하지만 추이적 종속성과 그 모습을 그래프로 볼 수 있다는 사실이 재밌어 보입니다.

이 밖에도, 이슈 트래킹, 메일링 리스트, 프로젝트 요약정보, 프로젝트 팀, 소스 저장소 등의 메뉴가 있습니다. 미루어 짐작해볼 때, CI도 설치하고, SVN도 설치하고, 이슈트래커도 설치하여 Maven에서 참조할 수 있게 설정해두면 정말 좋겠네요.

'Build > Maven' 카테고리의 다른 글

Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
Maven 공부시작  (6) 2007.11.15
top

TAG maven, site

Maven 용어 3

Build/Maven : 2007.11.19 11:13


마지막으로 Repository를 알아보겠습니다.
A Maven repository is a collection of installed or deployed project artifacts and other metadata information, managed exclusively by Maven.
참조한 문서에 위와같이 설명하고 있습니다. 간략하게 "설치 또는 배포된 프로젝트와 메타데이터 정보들의 집합"이라고 할 수 있겠습니다.

프로젝트를 어디에 어떻게 설치하거나 배포하길래 Maven 저장소라고 할까? 물론 '어디'는 그 저장소라는 곳일 것이고, 실제 저장소는 로컬과 원격이 있는데, 로컬은 말 그대로 내 컴퓨터입니다. 원격은 Maven이 제공하는 원격 저장소 입니다. mvn archetype:create 와 mvn package를 실행했을 때 여러 Jar 파일들과 플러그인을 다운로드 하는 모습을 볼 수 있었는데, 그 파일들이 바로 로컬에 저장되는 것입니다. 그리고 로컬에 그런 파일들이 있어야 컴파일이 됩니다.

로컬에 저장되는 경로는 다음과 같습니다.(윈도우 사용시)
사용자 삽입 이미지

생성된 폴더안에 다운받은 jar파일과 pom파일이 보입니다. junit-4.4.pom 파일을 열어보겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd ">
  <modelVersion>4.0.0</modelVersion>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.4</version>
  <name>JUnit</name>
  <url>http://junit.org</url>
...

이와 같은 모습을 하고 있습니다. 즉, 폴더 구조가 pom.xml파일에 명시된 프로젝트 좌표를 바탕으로 생성된 것을 확인할 수 있습니다.

사용자 삽입 이미지
Maven은 프로젝트가 필요로 하는 프로젝트(Jar, War, Ear 등)를 Maven 로컬 저장소에서 찾아서 참조합니다.니다. 로컬 저장소에 없으면, 원격 저장소에서 해당 프로젝트가 있는지 확인하여 로컬 저장소로 복사합니다. 이 때 폴더구조는 pom.xml파일을 바탕으로 생성해 주는 것입니다.

그리고 멋진 것은 필요로 하는 프로젝트가 필요로 하는 프로젝트까지.. 즉 추이 종속성까지 확인하여 싹 가져오게 됩니다. 추이 종속성에 대한 정보도 이미 1차적으로 참조하길 원했던 프로젝트의 pom 파일에 dependency 엘리먼트로 등록되어 있기 때문에, 그 정보를 바탕으로 가져올 것입니다.

그럼 끝으로 프로젝트를 Maven Space에 설치하는 방법을 살펴보겠습니다.

mvn install

install Phase를 사용하여 설치하면, 다음과 같이 로컬 저장소에 폴더가 생기고 그 안에 jar 파일과 pom 파일이 생성된 것을 확인할 수 있습니다. 이제 이 프로젝트를 다른 프로젝트에서 참조할 수 있게 됩니다.

사용자 삽입 이미지

2007/11/19 - [Maven] - Maven 용어 2
2007/11/16 - [Maven] - Maven 용어 1


'Build > Maven' 카테고리의 다른 글

Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
Maven 공부시작  (6) 2007.11.15
top


Maven 용어 2

Build/Maven : 2007.11.19 10:32


이번에는 POM에 대해 살펴보겠습니다.
POM은 Project Object Model의 약어로 해당 프로젝트에 대한 여러 정보(자신의 버전, 프로젝트 형태, 종속성, 그룹 이름, 프로젝트 이름)를 담고 있는 XML 파일입니다.

프로젝트 루트 폴더에 보면, pom.xml 파일이 생성되어 있는 것을 볼 수 있습니다. Maven archetype:create로 프로젝트를 생성할 때 이 파일이 생성됩니다.

이클립스에서 프로젝트를 생성할 때 다음과 같은 메뉴를 볼 수 있었습니다.
사용자 삽입 이미지

그리고 다음 화면에서는 프로젝트에 포함시킬 Jar를 선택하는 화면이 나옵니다. 여기서는 JUnit을 포함시켰습니다.

사용자 삽입 이미지

이렇게 프로젝트를 생성한 결과 다음과 같은 POM 파일이 작성되었습니다.
<?xml version="1.0" encoding="UTF-8"?><project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>whiteship</groupId>
  <artifactId>FirstMavenSample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <description></description>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.4</version>
    </dependency>
  </dependencies>
</project>

위 정보가 이 프로젝트를 유일하게 식별할 수 있도록 만들어 주는 정보 입니다. 그룹 아이디는 팀명이나 메타 프로젝트 명을 주시면 될 것 같으며, 아티팩트 아이디가 프로젝트 명입니다. 그리고 버전은 해당 프로젝트 배포 버전입니다. 이 정보를 가지고 프로젝트 좌표(coordinate)를 만들 수 있습니다. 위의 프로젝트는 다음과 같은 좌표를 가지게 됩니다.

whiteship:FirstMavenSample:jar:0.0.1-SNAPSHOT

중간에 끼어든 jar는 package 타입 선택할 때 선택한 값이 들어가며, 기본값이 jar입니다.(그래서 그런지 pom 파일에서는 생략되어 있는 모습니다.) 이 값에 따라서 빌드 라이프사이클이 달라집니다.

이 좌표를 사용해서 Maven Space에서 특정 프로젝트를 참조하게 됩니다. 즉 이러한 좌표를 가지고 있어야 Maven Space 내의 다른 프로젝트에서 이 프로젝트를 참조할 수 있게 되는 것입니다. 현재 제가 만든 위의 프로젝트는 JUnit 프로젝트를 참조하고 있는데, 바로 이 좌표를 사용하여 참조하고 있는 것입니다.

사용자 삽입 이미지
마지막으로 Repository만 살펴보면, 기본 용어들은 마무리가 될 듯 합니다. 밥 먹고 나서 이어집니다.

'Build > Maven' 카테고리의 다른 글

Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
Maven 공부시작  (6) 2007.11.15
top

TAG maven, POM

Maven 용어 1

Build/Maven : 2007.11.16 16:49


  • Plugin
  • Goal
  • Phase
위 세개가 매우 비슷해 보이면서 다른 듯 해서 햇갈립니다. Maven으로 프로젝트 생성하기에서 사용했었던 명령어는 다음과 같이 두 개 밖에 없습니다.

mvn archetype:create 와 mvn package 였습니다.

archetype은 Plugin, create는 Goal, package는 Phase입니다.

Goal은 Plugin에 포함되어 있고, 하나의 Plugin은 여러개의 Goal을 가지고 있습니다. 즉 archetype이라는 Plugin에 create라는 Goal을 가지고 있고, 그것을 실행하여 프로젝트를 생성한 것입니다.
사용자 삽입 이미지
Maven의 Goal은 Ant의 Task와 비슷합니다. 그럼 Ant의 Target과 비슷한 것도 있을 것입니다. 네 비슷한 것이 Maven에도 있는데, 이것은 조금 햇갈립니다. Plugin과 비슷한건지.. Phase와 비슷한건지...

Phase는 Maven의 Build Lifecycle의 한 부분을 가리키는 용어 입니다. 이 단어를 사용하여 mvn을 실행하면 Build Lilfecycle을 실행하게 되며, 실행을 하다가 인자로 준 Phase까지 수행하고 멈추게 됩니다. 어떻게 보면, Ant의 Target하고도 비슷하지만.. 많이 다릅니다.

먼저 Maven의 Build Lifecycle 중에 일부를 보면 다음과 같습니다.
사용자 삽입 이미지
각각의 Phase는 어떤 일을 할지 정의하지 않고 어떤 Goal을 실행할지 설정해 두었을 것입니다. Goal을 Phase에 바인딩해 두었다고 생각하면 되겠습니다. package Phase의 경우 jar:jar 라는 goal로 바인딩되어 있습니다.
사용자 삽입 이미지
위의 빌드 라이프사이클 중에 하나의 Phase를 인자로 넘겨주면, 처음부터 해당 Phase까지에 바인딩되어 있는 모든 Goal들을 실행합니다. 따라서 mvn package같은 경우 다음과 같은 goal들이 실행됩니다.
사용자 삽입 이미지
따라서 mvn package 대신에 mvn resources:resources compiler:compile resources:testResources compiler:testCompile surefire:test jar:jar라고 입력해도 같은 결과를 볼 수 있습니다.

Phase는 Ant의 Target, Goal은 Ant의 Task, Plugin는 Goal들을 묶어놓은 것으로 생각할 수 있겠습니다.

'Build > Maven' 카테고리의 다른 글

Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
Maven 공부시작  (6) 2007.11.15
top


Maven으로 프로젝트 생성하기

Build/Maven : 2007.11.15 17:57


http://maven.apache.org/download.html
위 주소에서 Maven을 다운로드 받으실 수 있습니다.
원하는 디렉토리에 압축을 풀고 해당 bin 폴더를 Path로 잡아주면 어디서나 mvn 명령을 실행할 수 있습니다.

이클립스 플러그인을 설치하실 때는 업데이트 사이트를 이용하시면 됩니다. 저는 Appfuse 예제 돌려볼때 설치했었습니다.
http://m2eclipse.codehaus.org/update/

콘솔에서 프로젝트 생성할 때
mvn archetype:create -DgroupId=그룹 아이디 -DartifactId=프로젝트 아이디
cd 프로젝트 아이디
mvn initailize

이클립스에서 프로젝트 생성할 때는 그냥 maven 프로젝트를 선택하시면 됩니다.

콘솔에서 작업할 때 주의할 것
  • 프로젝트 최상위 폴더 경로에 한글이 포함되어 있으면 안 됩니다.

콘솔에서 프로젝트를 생성할 때와 이클립스에서 Maven 플러그인으로 프로젝트를 생성할 차이점
  • 기본으로 App라는 클래스와 AppTest 클래스를 생성해 줍니다.

'Build > Maven' 카테고리의 다른 글

Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
Maven 공부시작  (6) 2007.11.15
top


Maven 공부시작

Build/Maven : 2007.11.15 17:11


ClassNotFoundException이 발생하면 해당 클래스를 가지고 있는 Jar 파일을 복사해서 라이브러리 폴더에 붙여넣어 주고 해당 Jar 파일을 참조하도록 빌드패스에 추가해 줍니다. 그런 다음 또 다른 ClassNotFoundException이 발생하면 위의 과정이 반복됩니다. 심하게는 이런 사이클을 다섯번 연달아 돈적이 있는데 정말 돌아버릴 것 같았습니다.

그래서 Maven을 공부하기로 결심했습니다. Maven은 종속성을 가진 Jar 파일을 자동으로 다운로드 해줄뿐 아니라, POM이라는 xml파일로 프로젝트가 사용하는 Jar 파일들에 대한 정보를 일괄적으로 관리하고 있습니다. 이밖에도 프로젝트 생성, 테스트, 패키징등을 자동화 할 수 있는 매우 훌륭한 도구입니다. 다만... 학습곡선이 조금 있다보니 그동안 멀리 했었는데, 이 참에 공부해야겠습니다.

제가 참조할 문서는 찬욱군이 알려준 매우 좋은 문서로써, 공짜입니다.

http://sonatype.com/book/

위 사이트에서 다운로드 받거나 HTML 형태로 바로 참조할 수 있습니다.

'Build > Maven' 카테고리의 다른 글

Build Lifecycle(site)  (0) 2007.11.27
Build Lifecycle(default 자세히)  (0) 2007.11.27
Build Lifecycle(default)  (0) 2007.11.27
Build Lifecycle(clean)  (2) 2007.11.27
POM  (0) 2007.11.26
mvn site  (0) 2007.11.20
Maven 용어 3  (0) 2007.11.19
Maven 용어 2  (0) 2007.11.19
Maven 용어 1  (2) 2007.11.16
Maven으로 프로젝트 생성하기  (0) 2007.11.15
Maven 공부시작  (6) 2007.11.15
top