728x90

maven의 의미#

maven은 유대어로 '지식 축적기'라고 하는데, Jakarta Turbine 프로젝트를 간소화 하기 위해서 시작했었다. 각각의 프로젝트에는 여러개의 ant빌드 파일이 있는데, 각각 약간씩 다르고, JAR파일도 약간 다른 파일을이 CVS에 체크인되어 있어서.... 표준 프로젝트 개발 툴로 만들려고 어쩌고 저쩌고...

http://maven.apache.org/what-is-maven.html

ant와 비교하여 maven의 장점#

정형화된 절차를 제공한다.#

ant는 모든 과정을 사용자가 코딩해야 하지만, maven은 compile, package, test 등등 작업 프로세스를 정형화 시키고 이를 준수하도록 강제한다.

프로젝트의 소스 트리 구성도 src/main/... 과 같은 패턴을 따르도록 제시하고 있다.

라이브러리 의존성 해결을 자동화한다.#

open source 라이브러리의 경우 maven의 central repository에 모두 저장하고 있어서, 의존성이 있는 라이브러리의 명세만 입력해주면, 자동으로 다운로드 하여 class path에 걸어주기 때문에, 따로 처리할 필요가 없다.

라이브러리 관리의 편의성을 증대시켜준다.#

보통 소스 개발할때, 라이브러리를 SCM(Software Configuration Management)툴에서 관리하는데, 이는 불필요한 공간을 낭비하게 할 뿐 아니라, 버전별 관리도 어렵게한다.

maven에서는 라이브러리 전용 레파지토리를 제공하므로, 통합 관리가 가능하다.

maven 이용 전략#

  1. 프로젝트 빌드 및 디버깅은 eclipse를 최대한 활용한다.
  2. 라이브러리 의존성 관련 처리는 maven을 이용한다.

maven 설치#

  1. http://maven.apache.org/download.html 에서 apache-maven-2.1.0-bin.zip 을 다운로드 한다. (*nix계열이라면 tar.gz이나 tar.bz2가 좋다 )
  2. apache-maven-2.0.10-bin.zip을 설치를 원하는 디렉토리에 압축을 푼다. (eg. c:\Work\lib\apache-maven-2.1.0\)
  3. M2_HOME 환경변수를 '시스템 등록정보'창을 열어서(Window Key + Pause), c:\Work\lib\apache-maven-2.1.0 과 같이 추가해준다. 중간에 공백이 있더라도 따옴표를 넣지 않도록 한다. 또한 Maven < 2.0.9 에서는 맨 마지막에 \를 넣지 말것
  4. 3번의 다이얼로그에서 M2 환경변수를 %M2_HOME%\bin 으로 추가한다.
  5. 선택사항 : 3번 다이얼로그에서 MAVEN_OPTS 라는 변수로 -Xms256m -Xmx512m 같은 환경변수를 추가할 수 있다.

m2eclipse 설치 ( eclipse plugin )#

  1. http://m2eclipse.codehaus.org/ 에가서 http://m2eclipse.sonatype.org/sites/m2e/ 주소 확인후 eclipse 업데이트 주소에 입력후 플러그인 설치
  2. http://download.eclipse.org/releases/ganymede/ 가 plugin update경로에 없을 경우 의존성을 해결해주지 못하는 문제가 발생할 수 있다.

m2eclipse 사용 가이드

m2eclipse 버그

scope를 provided로 잡았는데, war패키지에 전체 내용이 들어가는 경우

eclipse에서 패키징을 할때, scope를 compile로 잡으면 기본적으로 WEB-INF/lib에 라이브러리를 복사한다.

이 작업이 임시 영역에서 이루어지는데...

나중에 scope를 compile -> provided로 바꾸더라도, 그 임시영역의 lib 파일들은 그대로 존재하게 되어, 같이 패키징된다.

이는 현재 버그로 등록 되어 있다. https://issues.sonatype.org/browse/MNGECLIPSE-2217

해결 방법은 임시영역에서 lib이하의 파일들을 지워주는 것

maven 사용하기#

ant에서는 build.xml 파일에서 프로젝트의 빌드,테스트,디플로이등을 기술한다면, maven에서는 pom.xml 파일을 이용한다.

pom.xml 에는 다음과 같은 정보를 저장하고 있다.

  • 프로젝트 정보 - 프로젝트의 이름, 개발자 등
  • 빌드 정보 - 플러그인 등 빌드와 관련된 설정을 기술
  • 의존성,연관성정보 - 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등을 기술

기본 프로젝트 형태#

maven에서 제시하고있는 best practice의 프로젝트 구성은 다음과 같다.

우리 회사 같은 경우에는 web application도 함께 개발하므로, src/main/webapp 라는 폴더가 추가될 것이다. 프로젝트 성격에 따라서 약간의 변동은 있겠지만,

기본적인 뼈대는 아래와 같다.

아래의 root디렉토리에 보면 pom.xml 파일이 있는데, 이 파일을 통해서 maven은 동작한다.

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

POM 파일의 형태#

POM 설정시의 용어 설명#

  • procject : pom.xml의 최상위 레벨 엘리먼트임
  • modelVersion : POM이 어떤 버전의 오브젝트 모델을 사용할 것인지
  • groupId : 프로젝트를 생성하기 위해 이용되는 유일한 그룹 아이디. 보통 소속 회사나 기관의 url명으로 사용함. eg. org.apache.maven.plugins 는 모든 maven plugin을 위한 그룹 id임
  • artifactId : 이 프로젝트에서 생성할 유니크한 이름. 보통 이 이름의 jar파일로 패키징된다. <artifactId>-<version>.<extenstion>으로 패키징된다.
  • packaging : JAR,WAR,EAR등 어떤 형태로 패키징할 것인지 기본값은 JAR이다.
  • version: 버전
  • name :
  • url :
  • description :

scope의 의미#

  • compile : 기본영역으로 아무것도 지정되지 않은 경우 사용됨. compile 의존관계에 있는 것은 프로젝트의 모든 클래스에서 사용가능함. 또한, 이와 같은 의존관계는 의존관계에 있는 프로젝트에 포함됨.
  • provided : compile 과 매우 유사하지만, 실행시 의존관계를 제공하는 JDK나 컨테이너에 대해서 적용됨. 예를 들어, JEE에 대한 웹 어플리케이션을 만드는 경우, 웹 컨테이너가 서블릿 API와 Java EE API관련 클래스들을 제공하기 때문에 provided 영역으로 의존관계가 세팅되어야 함. 이 영역은 컴파일과 테스트의 클래스패스 용으로 사용되며, 자동영역임.
  • runtime : 의존관계가 컴파일시 필요하지 않지만, 실행시 필요함을 의미함. 실행시와 테스트 클래스패스에 속하지만, 컴파일 클래스패스에는 속하지 않음.
  • test : 일반적인 어플리케이션 사용에 대해서는 의존관계가 필요없고, 테스트 컴파일과 실행 시점에만 사용됨.
  • system : 명시적으로 해당 JAR를 포함하는 것이 제공되어야 한다는 것을 제외하고 provided와 유사함. artifact는 항상 사용가능하며 레파지토리에서 검색하지 않음.
  • import (Maven 2.0.9 이후에서만 적용) : 이 영역은 <dependencyManagement>에서 pom의 의존관계에 대해서 사용됨. 지정된 POM이 해당 POM의 <dependencyManagement> 영역에 있는 의존관계로 대체됨을 의미함. 이것들이 대체되기 때문에 import 영역의 의존관계들은 실질적으로 의존에 대한 제약에 대해 관여하지 않음.
  • 참고 : http://homo-ware.tistory.com/43

servlet 개발을 위한 pom.xml 샘플#

  1. <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>MavenTestProject</groupId>
    <artifactId>MavenTestProject</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <build>
    <plugins>
    <plugin>
  2. <!-- java 1.5 이상의 문법을 지원하기 위해서는 다음 설정이 필요하다. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.5</source>
    <target>1.5</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
    <dependencies>
    <dependency>
  3. <!-- 서블릿 소스를 컴파일 하기 위해 필요하다. -->
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
    </project>

EJB 개발을 위한 pom.xml 샘플#

  1. <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>TestEJBM2</groupId>
    <artifactId>TestEJBM2</artifactId>
    <packaging>ejb</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <build>
    <plugins>
    <plugin>
  2. <!-- ejb 3.0 지원과,
  3. 배포용 클라이언트 제작( 기본적으로 **/*Bean.class, **/*CMP.class, **/*Session.class and **/package.html 파일을 제외하고 패키징함 )
  4. http://maven.apache.org/plugins/maven-ejb-plugin/howto.html 참고
  5. -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
    <ejbVersion>3.0</ejbVersion>
    <generateClient>true</generateClient>
    </configuration>
    </plugin>
    <plugin>
  6. <!-- java 1.5문법 지원 -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.5</source>
    <target>1.5</target>
    </configuration>
    </plugin>
    </plugins>
    </build>
    <dependencies>
    <dependency>
  7. <!-- 컴파일시 필요한 ejb관련 라이브러리 -->
    <groupId>javax.ejb</groupId>
    <artifactId>ejb-api</artifactId>
    <version>3.0</version>
    </dependency>
    <dependency>
  8. <!-- 컴파일시 필요한 jboss 관련 라이브러리(jboss runtime을 전부 포함하는 것은 아님 -->
    <groupId>jboss</groupId>
    <artifactId>jboss</artifactId>
    <version>4.2.3.GA</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
    <groupId>jboss</groupId>
  9. <!-- 컴파일시 필요한 jboss-annotation 관련 라이브러리-->
    <artifactId>jboss-annotations-ejb3</artifactId>
    <version>4.2.3.GA</version>
    <scope>provided</scope>
    </dependency>
    <dependency>
  10. <!-- 컴파일시 필요한 jboss-ejb3 관련 라이브러리-->
    <groupId>jboss</groupId>
    <artifactId>jboss-ejb3</artifactId>
    <version>4.2.3.GA</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
    </project>

maven의 settings.xml 파일 설정#

이 파일은 Maven의 사용자별 설정을 저장한다. pom.xml에 저장되지 않는, 개발자정보, 로컬 세팅, 레파지토리 정보등이 저장된다.

기본적으로 settings.xml 의 위치는 ~/.m2/settings.이다.

maven repository#

maven을 사용하여 외부 라이브러리를 추가할때, groupId나 artifactId를 미리 알 수없어서 난감할 수가 있다.

예를들어 groupId=jboss,artifactId=jboss,version=4.2.3.GA인데, 이 값을 미리 알기는 쉬운 일이 아니다.

이럴땐 maven repository 검색 사이트를 이용하자.

일부 라이브러리는 라이센스의 문제로, maven repository에 넣을수 없다고 한다. 이럴때는 InternalServer에 등록해놓고, 이용하면 된다.

eclipse 통합환경에서 maven 이용하기#

Dynamic Web Proejct 이용시#

  1. Dynamic Web Proejct 로 프로젝트를 만든다.
  2. m2eclipse 플러그인을 이용하여 Maven관리 프로젝트로 변환
  3. 생성한 프로젝트 폴더의 .settings/org.eclipse.wst.common.project.facet.core.xml 파일을 열어서, <faceted-project> 태그 밑에 '<installed facet="jst.web" version="2.5"/>' 를 추가해준다. (원래는 프로젝트의 Properites 다이얼로그에서 되어야 하는데, 이클립스 버그인지 잘 안된다. )
  4. 프로젝트의 WebContent 아래의 META-INF와 WEB-INF 파일을 src/main/webapp 밑으로 옮겨준다.
728x90

'JAVA' 카테고리의 다른 글

Hudson 이란?  (0) 2012.07.29
Maven 정보 - 2  (0) 2012.07.29
MAVEN 프로젝트가 ECLIPSE에서 실행되지 않는 문제  (0) 2012.07.29
class is not accessible due to restriction error 해결  (0) 2012.07.29
JSP에서 HTML 생성하기  (0) 2012.07.29

+ Recent posts