ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Maven에 대해서 알아보자
    JAVA/Java 2020. 8. 30. 20:29

     

    메이븐 이란?

     

    자바용 프로젝트 빌드, 관리에 사용되는 도구이다. 아파치 앤트(Ant)의 대안으로 만들어졌다. 아파치 라이선스로 배포되는 오픈 소스 소프트웨어이다.

     

     

    메이븐의 특징은?

     

     

    1. 빌드 절차를 간소화하는 빌드 도구이다.

     

    빌드란? 

    •  소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정, 결과물 

    • ex) 우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(. xml,. jpg,. jar,. properties)을 JVM이나 톰캣 같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.

    빌드 도구란?

     

    •  빌드 도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램.

    •   빠른 기간 동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장

    • 초기의 java 빌드 도구로 Ant를 많이 사용하였으나 최근 많은 빌드 도구들이 생겨나 Maven이 많이 쓰였고, 현재는 Gradle이 많이 쓰인다.

    • Ant는 스크립트 작성도 많고, 라이브러리 의존 관리가 되지 않아 불편하다.

     

     2. 동일한 빌드 시스템 제공

     

     3. 프로젝트 정보 제공

     


    Ant 와의 차이점

    • Ant는 비교적 자유도가 높은 편
          (Ant : 전처리 / 컴파일 / 패키징 / 테스팅 / 배포 가능)
    • Maven은 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능까지 포함.
          (Build Tool + Project Management)

    Gradle과의 차이점

     

    • XML 대신 groovy 스크립트를 사용하여 동적인 빌드 가능.
    • maven은 멀티프로젝트에서 상속 구조인데, gradle은 주입 방식이다. 멀티프로젝트에서 gradle이 더 적합하다.

    플러그인

    • 메이븐은 플러그인을 구동해주는 프레임워크(plugin execution framework)이다. 모든 작업은 플러그인에서 수행한다.

    • 플러그인은 다른 산출물(artifacts)과 같이 저장소에서 관리된다.

    • 메이븐은 여러 플러그인으로 구성되어 있으며, 각각의 플러그인은 하나 이상의 goal(명령, 작업)을 포함하고 있다. Goal은 Maven의 실행 단위이다.

    • 플러그인과 골의 조합으로 실행한다.  ex. mvn <plugin>:<goal> = mvn archetype:generate

    • 메이븐은 여러 goal을 묶어서 lifecycle phases로 만들고 실행한다. ex. mvn <phase> = mvn instal

    •  
    구분 Plugin 명 설명
    core plugins clean, compiler ,deploy, install,verifier,resources,site 기본 단계에 핵심 플러그인
    Packaging types/tools ear, ejb ,jar, rar, war, app-client 압축 도구
    Reporting plugins changelog, changes, checkstyle, javadoc 리포팅 도구

     

     

    플러그인 목록들

    maven.apache.org/plugins/index.html

     

    Maven – Available Plugins

    Available Plugins Maven is - at its heart - a plugin execution framework; all work is done by plugins. Looking for a specific goal to execute? This page lists the core plugins and others. There are the build and the reporting plugins: Build plugins will be

    maven.apache.org

     


    라이프사이클

    •  메이븐은 프레임워크이기 때문에 동작 방식이 정해져 있고, 미리 정의하고 있는 빌드 순서가 있다. 이를 라이프사이클(Lifecycle)이라 한다. 
    • 메이븐은 프로젝트 생성에 필요한 단계(phases)들을 Build Lifecycle이라 정의하며
    • default, clean, site 세 가지로 표준 정의한다.
    • Lifecycle은 Build Phase 들로 구성되며 일련의 순서를 갖는다.
    • phase는 실행 단위로서 goal과 바인딩된다.

     

     

     

    clean : 빌드 시 생성되었던 산출물을 삭제

    1. pre-clean : clean 작업 전에 사전작업
    2. clean : 이전 빌드에서 생성된 모든 파일 삭제
    3. post-clean : 사후 작업

    default : 프로젝트 배포 절차, 패키지 타입별로 다르게 정의됨

    1. validate : 프로젝트 상태 점검, 빌드에 필요한 정보 존재 유무 체크
    2. initialize : 빌드 상태를 초기화, 속성 설정, 작업 디렉터리 생성
    3. generate-sources : 컴파일에 필요한 소스 생성
    4. process-sources : 소스코드를 처리
    5. generate-resources : 패키지에 포함될 자원 생성
    6. compile : 프로젝트의 소스코드를 컴파일
    7. process-classes : 컴파일 후 후처리
    8. generate-test-source : 테스트를 위한 소스 코드를 생성
    9. process-test-source : 테스트 소스코드를 처리
    10. generate-test-resources : 테스팅을 위한 자원 생성
    11. process-test-resources : 테스트 대상 디렉터리에 자원을 복사하고 가공
    12. test-compile : 테스트 코드를 컴파일
    13. process-test-classes : 컴파일 후 후처리
    14. test : 단위 테스트 프레임워크를 이용해 테스트 수행
    15. prepare-package : 패키지 생성 전 사전작업
    16. package : 개발자가 선택한 war, jar 등의 패키징 수행
    17. pre-integration-test : 통합 테스팅 전 사전작업
    18. integration-test : 통합 테스트
    19. post-integration : 통합 테스팅 후 사후 작업
    20. verify : 패키지가 품질 기준에 적합한지 검사
    21. install : 패키지를 로컬 저장소에 설치
    22. deploy : 패키지를 원격 저장소에 배포

    site : 프로젝트 문서화 절차

    1. pre-site : 사전작업
    2. site : 사이트 문서 생성
    3. post-site : 사후 작업 및 배포 전 사전작업
    4. site-deploy : 생성된 문서를 웹 서버에 배포

    최종 빌드 순서는 compile - test - package이다. 

     

    • compile : src/main/java 디렉터리 아래의 모든 소스 코드가 컴파일된다.
    • test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드 컴파일된다.
    • packaging : 컴파일과 테스트가 완료된 후, jar, war 같은 형태로 압축하는 작업.

     


    의존성

    • 개발자는 프로젝트에 사용할 라이브러리를 pom.xml에 dependency로 정의만 해두면
    • 메이븐이 repository에서 검색해서 자동으로 추가해준다.
    • 심지어 참조하고 있는 library까지 모두 찾아서 추가해준다. 이것을 '의존성 전이'라고 한다.

    의존관계 제한 기능

    불필요한 라이브러리 다운로드를 방지하기 위해 추가 기능을 제공한다.

    • Dependency mediation : 버전이 다른 두 개의 라이브러리가 동시에 의존 관계에 있을 경우 Maven은 좀 더 가까운 의존관계에 있는 하나의 버전만을 선택
    • Dependency management : 직접 참조하지는 않으면서 하위 모듈이 특정 모듈을 참조할 경우, 특정 모듈의 버전을 지정
    • Dependency scope : 현재 Build 단계에 꼭 필요한 모듈만 참조할 수 있도록 참조 범위를 지정
      • compile : 기본값, 모든 classpath에 추가, 컴파일 및 배포 때 같이 제공
      • provided : 실행 시 외부에서 제공, 예를 들면 WAS에서 제공되어 지므로 컴파일 시에는 필요하지만, 배포 시에는 빠지는 라이브러리들
      • runtime : 컴파일 시 참조되지 않고 실행 때 참조
      • test : 테스트 때만
      • system : 저장소에서 관리하지 않고 직접 관리하는 jar 파일을 지정
      • import : 다른 pom파일 설정을 가져옴, <dependencyManagemet>에서만 사용
    • Excluded dependencies : 임의의 모듈에서 참조하는 특정 하위 모듈을 명시적으로 제외처리
    • Optional dependencies : 임의의 모듈에서 Optional로 참조된 모듈은 상위 모듈이 참조될 때 Optional 모듈은 참조 제외

    의존 라이브러리의 경로

    • 로컬 : USER_HOME/. m2/repository에 저장된다.

     


    profile

    • Maven은 서로 다른 환경에 따라 달라지는 설정을 각각 관리할 수 있는 Profile 기능을 제공한다.

     


    POM.xml

    • pom.xml 은 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일
    • pom은 프로젝트 객체 모델(Project Object Model)을 뜻한다.
    • 프로젝트 당 1개가 있으며 것만 보면 프로젝트의 모든 설정, 의존성 등을 알 수 있다.

    엘리먼트

    • <groupId> : 프로젝트의 패키지 명칭

    • <artifactId> : artifact 이름, groupId 내에서 유일해야 한다.

      <groupId> org.springframework </groupId> <artifactId> spring-webmvc </artifactId>
    • <version> : artifact의 현재 버전 ex. 1.0-SNAPSHOT

    • <name> : 애플리케이션 명칭

    • <packaging> : 패키징 유형(jar, war 등)

    • <distributionManagement> : artifact가 배포될 저장소 정보와 설정

    • <parent> : 프로젝트의 계층 정보

    • <dependencyManagement> : 의존성 처리에 대한 기본 설정 영역

    • <dependencies> : 의존성 정의 영역

    • <repositories> : 이거 안 쓰면 공식 maven 저장소를 활용하지만, 사용하면 거기 저장소를 사용

    • <build> : 빌드에 사용할 플러그인 목록을 나열

    • <reporting> : 리포팅에 사용할 플러그인 목록을 나열

    • <properties> : 보기 좋게 관리 가능, 보통 버전에 많이 쓴다.


     

     


    출처: http://maven.apache.org/
    출처: https://sjh836.tistory.com/131

     

    Maven – Welcome to Apache Maven

    Welcome to Apache Maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. If you

    maven.apache.org

     

     

    'JAVA > Java' 카테고리의 다른 글

    자바 데이터 타입, 변수, 배열  (0) 2020.12.26
    JAVA 연산자  (0) 2020.11.29
    서블릿 Life Cycle 알아보기  (0) 2020.06.02
    왜 Wrapper 클래스는 쓰이는 걸까?  (1) 2020.05.21
    객체의 해시코드(hashCode())란  (0) 2020.05.19
Designed by Tistory.