Maven은 무엇입니까? Java 용 빌드 및 종속성 관리

Apache Maven은 Java 개발의 초석이며 Java 용으로 가장 많이 사용되는 빌드 관리 도구입니다. Maven의 간소화 된 XML 기반 구성 모델을 사용하면 개발자가 Java 기반 프로젝트의 개요를 빠르게 설명하거나 파악할 수 있으므로 새 프로젝트를 시작하고 공유하는 것이 매우 간편합니다. Maven은 또한 테스트 중심 개발, 장기 프로젝트 유지 관리, 선언적 구성 및 광범위한 플러그인을 지원하므로 CI / CD에 널리 사용되는 옵션입니다. 이 문서는 Maven POM 및 디렉터리 구조와 첫 번째 Maven 프로젝트를 빌드하기위한 명령을 포함하여 Maven에 대한 간략한 소개입니다.

이 글을 쓰는 현재 가장 최근의 Maven 릴리스는 Maven 3.6.3입니다.

Maven 대 Ant 및 Gradle

Maven은 Java 생태계에서 가장 인기있는 빌드 도구이지만 유일한 빌드 도구는 아닙니다. 이전 세대의 XML 기반 구성 도구 인 Ant는 Maven의 표준화 된 규칙 기반 관행 및 종속성 관리가 부족하지만 Maven에서 찾을 수없는 유연성을 제공합니다. Gradle은 Maven 생태계 위에서 실행되지만 (Maven의 저장소 사용) 구성을 위해 Groovy 또는 Kotlin 기반 DSL 사용을 지원하는 최신 도구입니다. 세 가지 모두 그 자체로 좋은 빌드 도구이며 각각 CI / CD 프로세스에 통합 될 수 있습니다. 중요한 것은 당신의 필요에 맞는 것을 선택하고 그것을 적절하게 사용하는 방법을 아는 것입니다.

Maven 작동 방식

많은 훌륭한 도구와 마찬가지로 Maven은 한때 지나치게 복잡했던 (구성 지옥)을 가져와 소화 가능한 부분으로 단순화합니다. Maven은 세 가지 구성 요소로 구성됩니다.

  • POM : Maven 프로젝트 및 해당 종속성을 설명하는 파일입니다.
  • 디렉터리 : POM에서 Maven 프로젝트를 설명하기위한 표준화 된 형식입니다.
  • 리포지토리 : 타사 소프트웨어가 저장되고 검색되는 위치입니다.

Maven POM : Maven 을 사용하는 모든 Java 프로젝트에는 루트 디렉토리에 POM (프로젝트 개체 모델) 파일이 있습니다. 는 pom.xml프로젝트의 종속성을 설명하고 어떻게 구축 할 수있는 방법을 알려줍니다. ( 종속성 은 프로젝트에 필요한 타사 소프트웨어입니다. 몇 가지 일반적인 예는 JUnit 및 JDBC입니다. 사용 가능한 모든 도구 및 인기있는 종속성 목록은 Maven Central Repository를 참조하십시오.)

Maven 디렉토리 : Maven 디렉토리는 구성 지옥에 대한 우아한 솔루션 인 구성 에 대한 규칙으로 알려진 것을 구현합니다 . 개발자가 각 새 프로젝트에 대해 레이아웃을 정의하고 구성 요소를 직접 구성하도록 요구하는 대신 ( makefile및 Ant 의 경우와 마찬가지로 ) Maven은 공통 프로젝트 구조를 도입하고 작동 방식을 설명하는 표준 파일 형식을 제공합니다. 요구 사항을 연결하기 만하면 Maven이 종속성을 호출하고 프로젝트를 구성합니다.

중앙 집중식 저장소 : 마지막으로 Maven은 중앙 집중식 저장소를 사용하여 프로젝트 패키지를 종속성으로 검색하고 게시합니다. 프로젝트에서 종속성을 참조 할 때 Maven은 중앙 저장소에서이를 발견하고 로컬 저장소에 다운로드하고 프로젝트에 설치합니다. 대부분의 경우이 모든 것은 개발자에게 보이지 않습니다.

Maven 종속성에 액세스

기본적으로 Maven은 Maven 중앙 저장소의 종속성을 해결합니다. 일반적인 대안은 사용 가능한 패키지 세트가 더 많은 JCenter입니다. 조직은 또한 공개 또는 비공개가 될 수있는 내부 저장소를 게시하고 호스팅합니다. 저장소에 액세스하려면 Maven POM에 URL을 지정하거나 Maven에 다른 저장소를 찾도록 지시 할 수 있습니다.

Maven 설치

Maven은 Java 프로젝트이므로 설치하기 전에 개발 환경에 JDK를 설치해야합니다. (JDK 다운로드 및 설치에 대한 자세한 내용은 "JDK 란 무엇입니까? Java 개발 키트 소개"를 참조하십시오.)

Java 개발 환경을 설정했으면 몇 단계 만 거치면 Maven을 설치할 수 있습니다.

  1. 최신 Maven 릴리스 (이 글을 쓰는 시점에서 Maven 3.6.3)를 다운로드합니다.
  2. apache.maven편리한 위치에 .zip 파일을 추출하십시오 .
  3. 해당 파일을 경로에 배치하십시오. 예를 들어, Unix 또는 Linux 시스템 : export PATH=$PATH:/home/maven/.

이제 mvn명령에 액세스 할 수 있습니다 . mvn -vMaven을 성공적으로 설치했는지 확인하려면 입력 하십시오.

Maven POM

모든 Maven 프로젝트의 루트는 pom.xml파일입니다. 지루하다는 평판에도 불구하고 XML은 실제로이 사용 사례에서 매우 잘 작동합니다. Maven의 POM은 읽기 쉽고 프로젝트에서 진행되는 작업의 대부분을 보여줍니다. (자바 스크립트로 작업했다면 pom.xmlNode NPM의 package.json파일 과 목적이 비슷 합니다.)

목록 1은 매우 간단한 Maven을 보여줍니다 pom.xml.

목록 1. 간단한 Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Maven POM 이해

요령을 이해하면 POM은 신비한 것이 아닙니다. 시작하려면 공식 POM 스키마를 참조하는 XML 프리앰블을 훑어 볼 수 있습니다. modelVersion그러나로 시작하는 XML을 확인하십시오 . 이를 통해 Maven에 사용할 POM 버전 (이 경우 Maven POM 4.0.0)을 알 수 있습니다.

다음으로, 당신은 groupId, artifactId하고 version. 이 세 가지 속성은 함께 저장소의 모든 Maven 관리 리소스를 고유하게 식별합니다. 파일 상단의 이러한 속성은 Maven 프로젝트를 설명합니다.

이제 dependencies프로젝트의 종속성을 설명하는 POM 섹션을 살펴보십시오 . 이 경우 지금까지 JUnit이라는 하나의 종속성을 가져 왔습니다. JUnit을도의 측면에서 설명되어 있음을 공지 사항 groupId, artifactIdversion.

자체 프로젝트를 설명하든 프로젝트 종속성을 설명하든 이러한 값은 Maven 저장소에서 프로젝트를 찾을 위치와 사용할 수있는 버전을 Maven에 지속적으로 알려줍니다.

Maven 저장소에서 프로젝트 호스팅

POM은 프로젝트를 실행하는 데 필요한 모든 것을 정의하지만 프로젝트를 잠재적 종속성으로 설명합니다. 종속성이 될 프로젝트를 빌드하는 경우 (예 : 다른 프로젝트에서 사용할 라이브러리를 만드는 경우) 다음 네 가지 방법 중 하나로 사용할 수 있도록해야합니다.

  1. 로컬에서 사용할 수 있도록합니다.
  2. 비공개로 관리되는 원격 저장소에 게시합니다.
  3. 클라우드 기반 개인 저장소에 게시합니다.
  4. Maven Central과 같은 공용 저장소에 게시합니다.

첫 번째 경우에는 원격 저장소를 전혀 사용하지 않습니다. 대신 다른 개발자가 mvn install명령을 사용하여 프로젝트를 Maven 저장소에 로컬로 다운로드하고 설치합니다 .

두 번째 경우에는 비공개로 제어되는 서버를 사용하여 종속성을 게시하고 다운로드하는 호스팅 된 Maven 저장소를 사용합니다. 이를 위해서는 Apache Archiva와 같은 저장소 관리자가 필요합니다.

새로운 대안은 비공개 원격 저장소를 사용하는 것이지만 클라우드 기반 서비스에 의존하여 관리합니다 (예 : Cloudsmith). 이것은 repo 서버를 세우는 작업없이 원격으로 호스팅되는 종속성의 이점을 제공합니다. 물론 그 서비스는 유료입니다.

마지막으로, 소수의 프로젝트가 Central Maven Repository 또는 JCenter에 남게되며, 이는 널리 사용되는 공개 패키지를위한 것입니다. 다른 사람들이 사용할 오픈 소스 종속성을 만드는 경우 작업을 전 세계에서 사용할 수 있도록 이러한 중앙 집중식 저장소 중 하나가 필요합니다.

  • Maven 저장소에서 프로젝트를 호스팅하는 방법에 대해 자세히 알아보고 사용 가능한 저장소 목록을 가져옵니다.
  • Maven 저장소에 게시 된 소프트웨어를 준비하고 관리하는 데 사용되는 Maven 릴리스 플러그인에 대한 공식 Maven 문서를 참조하세요.

Maven 패키지 빌드

pom.xml목록 1에서 생성하여 디렉토리에 넣으면 이에 대해 Maven 명령을 실행할 수 있습니다. Maven에는 많은 명령이 있으며 플러그인을 통해 더 많은 명령을 사용할 수 있지만 시작하려면 몇 가지만 알면됩니다.

첫 번째 명령의 경우 mvn package. 아직 소스 코드가 없더라도이 명령을 실행하면 Maven이 JUnit 종속성을 다운로드하도록 지시합니다. Maven의 로깅 출력을 확인하여 종속성이로드되었는지 확인할 수 있습니다.

종속성 범위

예제 POM에서 JUnit 종속성이로 표시되어 있음을 알 수 scope test있습니다. 범위 는 종속성 관리에서 중요한 개념으로, 기본적으로 프로젝트에서 각 종속성을 호출하고 사용하는 방법을 정의하고 제한 할 수 있습니다. test범위는하지만 응용 프로그램이 배포 패키지 경우, 테스트를 실행하는 경우 종속성을 사용할 수 보장합니다.

또 다른 일반적인 범위는 provided런타임 환경에서 종속성이 제공됨을 프레임 워크에 알려주는입니다. 이는 컨테이너가 해당 JAR을 제공하므로 서블릿 컨테이너에 배포 할 때 Servlet JARS에서 자주 볼 수 있습니다. Maven 종속성 범위의 전체 목록은 Apache Maven 문서를 참조하세요.

Maven의 디렉토리 구조

명령이 완료되면 Maven이 /target디렉토리 를 생성했는지 확인 합니다. 프로젝트 출력의 표준 위치입니다. 다운로드 한 종속성은 /target컴파일 된 애플리케이션 아티팩트와 함께 디렉토리에 있습니다.

다음으로 Maven src/디렉토리에 배치 할 Java 파일을 추가하려고합니다 . /src/main/java/com/javaworld/Hello.java목록 2의 내용으로 파일을 작성하십시오 .

목록 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

/src경로는 프로젝트의 소스 파일의 표준 장소입니다. 대부분의 프로젝트는 기본 파일을에 넣고 /src/main/Java 파일은 /java. 또한 구성 파일이나 이미지와 같이 코드 가 아닌 자산을 포함하려는 경우 /src/main/resources. 이 경로의 자산은 기본 클래스 경로에 추가됩니다. 테스트 파일은 /src/test/java.

검토하기 위해 Maven 프로젝트 구조의 몇 가지 핵심 부분이 있습니다 (Maven 표준 디렉토리 구조에 정의 됨).

Maven 표준 디렉토리 구조의 핵심 부분

pom.xml 프로젝트 설명자 파일
/ src / main / java 소스 파일의 위치
/ src / main / resources 비 소스 자산의 위치
/ src / test / java 테스트 소스 파일의 위치
/표적 빌드 출력의 위치

Maven 프로젝트 관리

mvn package명령은 Maven에 프로젝트를 번들링하도록 지시합니다. 모든 프로젝트 파일을 한 곳에서 수집 할 준비가되면이 명령을 실행하십시오. 이 프로젝트의 POM 파일에서 패키징 유형을로 설정 jar했으므로이 명령은 Maven에 애플리케이션 파일을 JAR로 패키징하도록 지시합니다.

Maven은 팻 또는 씬 JAR인지 여부에 관계없이 JAR 관리 방법을 제어하고 실행 파일을 지정하기위한 다양한 추가 옵션을 제공합니다 mainclass. Maven의 파일 관리에 대해 자세히 알아 보려면 Maven 문서를 참조하세요.

프로젝트를 번들로 묶은 후 mvn install. 이 명령어는 프로젝트를 로컬 Maven 저장소로 푸시합니다. 로컬 저장소에 있으면 로컬 시스템의 다른 Maven 프로젝트에서 사용할 수 있습니다. 이는 귀하 및 / 또는 귀하의 팀이 아직 중앙 리포지토리에 게시되지 않은 종속성 JAR을 생성하는 개발 현장에 유용합니다.

추가 Maven 명령

디렉터리에 mvn test정의한 단위 테스트를 실행할 준비가되면 입력 합니다 /src/java/test.

mvn compile프로젝트의 클래스 파일을 컴파일 할 준비가되면 입력하십시오 . 핫 배포 설정을 실행중인 경우이 명령은 핫 배포 클래스 로더를 트리거합니다. (Spring Boot의 mvn spring-boot:run명령 과 같은 hot-deploy 도구 는 클래스 파일의 변경 사항을 감시하고 컴파일하면 소스 파일이 컴파일되고 실행중인 애플리케이션에 이러한 변경 사항이 반영됩니다.)

새 프로젝트 시작 : Maven 및 Spring의 Archetypes

메이븐 원형은 미리 정의 된 다양한 설정을 기반으로 새로운 프로젝트를 시작하기위한 템플릿입니다. 각 아키타 입은 Java EE 또는 Java 웹 애플리케이션 프로젝트와 같이 사전 패키지 된 종속성을 제공합니다. 또한 기존 프로젝트에서 새 아키타 입을 만든 다음이를 사용하여 미리 정의 된 레이아웃을 기반으로 새 프로젝트를 신속하게 만들 수 있습니다. Apache Maven 아키 타입에 대해 자세히 알아 보려면 Maven 문서를 참조하세요.

Maven과 잘 작동하는 Spring 프레임 워크는 새 프로젝트를 스터 빙하기위한 추가적이고 정교한 기능을 제공합니다. 예를 들어 Spring Initializr는 새 앱에서 원하는 요소를 매우 빠르게 정의 할 수있는 도구입니다. Initializr는 그 자체로 Maven 아키 타입이 아니지만 선행 사양을 기반으로 프로젝트 레이아웃을 생성하는 동일한 목적을 제공합니다. Initializr 내 mvn archetype:generate에서 옵션을 입력 하고 스캔하여 구축중인 항목에 적합한 아키타 입을 찾을 수 있습니다.

종속성 추가