Maven

  • Maven : 프로젝트 관리 도구, 빌드 도구.
    • 빌드, 패키징, 문서화, 테스트/테스트 리포팅, git, 형상관리서버와 연동(SCMs), 배포 등의 작업 지원
    • Maven을 사용한다는 것은 CoC에 대해서 알아나가는 것이다.
    • CoC(Convention over Configuration)
      • 일종의 관습.
      • 예를 들자면 소스파일의 위치나 컴파일된 파일의 위치 등을 정해놓은 것.
    • 대표적인 장점은 편리한 의존성 라이브러리 관리
    • Maven에 설정한 대로 모든 개발자가 일관된 방식으로 빌드를 수행할 수 있게 된다.
  • 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>io.github.oraindrop</groupId>
        <artifactId>mavenweb</artifactId>
        <packaging>war</packaging>
        <version>0.0.1-SNAPSHOT</version>
        <name>mavenweb Maven Webapp</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>
TAG DESC
project pom.xml 파일의 최상위 root element
modelVersion POM model version
groupId 프로젝트를 생성하는 조직의 고유아이디. 일반적으로 도메인 이름을 거꾸로 표기
artifactId 해당 프로젝트에 의하여 생성되는 artifcat의 고유아이디
packaging 해당 프로젝트를 어떤 형태로 패키징 할 것인지 결정. jar, war, ear 등
version 프로젝트의 현재 버전. 프로젝트가 개발 중 일 때는 SNAPSHOT을 접미사로 사용
name 프로젝트 이름
url 프로젝트 사이트가 있다면 사이트 URL을 등록 가능
  • 위 pom.xml 파일에서 <dependencies> element가 Maven의 Dependency Management 기능의 핵심
    • 해당 element 안에 필요한 라이브러리를 명시하게 된다.

Eclipse에서 Maven Project생성.

  • 웹어플리케이션을 생성할 것이므로 Artifact Id maven-archetype-webapp 인 애로 프로젝트를 생성한다.
  • 아키타입(Archetype)은 일종의 프로젝트 템플릿.
    • 어떤 아키타입을 선택했느냐에 따라 자동으로 여러 파일들을 생성하거나 라이브러리를 세팅함.

1) Java Compiler 설정.

  • Maven으로 프로젝트를 생성하면 기본적으로 JDK 1.5를 사용한다.
  • JDK8을 사용하고 싶으므로 pom.xml의 <build> element를 수정한다.
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>

project properties의 Maven Tap의 Java EE Integration항목의 Enable Project Specific Settings를 Check.
project properties에서 Java Compiler 버전이 1.8로 설정된 것을 확인할 수 있다.

2) WAS 설정.

  • WAS의 서블릿 라이브러리를 사용하고 싶으므로
  • pom.xml의 <dependency> element를 수정한다.
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

scope element는 다음과 같은 4가지 속성이 존재.

scope DESC
compile 컴파일 할 때 필요. 테스트 및 런타임에도 클래스 패스에 포함. Default 값.
runtime 런타임에 필요(ex. JDBC Driver 등). 컴파일 시 필요하지 않지만 실행 시에 필요한 경우.
provided 컴파일 시에 필요하지만, 실제 런타임 때에는 컨테이너 등에서 제공되는 모듈(ex. servlet, jsp api 등). 배포 시 제외된다.
test 테스트 코드를 컴파일 시 필요. 테스트 시 클래스 패스에 포함되며, 배포 시 제외된다.


3) JSTL Library 설정.

  • pom.xml
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
  • Maven Project의 다이나믹 웹 모듈 버전은 Defalut 2.3 이다.
  • 다이나믹 웹 모듈 2.4부터 EL이 기본으로 사용될 수 있기에, 다이나믹 웹 모듈 3.1이 되도록 설정해야 한다.

4) 다이나믹 웹 모듈 버전 설정.

  • WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

위 xml 소스가 default 값이다. 아래와 같이 변경한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>Archetype Created Web Application</display-name>
</web-app>
  • .settings/org.eclipse.wst.common.project.facet.core.xml
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
  <fixed facet="wst.jsdt.web"/>
  <installed facet="jst.web" version="2.3"/>
  ...

위 xml 소스가 default 값이다. jst.web의 version을 3.1로 수정한다.
project properties의 project facets 항목의 다이나믹 웹 모듈버전이 3.1로 변경된 것을 확인한다.

5) Run on Server.

  • 이클립스의 버그로, 수정되기 전의 데이터와 수정된 데이터가 섞여 오류가 발생할 확률이 높다.
  • 해결 과정.
    • project 우측클릭 > Maven 메뉴 > update project.
    • Servers view에서 기존 Tomcat Runtime을 삭제
    • Project 메뉴의 Clean.
    • 프로젝트 익스플로러에서 Server 삭제
  • 이후 재실행 시 결과가 정상적으로 출력.