BASIC
- maven 홈페이지
- Maven 은 여러 플러그인을 구동시키는 엔진 역할을 한다. +Dependecy Mechanism
- Build Lifecycle - Maven 은 Lifecycle - phase - goal 로 이루어진다.
- A Build Lifecycle is Made Up of Phases
- A Build Phase is Made Up of Plugin Goals
- Profile
- 프로파일 기능을 이용하여 조건에 따라서 JDK 를 다른 버전으로 build 하거나 특정 환경에 맞게 packaging 가능
- maven profile 은 환경마다 빌드를 새로 해야 하는 문제가 있으니 이것보다는 spring profile 이 권장됨
- settings.xml
- proxy 설정, auth 정보 등을 기술
- 명시 하지 않으면 관례적 경로를 따른다.
~/.m2/settings.xml
- Snapshot :
-snapshot
postfix 가 붙은 버전은 형상이 바뀔 수 있다. night build, canary 개념.
Command 의 구성
mvn clean dependency:copy-dependencies package
- phase :
clean
,dependency
,package
- goal :
copy-dependencies
- phase :
- Command samples
- Skip test :
-Dmaven.test.skip=true
- Build only sub project :
mvn -pl dir clean install
- Check all snapshot update :
mvn -U
- describe plugin :
plugin:describe
- set profile :
mvn mygoal -P profile-1,profile-2
- Skip test :
Maven parent pom vs modules pom
- Introducing POM
- maven-parent-pom-vs-modules-pom
- nested module 반대 의견 글
- M2Eclipse 가 지원 안한다
- 빌드가 잘 깨지더라
- 빌드시간이 길어 지더라
- monolithic 한 프로젝트를 유도 하더라.
- pluginManagement vs plugin
- 여러 모듈들간에 설정 내용을 공유할 때 사용.
plugins
는 해당 파일에서만 사용할 경우에 사용 - pluginManagement 는 parent-child 구조 일 때 사용하면 된다.
- 여러 모듈들간에 설정 내용을 공유할 때 사용.
Parent pom - Project Inheritance
Moduels pom - Project Aggregation
- groupId, version 은 parent-pom 과 공유
- 개별 모듈이 별도의 버전을 가질수 없음.
Jacoco
- Unit test 산출물
- csv : target/site/jacoco/jacoco.csv (covered, missed 내용이 들어 있다)
- jacoco-exec : 바이너리 파일
Dependency
- Dependency Scope : 원본 한글
- compile : 기본영역으로 아무것도 지정되지 않은 경우 사용됨. compile 의존관계에 있는 것은 프로젝트의 모든 클래스에서 사용가능함. 또한, 이와 같은 의존관계는 의존관계에 있는 프로젝트에 포함됨.
- provided : compile 과 매우 유사히지만, 실행시 의존관계를 제공하는 JDK나 컨테이너에 대해서 적용됨. 예를 들어, JEE에 대한 웹 어플리케이션을 만드는 경우, 웹 컨테이너가 서블릿 API와 Java EE API관련 클래스들을 제공하기 때문에 provided 영역으로 의존관계가 세팅되어야 함. 이 영역은 컴파일과 테스트의 클래스패스 용으로 사용되며, 자동영역임.
- runtime : 의존관계가 컴파일시 필요하지 않지만, 실행시 필요함을 의미함. 실행시와 테스트 클래스패스에 속하지만, 컴파일 클래스패스에는 속하지 않음.
- test : 일반적인 어플리케이션 사용에 대해서는 의존관계가 필요없고, 테스트 컴파일과 실행 시점에만 사용됨.
- system : 명시적으로 해당 JAR를 포함하는 것이 제공되어야 한다는 것을 제외하고 provided와 유사함. artifact는 항상 사용가능하며 레파지토리에서 검색하지 않음.
- import (Maven 2.0.9 이후에서만 적용) : 이 영역은
에서 pom의 의존관계에 대해서 사용됨. 지정된 POM이 해당 POM의 영역에 있는 의존관계로 대체됨을 의미함. 이것들이 대체되기 때문에 import 영역의 의존관계들은 실질적으로 의존에 대한 제약에 대해 관여하지 않음.
Deploy artifact
deploy 설정을 하면 배포 할 수 있다.
pom.xml
<distributionManagement>
<repository>
<id>my-nexus-release</id>
<url>http://{NEXUS-REL}</url>
</repository>
<snapshotRepository>
<id>my-nexus-snapshots</id>
<url>http://{NEXUS-SNAPSHOT}</url>
</snapshotRepository>
</distributionManagement>
- settings.xml
<servers>
<server>
<id>my-nexus-release</id>
<username>uname</username>
<password>passwd</password>
</server>
<server>
<id>my-nexus-snapshots</id>
<username>uname</username>
<password>passwd</password>
</server>
</servers>
Repository
- repository 에서 다운받는 artifact 는 ${M2_HOME} 환경 변수에 지정된 폴더에 저장된다.
${M2_HOME} 가 지정되지 않았을 경우 ${user.home}/.m2/ 가 관례상 사용된다.
- maven update policy
- always - always check when Maven is started for newer versions of snapshots
- never - never check for newer remote versions. Once off manual updates can be performed.
- daily (default) - check on the first run of the day (local time)
- interval:XXX - check every XXX minutes
<repository>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http://snapshots.maven.codehaus.org/maven2</url>
<layout>default</layout>
</repository>
Plugins
대표 플러그인들
- Surefire : The Surefire Plugin is used during the test phase of the build lifecycle to execute the unit tests of an application. It generates reports in 2 different file formats
- jacoco : provides code coverage metrics for Java code via integration with JaCoCo.
- compiler : The Compiler Plugin is used to compile the sources of your project.
- shade : 의존성을 포함한 실행 가능한 single jar(uber-jar)
Compiler
- 자바 버전 지시자 설정 방법
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
Spotify dockerfile
- (Spotify dockerfile)https://github.com/spotify/dockerfile-maven
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<!-- execution phase 설정 -->
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>${project.artifactId}/${project.name}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
tomcat7 plugin
tomcat7-maven-plugin - 메이븐에서 톰캣 구동해서 app deploy 하기
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost/manager/text</url>
<username>admin</username>
<password>admin</password>
<path>/${project.artifactId}.war</path>
</configuration>
</plugin>
mvn tomcat7:deploy
mvn tomcat7:undeploy
mvn tomcat7:redeploy
Docker 의 경우 remote 로 인식 하기 때문에 manager 의 설정도 바꿔야 한다.
manager.xml
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="^.*$" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="admin" roles="manager-gui,manager-script"/>
</tomcat-users>
# Manager setup for "/service/smps/web"
RUN mkdir -p /service/smps/web/
RUN mv /usr/local/tomcat/webapps.dist /service/smps/web/app/
COPY manager-context.xml /service/smps/web/app/manager/META-INF/context.xml
# Add user for manager
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml