달력

08

« 2018/08 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
.. .. ..

 

아래와 같은 설정을 pom.xml 에 하고

 

<plugin>
     <artifactId>maven-assembly-plugin</artifactId>
     <inherited>false</inherited>
     <configuration>
      <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
     </configuration>
    </plugin>

 

메이븐을 빌드할때 아래 명령을 한다.

 

mvn assembly:assembly

 

위와같이 빌드하면 jar 파일이 두가지 생긴다.

aaa.jar

aaa-jar-with-dependencies.jar

아래 부분이 라이브러리를 포함한 jar 가 된다.

 

.
Posted by .07274.

댓글을 달아 주세요

.. .. ..

[펌] http://www.egovframe.go.kr/uss/olh/qna/QnaInqireCoUpdt.do?menu=5&submenu=3

 

질문

JDBC 드라이버를 사용하기 위해서 pom.xml 에 dependency 를 추가했습니다.
아래의 두가지 모두 해보았는데
해당 라이브러리를 받아오지 못하더군요..

<dependency>
<groupId>ojdbc</groupId>
<artifactId>ojdbc</artifactId>
<version>14</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>

그래서 혹시나 하고 http://mvnrepository.com/ 사이트에 들어가서
라이브러리를 직접 다운받으려고 해보았습니다.

그런데.. 관련 라이브러리 파일들의 size 가 0 byte 이더군요..
어떻하면 좋을까요??

     

     

     



  • 원격지 central repository 에 해당 라이브러리가 존재하지 않을 경우 로컬 repository에 해당 라이브러리를 카피 하시면 실 수 있습니다.

    위의 <version>14</version> 의 경우 ojdbc-14.jar 를
    '로컬 maven' repository\ojdbc\ojdbc\14 폴더 안에 카피 해넣으시면 됩니다.

    위와 같은 경우 로컬에서만 참조할 수 있다는 것을 염두하셔야 합니다.

    즐거운 하루 되세요. 감사합니다.

 

.
Posted by .07274.

댓글을 달아 주세요

.. .. ..
아우.. 이 그지같은 이클립스는 쉽게 멀 도와주질 않는다.

이클립스에서 메이븐 프로젝트 생성 ( 생성시 아키타입을 maven-아키타입-webapp 이런걸로 설정해서 생성)

이렇게 생성하고 tomcat 으로 add and remove 하면 생성한 프로젝트가 보이지를 않는다. 그지같다..

다이나믹 웹으로 쓰라는 것인지....

해결방법은 일단.

http://babtingdev.tistory.com/321

이곳에서 찾았다. 저렇게 하니까 된다.

근데

<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.8</version>
<configuration>
<wtpversion>2.0</wtpversion>
<wtpContextName>/</wtpContextName>
</configuration>
</plugin>



요부분을 그대로 바보같이 썼다.
안된다. 당연히 안된다.
<wtpContextName>/</wtpContextName>
이부분을 자기 프로젝트 이름으로 변경해주어야 한다 ;;

글을 잘 못읽은 내 죄지 ㅜㅠ

무튼 도움됬으면 댓글 달고 갑시다. 나도 어렵고 힘들었소~!
.
Posted by .07274.

댓글을 달아 주세요

.. .. ..

Eclipse 3.4.2 에 m2eclipse 설치시 오류

다음 사이트로 Software Update 하려고 하니. 다음과 같이 오류가 발생했다.
- Add Site 경로 > http://m2eclipse.sonatype.org/sites/m2e.
- 오류내역 > No repository found at http://m2eclipse.sonatype.org/sites/m2e.

검색해서 다음 해결책을 찾았다.

[결론] Add Site 경로를 다음으로 변경해서 처리하자.
http://m2eclipse.sonatype.org/sites/archives/0.10.2.20100623-1649/

[펌] : http://eknote.tistory.com/1631

.
Posted by .07274.

댓글을 달아 주세요

2011.02.17 13:48

Eclipse + Maven I.lib()/I.lib(Maven)2011.02.17 13:48

.. .. .. 이클립스의 help Menu 에서 Install New Software 를 누른다.

http://m2eclipse.sonatype.org/sites/m2e

이부분을 입력하면 메이븐 관한 업데이트 데이터가 나오는데

체크후 next 한다.

이후는 안어려우니 패스~!
.
Posted by .07274.

댓글을 달아 주세요

2010.11.17 11:08

[펌] Maven 기초 I.lib()/I.lib(Maven)2010.11.17 11:08

.. .. ..

필자의 경우 Maven을 사용한지 2년이 넘어가는 데, Maven을 접한 이후 특별한 제약이 없는 한 Maven을 이용해서 프로젝트를 진행하고 있다. 흔히 Maven을 Ant와 비슷한 빌드(build) 도구로 생각하기도 하는데, Ant가 Build에 초점이 맞춰져 있다면 Maven은 프로젝트의 빌드 라이프사이클 기반 프레임워크를 제공하는데 초점이 맞춰져 있다.

본 글에서는 Maven을 이용해서 프로젝트를 생성하는 방법과, 디렉토리 구조, POM 파일 기본 구성, Maven 라이프 사이클 그리고 Maven 프로젝트를 이클립스 프로젝트로 생성하는 방법을 살펴보도록 하겠다.

Maven 설치

http://maven.apache.org/ 사이트를 방문하면 최신 버전의 Maven을 다운로드 받을 수 있다. 현재 최신 버전은 2.0.9이며, apache-maven-2.0.9-bin.zip 파일이나 apache-maven-2.0.9-bin.tar.gz 파일 등 원하는 형식으로 압축된 파일을 다운로드 받으면 된다.

파일을 다운로드 받은 뒤에는 다음과 같은 순서로 설치 작업을 해 주면 된다.

  1. 다운로드 받은 파일의 압축을 푼다. 예를 들면 /usr/local 디렉터리나 C:\ 에 압축을 푼다.
  2. M2_HOME 환경 변수에 설치 디렉터리를 값으로 설정한다. 예, M2_HOME=c:\apache-maven-2.0.9
  3. PATH 환경 변수에 M2를 추가한다. 예, PATH=%M2_HOME%\bin;%PATH%
  4. JAVA_HOME 환경 변수가 JDK 설치 디렉터리를 가리키고 있는 지 확인한다. 예, JAVA_HOME=c:\jdk1.6.0_07

환경 변수를 모두 설정해 주었다면 아래의 명령어를 사용해서 Maven이 제대로 실행되는 지 확인해보자.

C:\Users\madvirus>mvn -version
Maven version: 2.0.9
Java version: 1.5.0_16
OS name: "windows vista" version: "6.0" arch: "x86" Family: "windows"


Maven 프로젝트 생성하기

설치가 끝났다면 Maven 프로젝트를 생성해 보자. 명령 프롬프트에서 아래 명령어를 실행하면 된다. (아래 명령어를 처음 실행할 경우 꽤 오랜 시간이 걸리는데, 그 이유는 Maven이 필요한 플러그인과 모듈을 다운로드 받기 때문이다. Maven 배포판은 최초로 Maven을 사용하는 데 필요한 모듈만 포함하고 있고, 그 외에 archetype 플러그인, compiler 플러그인 등 Maven을 사용하는 데 필요한 모듈은 포함하고 있지 않다. 이들 모듈은 실제로 필요할 때 Maven 중앙 리포지토리에서 로딩된다.)

mvn archetype:generate

위 명령어를 실행하면 Maven 프로젝트를 생성하는 데 필요한 정보를 입력하라는 메시지가 단계적으로 뜨고, 각 항목별로 알맞은 값을 입력해주면 된다. 아래는 실행 화면 예이다. 붉은색으로 표시한 것은 입력한 값이다.

$ mvn archetype:generate
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
...
Choose archetype:
1: internal -> appfuse-basic-jsf (AppFuse archetype for creating a web application with Hibernate, Spring and JSF)
...
...
15: internal -> maven-archetype-quickstart ()
16: internal -> maven-archetype-site-simple (A simple site generation project)
17: internal -> maven-archetype-site (A more complex site project)
18: internal -> maven-archetype-webapp (A simple Java web application)
...
41: internal -> gmaven-archetype-mojo (Groovy mojo archetype)
Choose a number:  (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/.../41) 15: : 15
Define value for groupId: : net.daum.cafe
Define value for artifactId: : simple-app
Define value for version:  1.0-SNAPSHOT: :
Define value for package:  net.daum.cafe: :
Confirm properties configuration:
groupId: net.daum.cafe
artifactId: simple-app
version: 1.0-SNAPSHOT
package: net.daum.cafe
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: maven-archetype-quickstart:RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: net.daum.cafe
[INFO] Parameter: packageName, Value: net.daum.cafe
[INFO] Parameter: basedir, Value: c:\work\eclipse34workspace\personal
[INFO] Parameter: package, Value: net.daum.cafe
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: simple-app
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: c:\work\eclipse34workspace\personal\simple-app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 minutes 5 seconds
[INFO] Finished at: Mon Dec 15 11:37:07 KST 2008
[INFO] Final Memory: 7M/14M
[INFO] ------------------------------------------------------------------------ 

위 과정에서 실제로 입력하는 값은 다음과 같다.

  • groupId - 프로젝트 속하는 그룹 식별 값. 회사, 본부, 또는 단체를 의미하는 값이 오며, 패키지 형식으로 계층을 표현한다. 위에서는 net.daum.cafe를 groupId로 이용하였다.
  • artifactId - 프로젝트 결과물의 식별 값. 프로젝트나 모듈을 의미하는 값이 온다. 위에서는 simple-app을 artifactId로 이용하였다.
  • version - 결과물의 버전을 입력한다. 위에서는 기본 값인 1.0-SNAPSHOT을 사용하였다.
  • package - 기본적으로 생성할 패키지를 입력한다. 별도로 입력하지 않을 경우 groupId와 동일한 구조의 패키지를 생성한다.
기존에는 archetype:create 골을 이용해서 프로젝트를 생성했었다. 하지만, maven-archetype-plugin의 버전이 올라가면서 archetype:generate 골이 추가되었고, archetype:create 골은 deprecated 되었다. 하지만, 하위 호환을 위해 archetype:create 골은 아직 지원되고 있다.

Maven 프로젝트의 기본 디렉토리 구조

archetype:generate 골이 성공적으로 실행되면, artifactId에 입력한 값과 동일한 이름의 디렉터리가 생성된다. 위 경우에는 현재 디렉터리에 simple-app 이라는 하위 디렉터리가 생성된다. 위 과정에서 선택한 archetype은 maven-archetype-quickstart 인데, 이 archetype을 선택했을 때 생성되는 디렉터리 구조는 다음과 같다.

simple-app
├─src
│   ├─main
│   │  └─java
│   │      └─net
│   │          └─daum
│   │              └─cafe
│   │                  └─App.java
│   ├─test
│       └─java
│           └─net
│               └─daum
│                   └─cafe
│                      └─AppTest.java
└─pom.xml

기본적으로 생성되는 디렉터리를 포함한 Maven 프로젝트의 주요 디렉터리는 다음과 같다.

  • src/main/java - 자바 소스 파일이 위치한다.
  • src/main/resources - 프로퍼티나 XML 등 리소스 파일이 위치한다. 클래스패스에 포함된다.
  • src/main/webapp - 웹 어플리케이션 관련 파일이 위치한다. (WEB-INF 디렉터리, JSP 파일 등)
  • src/test/java - 테스트 자바 소스 파일이 위치한다.
  • src/test/resources - 테스트 과정에서 사용되는 리소스 파일이 위치한다. 테스트 시에 사용되는 클래스패스에 포함된다.

기본적으로 생성되지 않은 디렉터리라 하더라도 직접 생성해주면 된다. 예를 들어, src/main 디렉터리에 resources 디렉터리를 생성해주면 Maven은 리소스 디렉터리로 인식한다.

컴파일 해보기/테스트 실행 해보기/패키지 해보기

이제 간단하게 컴파일과 테스트를 실행해보자. 소스 코드를 컴파일 하려면 다음과 같은 명령어를 실행해주면 된다.

mvn compile

컴파일 된 결과는 target/classes 디렉터리에 생성된다.

테스트 클래스를 실행해보고 싶다면 다음과 같은 명령어를 사용하면 된다.

$ mvn test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building simple-app
[INFO]    task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory: c:\work\eclipse34workspace\personal\simple-app\target\surefire-reports
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.daum.cafe.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.051 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Tue Dec 16 14:26:00 KST 2008
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

그러면, 테스트 코드를 컴파일한 뒤 테스트 코드를 실행한다. 그리고 테스트 성공 실패 여부를 화면에 출력한다. 컴파일 된 테스트 클래스들은 target/test-classes 디렉터리에 생성되고, 테스트 결과 리포트는 target/surefire-reports 디렉터리에 저장된다.

(아무것도 한게 없으니 당연하지만) 모든 코드가 정상적으로 만들어지고 테스트도 통과했으니, 이제 배포 가능한 jar 파일을 만들어보자. 아래 명령어를 실행하면 프로젝트를 패키징해서 결과물을 생성한다.

$ mvn package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building simple-app
[INFO]    task-segment: [package]
[INFO] ------------------------------------------------------------------------
...
...
[INFO] [jar:jar]
[INFO] Building jar: c:\work\eclipse34workspace\personal\simple-app\target\simple-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Tue Dec 16 15:20:10 KST 2008
[INFO] Final Memory: 6M/13M
[INFO] ------------------------------------------------------------------------

mvn package가 성공적으로 실행되면, target 디렉터리에 프로젝트 이름과 버전에 따라 알맞은 이름을 갖는 jar 파일이 생성된다. 위 예제의 경우에는 simple-app-1.0-SNAPSHOT.jar 파일이 생성된 것을 확인할 수 있다.

POM 파일 기본

Maven 프로젝트를 생성하면 pom.xml 파일이 프로젝트 루트 디렉터리에 생성된다. 이 pom.xml 파일은 Project Object Model 정보를 담고 있는 파일로서, 이 파일에서 다루는 주요 설정 정보는 다음과 같다.

  • 프로젝트 정보 - 프로젝트의 이름, 개발자 목록, 라이센스 등의 정보를 기술
  • 빌드 설정 - 소스, 리소스, 라이프 사이클 별 실행할 플러그인 등 빌드와 관련된 설정을 기술
  • 빌드 환경 - 사용자 환경 별로 달라질 수 있는 프로파일 정보를 기술
  • POM 연관 정보 - 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등을 기술

archetype:create 골 실행시 maven-archetype-quickstart Archetype을 선택한 경우 생성되는 pom.xml 파일은 다음과 같다.

[기본으로 생성되는 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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.daum.cafe</groupId>
  <artifactId>simple-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simple-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

위 POM 파일에서 프로젝트 정보를 기술하는 태그는 다음과 같다.

  • <name> - 프로젝트 이름
  • <url> - 프로젝트 사이트 URL

POM 연관 정보는 프로젝트간 연관 정보를 기술하는데, 관련 태그는 다음과 같다.

  • <groupId> - 프로젝트의 그룹 ID 설정
  • <artifactId> - 프로젝트의 Artifact ID 설정
  • <version> - 버전 설정
  • <packaging> - 패키징 타입 설정. 위 코드의 경우 프로젝트의 결과 Artifact가 jar 파일로 생성됨을 의미한다. jar 뿐만 아니라 웹 어플리케이션을 위한 war나 JEE를 위한 ear 등의 패키징 타입이 존재한다.
  • <dependencies> - 이 프로젝트에서 의존하는 다른 프로젝트 정보를 기술한다.
    • <dependency> - 의존하는 프로젝트 POM 정보를 기술
      • <groupId> - 의존하는 프로젝트의 그룹 ID
      • <artifactId> - 의존하는 프로젝트의 artifact ID
      • <version> - 의존하는 프로젝트의 버전
      • <scope> - 의존하는 범위를 설정

의존 설정

<dependency> 부분의 설정에 대해서 좀 더 살펴보도록 하자.

Maven을 사용하지 않을 경우 개발자들은 코드에서 필요로 하는 라이브러리를 각각 다운로드 받아야 한다. 예를 들어, 아파치 commons DBCP 라이브러리를 사용하기 위해서는 DBCP 뿐만 아니라 common pool 라이브러리도 다운로드 받아야 한다. 물론, commons logging을 비롯한 라이브러리도 모두 추가로 다운로드 받아 설치해 주어야 한다. 즉, 코드에서 필요로 하는 라이브러리 뿐만 아니라 그 라이브러리가 필요로 하는 또 다른 라이브러리도 직접 찾아서 설치해 주어야 한다.

하지만, Maven을 사용할 경우에는 코드에서 직접적으로 사용하는 모듈에 대한 의존만 추가해주면 된다. 예를 들어, commons-dbcp 모듈을 사용하고 싶은 경우 다음과 같은 <dependency> 코드만 추가해주면 된다.

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.2.1</version>
</dependency>

그러면, Maven은 commons-dbcp 뿐만 아니라 commons-dbcp가 의존하는 라이브러리가 자동으로 처리해준다. 실제로 1.2.1 버전의 commons-dbcp 모듈의 pom.xml 파일을 보면 의존 부분이 다음과 같이 설정되어 확인할 수 있다.

  <dependencies>
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.sql</groupId>
      <artifactId>jdbc-stdext</artifactId>
      <version>2.0</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>xml-apis</groupId>
      <artifactId>xml-apis</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>xerces</groupId>
      <artifactId>xerces</artifactId>
      <version>2.0.2</version>
    </dependency>
  </dependencies>

Maven은 commons-dbcp 모듈을 다운로드 받을 때 관련 POM 파일도 함께 다운로드 받는다. (다운로드 받은 파일은 로컬 리포지토리에 저장되는데 이에 대한 내용은 뒤에서 다시 설명하겠다.) 그리고 POM 파일에 명시한 의존 모듈을 함께 다운로드 받는다. 즉, commons-dbcp 1.2.1 버전의 경우 commons-collections 2.1 버전과 commons-pool 1.2 버전 등을 함께 다운로드 받는다. 이런 식으로 반복해서 다운로드 받은 모듈이 필요로 하는 모듈을 다운로드 받고 이들 모듈을 현재 프로젝트에서 사용할 클래스패스에 추가해준다.

따라서, 개발자는 일일이 필요한 모듈을 다운로드 받을 필요가 없으며, 현재 코드에서 직접적으로 필요로 하는 모듈에 대해서만 <dependency>로 추가해주면 된다. 나머지 의존은 모두 Maven이 알맞게 처리해준다.

mvnrepository.com 사이트에서 POM 정보 찾기

Maven을 사용할 때 가장 많이 찾게 되는 사이트가 mvnrepository.com이다. mvnrepository.org는 Maven 중앙 리포지토리에 등록된 POM 정보를 검색해주는 기능을 제공해준다. 이 사이트를 통해서 추가할 라이브러리의 <dependency> 설정 정보를 구할 수 있다.


의존의 scope: compile, runtime, provided, test

앞의 pom.xml 파일에서 <dependency> 부분을 보면 <scope>를 포함하고 있는 것과 그렇지 않은 것이 존재한다는 것을 알 수 있다. <scope>는 의존하는 모듈이 언제 사용되는 지를 설정할 때 사용되며, <scope>에 올 수 있는 값은 다음의 네 가지가 존재한다.

  • compile - 컴파일 할 때 필요. 테스트 및 런타임에도 클래스패스에 포함된다. <scope>를 설정하지 않을 경우 기본 값은 compile 이다.
  • runtime - 런타임에 필요. JDBC 드라이버 등이 예가 된다. 프로젝트의 코드를 컴파일 할 때는 필요하지 않지만, 실행할 때 필요하다는 것을 의미한다. 배포시 포함된다.
  • provided - 컴파일 할 때 필요하지만, 실제 런타임 때에는 컨테이너 같은 것에서 기본으로 제공되는 모듈임을 의미한다. 예를 들어, 서블릿이나 JSP API 등이 이에 해당한다. 배포시 제외된다.
  • test - 테스트 코드를 컴파일 할 때 필요. Mock 테스트를 위한 모듈이 예이다. 테스트 시에 클래스패스에 포함되며, 배포시 제외된다.


원격 리포지토리와 로컬 리포지토리

Maven은 컴파일이나 패키징 등 작업을 실행할 때 필요한 플러그인이나 pom.xml 파일의 <dependency> 등에 설정한 모듈을 Maven 중앙 리포지토리에서 다운로드 받는다. 현재 중앙 리포지토리의 주소는 http://repo1.maven.org/maven2/ 이다.

원격 리포지토리에서 다운로드 받은 모듈은 로컬 리포지토리에 저장된다. 로컬 리포지토리는 [USER_HOME]/.m2/repository 디렉터리에 생성되며, 로컬 리포지토리에는 다음과 같은 형식의 디렉터리를 생성한 뒤 다운로드 받은 모듈을 저장한다.

[groupId]/[artifactId]/[version]

예를 들어, commons-dbcp 1.2.1 버전의 경우, 모듈 및 관련 POM 파일이 저장되는 디렉터리는 다음과 같다.

[USER_HOME]/.m2/repository/commons-dbcp/commons-dbcp/1.2.1

위 디렉터리에 저장되는 파일은 패키징 된 모듈 파일, pom 파일, 그리고 소스 코드 다운로드 옵션을 실행한 경우에는 소스 코드를 포함한 jar 파일이 포함된다.

일단 원격 리포지토리로부터 파일을 다운로드해서 로컬 리포지토리에 저장하면, 그 뒤로는 로컬 리포지토리에 저장된 파일을 사용하게 된다.

Maven 라이프사이클(Lifecycle)과 플러그인 실행

본 글의 서두에 Maven은 프로젝트의 라이프사이클 기반 프레임워크를 제공한다고 했다. 앞서 프로젝트를 생성한 뒤 컴파일하고(mvn compile), 테스트 하고(mvn test), 패키징 하는(mvn package) 과정을 정해진 명령어를 이용해서 실행했는데, 이때 compile, test, package는 모두 빌드 라이프사이클에 속하는 단계이다.

Maven은 clean, build (default), site의 세 가지 라이프사이클을 제공하고 있다. 각 라이프사이클은 순서를 갖는 단계(phase)로 구성된다. 또한, 각 단계별로 기본적으로 실행되는 플러그인(plugin) 골(goal)이 정의되어 있어서 각 단계마다 알맞은 작업이 실행된다. 아래 표는 디폴트 라이프사이클을 구성하고 있는 주요 실행 단계를 순서대로 정리한 것이다.

[표] 디폴트 라이프사이클의 주요 단계(phase)

 단계 설명  단계에 묶인 플러그인 실행
generate-sources 컴파일 과정에 포함될 소스를 생성한다. 예를 들어,  DB 테이블과 매핑되는 자바 코드를 생성해주는 작업이 이 단계에서 실행된다.
process-sources 필터와 같은 작업을 소스 코드에 처리한다.  
generate-resources 패키지에 포함될 자원을 생성한다.   
process-resources 필터와 같은 작업을 자원 파일에 처리하고, 자원 파일을 클래스 출력 디렉토리에 복사한다. resources:resources 
compile 소스 코드를 컴파일해서 클래스 출력 디렉터리에 클래스를 생성한다. compiler:compile
generate-test-sources 테스트 소스 코드를 생성한다. 예를 들어, 특정 클래스에서 자동으로 테스트 케이스를 만드는 작업이 이 단계에서 실행된다.
process-test-sources 필터와 같은 작업을 테스트 소스 코드에 처리한다. resources:testResources 
generate-test-resources 테스트를 위한 자원 파일을 생성한다.   
process-test-resources 필터와 같은 작업을 테스트 자원 파일에 처리하고, 테스트 자원 파일을 테스트 클래스 출력 디렉터리에 복사한다.  
test-compile 테스트 소스 코드를 컴파일해서 테스트 클래스 추력 디렉터리에 클래스를 생성한다. compiler:testCompile
test 테스트를 실행한다. surefire:test
package 컴파일 된 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징한다. 패키징에 따라 다름
jar - jar:jar
war - war:war
pom - site:attach-descriptor
ejb - ejb:ejb
install 로컬 리포지토리에 패키지를 복사한다. install:install
deploy 생성된 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다. deploy:deploy

라이프사이클의 특정 단계를 실행하려면 다음과 같이 mvn [단계이름] 명령어를 실행하면 된다.

mvn test
mvn deploy

라이프사이클의 특정 단계를 실행하면 그 단계의 앞에 위치한 모든 단계가 실행된다. 예를 들어, test 단계를 실행하면 test 단계를 실행하기에 앞서 'generate-sources' 단계부터 'test-compile' 단계까지 각 단계를 순서대로 실행한다. 각 단계가 실행될 때는 각 단계에 묶인 골(goal)이 실행된다.

플러그인을 직접 실행할 수도 있다. mvn 명령어에 단계 대신 실행할 플러그인을 지정하면 된다.

mvn surefire:test

단, 플러그인 골을 직접 명시한 경우에는 해당 플러그인만 실행되기 때문에 라이프사이클의 단계가 실행되지는 않는다.

플러그인 골(Plugin Goal)

Maven에서 플러그인을 실행할 때에는 '플러그인이름:플러그인지원골'의 형식으로 실행할 기능을 선택한다. 예를 들어, compiler:compile은 'compiler'는 플러그인에서 'compile' 기능(goal)을 실행한다는 것을 뜻한다.


맺음말

이번 글에서는 Maven의 기본 사용법을 살펴봤다. Maven이 제공하는 의존 관리는 개발자를 jar 지옥(?)에서 구해준다는 것을 알 수 있었다. 또한, Maven은 표준화된 라이프사이클을 제공하고 있기 때문에 개발자가 컴파일-테스트-패키징 등의 과정을 손으로 정의하지 않아도 되며, 개발자는 Maven이 제공하는 단계 중 필요한 단계만 실행하면 된다. 그럼, 나머지 작업(컴파일, 테스트 실행, jar 파일 생성)은 모두 Maven이 처리해준다.

다음 글에서는 많이 사용되고 있는 개발툴인 이클립스에서 Maven 프로젝트를 import하는 방법과 컴파일러 버전을 명시하는 방법을 살펴보도록 하겠다.


관련 자료:

 

[펌] http://javacan.tistory.com/129

.
Posted by .07274.

댓글을 달아 주세요