도전

Maven

oncerun 2021. 2. 23. 19:13
반응형

역시 자바 개발자라면 친숙하고 gradle로 넘어가도 사용하게 되는 빌드 툴이다.

 

간단하게 흐름을 알고 가자. it의 기술은 나날이 발전하며, 새로운 기술이 끊임없이 쏟아지며, 그중 표준이 된 아이템들은 산업계를 흔든다. 메이븐도 마찬가지였을 것이라고 생각한다. (그렇게 늙진 않아서..)

 

Ant를 아는가? 난 모른다. 하지만 위키백과가 존재한다.

 

Apache Ant는 자바 언어 진영에서 사용하는 자동화된 소프트웨어 빌드 도구이다.  메이븐 하면 의존성 관리만 생각하는 사람들이 꽤 있다.  IDE가 없어야 maven에 더관심을 갖지 않을까 한다.

우리는 IDE를 사용해 소스코드를 컴파일하고 실행한다. 이과정에서 테스트도 중간중간하면서 말이다.

그러면 의문을 가져야 한다. 왜 IDE에서 프로젝트를 만들 때 gradle, maven , ant 중 고르라고 하는 것이지?

그 답은 프로젝트를 관리해주기 위함이다. 

 

다시 돌아와서 나는 Maven을 관습이 아주 강해 쉽게 떨치기 어려운 빌드 도구라고 생각한다.

우리는 왜 자바로 프로젝트를 만들 때 src로 시작하는 파일 아래에 소스코드를 짜고 테스트를 진행하는가?

바로 메이븐에서 프로젝트를 관리해 주기 위한 파일 구조를 정해두었기에 메이븐은 당연히 해당 프로젝트가 그러한 구조를 가질 것이라 생각하고 관리해준다.

 

메이븐의 철학을 알아보니 관습으로 인해 더 편해진다라는 철학을 가지고 있다.

 - 소스/실행파일/디렉터리 명칭을 보고 단숨에 파악할 수 있다.

 - 설정 작업이 편리해진다.

 

여기서 관리란? 뭘까? 맞다 바로 프로젝트가 실행 가능한 상태인지 아닌지, 테스트 결과가 어떤지, 각종 라이브러리들의 의존 관계가 잘 설정됐는지 등등 더 많은 일들을 진행해 우리의 프로젝트를 관리해 준다.

 

빌드 툴 && 프로젝트 관리 툴 두 가지를 가지고 있는 것이 바로 메이븐이라고 생각한다.

 

크게 메이븐에는 패턴이 존재한다.

  • 빌드 : 소스, 테스트 코드를 컴파일하고 기타 패키지 생성을 위한 바이너리 생성
  • 패키지 : 배포 가능한 형태로 프로젝트를 파일로 생성
  • 테스트 : 단위 테스트, 빌드 결과가 정상적인지 점검
  • 리포트 : 빌드/패키지/테스트 결과를 정리하고 보고서 작성
  • 릴리즈 : 빌드 후 생성된 아티팩트를 로컬/원격에 저장한다.

 

우리는 pom.xml에 더 친근하지 settings.xml에 친하지 않다.

그래서 setting.xml부터 알아보자.

 

Maven이 제공하는 공식문서를 확인하면서 공부한다. 

maven.apache.org/settings.html

 

Maven – Settings Reference

Quick Overview The settings element in the settings.xml file contains elements used to define values which configure Maven execution in various ways, like the pom.xml, but should not be bundled to any specific project, or distributed to an audience. These

maven.apache.org

소개: settings.xml은 여러 방식으로 Maven 실행을 구성하는 값을 정의하는 데 사용하는 요소가 pom.xml처럼 존재하지만, 특정 프로젝트에 포함되어 배포되서는 안 됩니다. 그 이유는 로컬 저장소 위치, 대체 원격 저장소 서버 및 인증 정보와 같은 값이 포함됩니다.

 

settings.xml파일이있을 수 있는 위치는 두 가지입니다 .

  • Maven 설치 : ${maven.home}/conf/settings.xml
  • 사용자의 설치 : ${user.home}/.m2/settings.xml

Maven설치의 settings.xml은 전역 설정이라 고도하고 사용자의 설치는 사용자 설정이라고 합니다.

두 파일이 모두 존재 시 내용이 병합되고 사용자 settings.xml이 우선 적용됩니다.

 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository/>
      <interactiveMode/>
      <offline/>
      	<pluginGroups>
   			 <pluginGroup>org.eclipse.jetty</pluginGroup>
  		</pluginGroups>
      <servers/>
      <mirrors/>
      <proxies/>
      <profiles/>
      <activeProfiles/>
    </settings>

 

  • localRepository : 이 값은 빌드 시스템의 로컬 저장소 경로입니다. 기본값은 ${user.home}/. m2/repository입니다. 이 요소는 로그인한 모든 사용자가 로컬 저장소에서 빌드할 수 있도록 하는 기본 빌드 서버에서 유용합니다.
  • interactioveMode : 기본값은 true이며 입력을 위해 사용자와 상호 작용을 시도하는지 여부
  • offline : 빌드 시스템이 오프라인 모드에서 작동해야 하는 경우 true로 설정하며 기본 값은 false입니다. 네트워크 설정이나 보안상의 이유로 원격 저장소에 연결할 수 없는 서버에 유용합니다.

PluginGroups

이 요소는 pluginGroup 요소를 포함하고, groupId도 가지고 있습니다. 플러그인을 사용하고 명령 줄에 groupId가 제공되지 않은 경우 목록이 검색됩니다. 

 

* 메이븐은 플러그인 실행 프레임워크라고도 한다. 모든 작업은 플러그인이 수행하며 다른 아트 팩트와 같이 저장소에서 관리되며 goal의 집합이다. 

 

메이븐은 라이프 사이클을 만들고 실행한다. 이때 각 단계들을 논리적으로 구성하고 논리적인 단계에서 실질적으로 일을 하는 것은 goal이다.  goal은 플러그인과 goal명칭의 조합으로 실행할 수 있다. 각 단계에서 실패 시 빌드 실패로 간주하며 각 단계들은 이전 단계에 의존해 성공과 실패로 나뉜다.

ex) archetype(플러그인):generate(goal 명칭)

 

Server

 

 <servers>
    <server>
      <id>server001</id>
      <username>my_login</username>
      <password>my_password</password>
      <privateKey>${user.home}/.ssh/id_dsa</privateKey>
      <passphrase>some_passphrase</passphrase>
      <filePermissions>664</filePermissions>
      <directoryPermissions>775</directoryPermissions>
      <configuration></configuration>
    </server>
  </servers>

id : Maven이 연결을 시도하는 저장소/ 미러의 요소와 일치하는 서버의 id입니다.

username, password : 해당 서버에 인증하는데 필요한 정보들

privateKey, passphrase : username,password 두 쌍과 같이 이 쌍의 개인키가 있는 경로는   default=${user.home}/. ssh/id_dsa에 기본 값으로 존재하며, passphrase는 미래에 요구조건으로 필요로 합니다. 하지만 현재는 단순한 텍스트로 settings.xml파일 안에 존재합니다.

 * 개인 키 사용해 서버에 로그인하는 경우 password요소 생략해야 함.

filePermissions, directoryPermissions : 배포 시 저장 파일 또는 디렉터리가 생성될 때 사용할 권한입니다.  

 

mirrors 친숙한 이름은 다들 아실 거라 생각합니다.

 

proxy

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...
  <proxies>
    <proxy>
      <id>myproxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.somewhere.com</host>
      <port>8080</port>
      <username>proxyuser</username>
      <password>somepassword</password>
      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
    </proxy>
  </proxies>
  ...
</settings>
  • id :이 프락시의 고유 식별자입니다. proxy요소 를 구별하는 데 사용됩니다.
  • active : true이 프락시가 활성화 된 경우. 이것은 프록시 집합을 선언하는 데 유용하지만 한 번에 하나만 활성화될 수 있습니다.
  • protocol , host , port : protocol://host:port개별 요소로 구분된 프락시의입니다.
  • username , password : 이러한 요소는 이 프락시 서버에 인증하는 데 필요한 로그인 및 비밀번호를 나타내는 쌍으로 나타납니다.
  • nonProxyHosts : 프락시하지 않아야하는 호스트 목록입니다. 목록의 구분 기호는 예상되는 프록시 서버 유형입니다. 위의 예는 파이프로 구분되어 있으며 쉼표로 구분된 것도 일반적입니다.

 

Project Object Model 

프로젝트 당 하나의 pom.xml를 가지고 있다. 만약 target폴더에 pom.xml이 있다고 해도 놀랄 필요 없다. 빌드의 산출물을 저장하는 곳이기에 중요하지 않으면서도 중요하다.

메이븐은 이 pom.xml을 읽어 프로젝트를 가공하는 방법을 이해한다. 

 

주요 속성들

<artifactId> 아티팩트의 명칭,groupId 범위 내에서 유일해야한다.
<groupId> 프로젝트의 패키지 명칭/
<version> 아티팩트의 버전
<name> 어플리케이션 이름
<packaging> 아티팩트 패키징 유형
<distributionManagement> 아티팩트가 배포될 저장소 정보와 설정
<dependencies> 의존성 정의 및 설정 영역

 

반응형