Maven 2015 Web Service Computing
Maven 이란? Apache 프로젝트 소스코드로부터배포가능한산출물 (artifact) 을빌드 (build) 하는 ' 빌드툴 (build tool)' 조금더편리한 ' 프로젝트관리툴 Maven 이없다면? 라이브러리를직접다운로드해서등록하고 path 를지정해줘야한다.
Build 소스코드를컴파일한다. 테스트코드를컴파일한다. 기타패키지생성을위한바이너리를생성한다. Package Test 배포가능한 jar, war 파일등을생성한다. 단위테스트 (Unit Test) 등을실행한다. 빌드결과가정상적인지점검한다. Report 빌드 / 패키지 / 테스트결과를정리하고, 빌드수행리포트를생성한다. Release Maven 활용패턴 빌드후생성된아티팩트 (artifact) 를로컬혹은원격저장소에저장 ( 배포 ) 한다.
5 가지핵심개념 (Key Concepts) 의존성 (Dependency) POM 라이프사이클 (Lifecycle) 플러그인 (Plugin) 프로필 (Profile)
의존성 (dependency) 라이브러리다운로드자동화 더이상필요한 ( 의존성있는 ) 라이브러리를하나씩다운로드받을필요가없다. 필요하다고선언만하면메이븐이자동으로다운로드받아준다. 메이븐은선언적 ( 명령식이아니다 ) 사용되는 jar 파일들을어디서다운로드받고, 어느릴리즈 ( 버전 ) 인지명시하면, 코딩을하지않아도메이븐이알아서관리한다. ( 재다운로드, 최신버전설치등 ) 메이븐이관리한다. 라이브러리 (lib) 디렉토리를생성할필요가없다. 라이브러리, 클래스패스환경설정을할필요도없다.
의존성 (dependency) 기존방식 (lib) 폴더를직접만들고다운받은라이브러리를복사함 클래스패스를지정해줘야함
의존성 (dependency) pom.xml 에 mysql-connector 버전을 5.1.34 로선언한모습
의존성 (dependency) pom.xml 에 mysql-connector 버전을 5.1.6 으로변경한후의모습 Maven 은간단한선언만으로라이브러리를자동다운로드하고변경할수있게한다.
POM POM = Project Object Model, 프로젝트객체모델 프로젝트당하나의 pom.xml 각각의프로젝트는 pom.xml 파일을하나씩가진다. pom 은프로젝트자체와의존성에대한설정및정보를포함한다. 메이븐을 pom.xml 을읽어프로젝트를가공하는방법을이해한다. 3 가지 coordinates 를이용해자원을식별한다. 그룹 ID (Group ID) : koreatech.cse 아티펙트 ID (Artifact ID) : wsc 버전 (Version) : 001
POM <name/> 어플리케이션의명칭 <packaging/> 아티팩트 (artifact) 패키징유형 POM, jar, WAR, EAR, EJB, bundle,... 중에서선택가능 <parent/> 프로젝트의계층정보 <dependencies/> 의존성정의및설정영역 <artifactid/> 아티팩트의명칭 (Artifact s name), groupid 범위내에서유일해야한다. <groupid/> 일반적으로프로젝트의패키지명칭 <version/> 아티팩트 (artifact) 의현재버전
플러그인 (Plugin) 메이븐 (Maven) 은플러그인실행프레임워크이다. 메이븐의플러그인메커니즘에의해기능이확장된다. ( 모든작업은플러그인이수행한다 ) 플러그인은다른산출물 (artifacts) 과같이저장소에서관리된다. plugin 들은몇가지 goal 기능들을제공해주고, 프로젝트마다의필요에따라서유연하고설정해사용하도록되어있다.
플러그인 (Plugin) 메이븐은여러가지플러그인으로구성되어있으며, 각각의플러그인은하나이상의 goal ( 명령, 작업 ) 을포함하고있다. Goal 은플러그인과 goal 명칭의조합으로실행할수있다. 형식 : <plugin>:<goal> 예시 : mvn archetype:generate 메이븐은여러 goal 을묶어 라이프사이클단계 (lifecycle phases) 로만들고실행한다. 형식 : mvn <phase name> 예시 : mvn install
플러그인선언예시 pom.xml 플러그인 (Plugin) <build> <plugins> <plugin> <artifactid>maven-compiler-plugin</artifactid> <version>2.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build>
라이프사이클 (Lifecycle) 일반적으로소프트웨어프로젝트는컴파일, 테스트, 패키징, 인스톨과같은비슷한전형적인단계들을갖는다. 이러한단계는 Goal 들로구성된다. Goal 은특정작업, 최소한의실행단위 (task) 이다. Maven 에서는이러한단계를 Build Life Cycle 이라고부른다. 빌드단계 (build phases) 들은사전정의된순서대로실행된다. 모든빌드단계는이전단계가성공적으로실행되었을때실행된다.
라이프사이클 (Lifecycle) 단계 (phase) 는논리적인개념이며, 실질적인작업을수행하는것은각각의단계에연결 (associate) 된플러그인 goal 이다. 패키지타입 (package type : jar, war, ear 등 ) 에따라각단계에서수행되는 goal 이달라질수있다.
라이프사이클 (Lifecycle) 메이븐은 3 개의표준라이프사이클을제공한다. clean : 빌드시생성되었던산출물을지운다. clean : 이전빌드에서생성된모들파일들을삭제한다. default : 일반적인빌드프로세스를위한모델이다. test : 적합한단위테스트프레임워크를이용해테스트를수행한다. 테스트코드는패키지되거나배포된패키지없이실행될수있어야한다. package : 컴파일된코드등을이용해 jar 등의패키지파일을생성한다. deploy : 다른개발자혹은프로젝트와공유할수있도록원격저장소에최종패키지를배포한다. site : 프로젝트문서와사이트작성을수행한다. site : 프로젝트사이트문서를생성한다. https://maven.apache.org/ref/3.3.3/maven-core/lifecycles.html
라이프사이클 (Lifecycle) 메이븐라이프사이클 (mvn clean) 을실행해보자. /target 폴더에내용이삭제되었는지확인해보자.
서로다른대상환경 (target environment) 를위한다른빌드설정 다른운영체제 다른배포환경 프로필 (Profile) 동작방식 (Activation) (-P) 명령행실행환경 (CLI) 옵션 예 : mvn package P prod 환경변수 (environment variable) 기반 메이븐은정상절차 (step) 이외에프로파일을위한절차를추가로수행한다.
프로필, 빌드선언예시 pom.xml <profiles> <profile> <id>prod</id> <properties> <env>prod</env> </properties> </profile> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activebydefault>true</activebydefault> </activation> </profile> </profiles> 프로필 (Profile) <build> <resources> <resource> <directory>src/main/resources/common</directory> </resource> <resource> <directory>src/main/resources/${env}</directory> </resource> </resources> </build>
실습 Maven profile 에따라환경구성을달리하고서버에배포 (prod 환경설정 ) 해보자. 1) /env 라는주소로접속하면개발서버에서는 Hello, This is dev, 배포서버에서는 Hello, This is prod 가출력되게환경구성을하자. (@Value, config.properties 를이용 ) 2) intellij 를이용하지않고톰캣을직접실행시켜확인해보자.
실습 1) /src/main/resources 폴더를다음과같이구성한다. /src/main/resources/common 은공통적인설정파일위치 (services.xml) /src/main/resources/dev 와 /src/main/resources/prod 는각각의 profile 에따른설정파일위치 (config.properties) 2) services.xml 에다음과같이적어주자. <context:property-placeholder location="classpath:config.properties" /> 3) 각 profile 별 config.properties 에환경구성에대한내용을적는다. env.text=this is dev
Maven 실행설정 프로필적용배포 /target 폴더내에.war 파일이생성되었는지확인
프로필적용배포 앞서.war 파일을톰캣폴더 /webapps 폴더에복사 톰캣실행 ( 명령창에서톰캣폴더 /bin/startup.bat 실행 )
프로필적용배포 톰캣이실행되면서 war 압축이풀리고웹어플리케이션실행 http://localhost:8080/wsc-001/env 로접속해서확인
Maven Plugin 을추가하여프로젝트품질향상을위해보고서를생성할수있다. 예 ) PMD 는정적분석도구로자바소스코드를스캔하여잠재적인문제를찾을수있다. 찾을수있는결함 잠재적버그 사용하지않는코드 너무복잡한코드 중복된코드 pom.xml Site <reporting> <excludedefaults>true</excludedefaults> <plugins> <plugin> <artifactid>maven-pmd-plugin</artifactid> <version>3.1</version> <configuration> <targetjdk>1.7</targetjdk> </configuration> </plugin> </plugins> </reporting>
Maven 실행설정 Site
Site 위와같이추가한후 mvn clean site 명령어를실행하면 target/site 라는디렉토리가생기고 html 문서로써프로젝트보고서를볼수있다. 어느부분에문제가있는지이유와함께라인번호가나오고, 해당사항을수정함으로써프로젝트품질향상을할수있다.