JavaRush /Java Blog /Random-KO /Maven에 대해 알고 싶었던 모든 것 - "Java 프로젝트 A부터 Z까지"
Roman Beekeeper
레벨 35

Maven에 대해 알고 싶었던 모든 것 - "Java 프로젝트 A부터 Z까지"

Random-KO 그룹에 게시되었습니다
안녕하세요 여러분, 친애하는 친구 여러분. 즉시 사과드리고 싶습니다. 일주일에 한 번씩 기사를 쓰겠다고 약속했던 기억이 납니다. 운동하지 않았습니다. 아직 제대로 앉아서 글을 쓰는 게 익숙하지 않은 것뿐인데, 이렇게는 하고 싶지 않다. 나는 그것이 필요하지 않고 당신도 확실히 관심이 없기 때문에 그 이유에 대해 징징 거리지 않을 것입니다. 프로젝트는 죽지 않았습니다. 정체 상태였습니다 :) 계속합니다! 오늘의 자료는 Maven에 관한 것입니다. "Java 프로젝트 A부터 Z까지": Maven에 대해 알고 싶었던 모든 것 - 1

메이븐에 대해 이야기해보자

먼저 설치해야합니다. 물론 저는 Mac을 가지고 있기 때문에 Mac용 설치만 보여드릴 수 있습니다. 단지 불운일 뿐입니다. 설치한지는 오래됐으니 직접 하셔야 할 것 같아요 :)
Maven 설치 지침은 이 자료에 있습니다 .

왜 메이븐이 필요한가?

Maven은 Gradle, Ant와 함께 프로젝트 빌드 도구입니다. JRTB(JavaRush Telegram Bot)에서 사용할 것이기 때문에 최신 소식을 전해드리고 싶습니다. 요즘에는 조립 시스템 없이는 단 하나의 프로젝트도 생성되지 않습니다. 왜냐하면 조립 시스템이 우리 삶을 여러 번 단순화하기 때문입니다. 이를 통해 다음이 가능합니다.
  • • 필요한 모든 라이브러리를 가져옵니다(어셈블리 도구 측면에서 종속성(즉, 종속성)).
  • • 프로젝트를 어떻게 조립하고 무엇으로 구성해야 하는지 정확히 결정합니다(예: WAR, JAR 또는 실행 가능한 JAR로 수집할 것인지).
  • • 프로젝트 버전을 한 곳에 설정하여 조립 중에 표시되도록 합니다.
  • • 프로젝트와 그 수명주기를 설명합니다.
  • • 소위 플러그인(영어 단어 Plugin의 전통적인 버전)을 추가합니다.
  • • 다른 프로젝트가 라이브러리를 종속성으로 가져올 수 있도록 공유 저장소에 라이브러리를 게시합니다.
일반적으로 그는 많은 일을 하며 모두 유용합니다. 나는 이것을 말할 것입니다: 초보 엔지니어의 경우 처음부터 끝까지 모든 기능을 알 필요는 없습니다. 여기서도 git과 마찬가지로 기본과 일반적인 개념을 이해하는 것이 중요합니다. 이것이 우리가 할 일입니다. 우리의 경우 Maven은 pom.xml 이라는 프로젝트 루트에 있는 XML 파일로 시작합니다 . 실제로 모든 작업을 수행할 것이므로 먼저 JavaRush 커뮤니티에서 첫 번째 프로젝트를 생성하겠습니다. 모든 일을 현명하게 수행하기 위해 JR에서 한 번 설명한 기본 사항이 이미 구성되어 있는 저장소용 템플릿을 사용하겠습니다 . 생성하려면 템플릿이 있는 저장소로 이동하여 이 템플릿 사용 버튼을 클릭하세요 . 결과적으로 커뮤니티에 첫 번째 저장소가 생겼습니다. :) 프로젝트를 로컬로 다운로드합니다. 이렇게 하려면 아이디어를 통해 File -> New -> Project from Version Control 로 이동하세요 . 나타나는 창에서 Github의 프로젝트에 대한 링크를 입력하십시오(모든 사람이 동일한 프로젝트를 별도로 생성하고 나와 함께 모든 단계를 수행하면 결과가 더 좋아질 것입니다). Clone 을 클릭하면 프로젝트 가 복제 됩니다 ."Java 프로젝트 A부터 Z까지": Maven에 대해 알고 싶었던 모든 것 - 2"Java 프로젝트 A부터 Z까지": Maven에 대해 알고 싶었던 모든 것 - 3

pom.xml은 모든 것의 머리입니다

필요한 모든 것은 pom.xml에 있습니다. 프로젝트, 개발자 및 프로젝트가 저장된 원격 저장소에 대한 모든 정보입니다. 처음에는 다음 블록에 관심이 있습니다. <project/> - 프로젝트에 대한 모든 정보가 포함된 기본 블록입니다. 다른 모든 항목은 명시적으로 또는 전이적으로 포함됩니다. 여는 태그 안에는 다음과 같은 내용이 적혀 있습니다.
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                     http://maven.apache.org/xsd/maven-4.0.0.xsd">
그리고 무엇보다도 다음 줄도 모든 pomniks로 작성됩니다(속어는 pom.xml에서 가져온 것으로 추정됩니다 :)).
<modelVersion>4.0.0</modelVersion>
하지만 그러면 더욱 흥미로워집니다. 기념관이 설명하는 프로젝트를 어떻게 식별하는지 설명하겠습니다. 내 라이브러리를 예로 들어 설명하고 메모리에 새로 생성된 프로젝트에 추가하겠습니다.
<groupId>com.github.romankh3</groupId>
<artifactId>image-comparison</artifactId>
<version>4.4.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Image Comparison</name>
여기서 가장 중요한 것은:
  • groupId 는 개발 조직 또는 개별 엔지니어의 식별자입니다. 일반적으로 도메인의 역순입니다. 예를 들어 Github의 romankh3 계정이 여기에 설명되어 있습니다. 그것은 매우 중요합니다. Spring 생태계의 경우 com.springframework 라고 가정해 보겠습니다 . 이렇게 하면 원본 프로젝트를 다른 사람의 포크와 구별하거나 단순히 프로젝트 이름의 일치만으로 구별할 수 있습니다.
  • artifaceId는 이미 이 메모리에 설명되어 있는 특정 프로젝트의 이름입니다.
  • 버전 - 이 프로젝트의 버전입니다. 여기에 있는 모든 것이 날처럼 명확합니다. 새로운 기능 추가, 기존 기능 수정, 리팩토링 또는 기타 변경 사항 적용 - 버전 증가.
  • 패키징 - 여기에서는 Maven이 프로젝트를 어떻게 조립해야 하는지 설명합니다. Jar, War, 또는 다른 것 중 하나입니다 .
  • 이름 - 프로젝트에 대한 더 보기 좋은 이름입니다.
채울 필요가 전혀 없는 몇 가지 사항이 여전히 있습니다. Maven은 이들 없이도 작동합니다. 하지만 공개적으로 사용하기 위해 라이브러리를 게시해야 한다면 확실히 추가할 가치가 있습니다. 이것들은 무엇입니까?
  • • 다운로드할 수 있는 프로젝트 저장소 경로

    <url>https://romankh3.github.io/image-comparison/</url>

  • • 이 프로젝트가 배포되는 라이센스. 또한 둘 이상이 있을 수 있으므로 다음과 같이 설정해야 합니다.

    <licenses>
     <license>
       <name>The Apache Software License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
     </license>
    </licenses>

  • • 프로젝트를 생성/생성 중인 개발자에 대한 정보:

    <developers>
     <developer>
       <id>romankh3</id>
       <name>Roman Beskrovnyi</name>
       <email>roman.beskrovnyy@gmail.com</email>
     </developer>
    </developers>

  • • 프로젝트에 액세스할 수 있는 방법을 설명하는 scm 블록:

    <scm>
    <connection>git@github.com:romankh3/image-comparison.git</connection>
    <developerConnection>git@github.com:romankh3/image-comparison.git</developerConnection>
     <url>https://github.com/romankh3/image-comparison</url>
    </scm>

일반 정보를 설명한 후 종속성이 있는 블록을 추가할 수 있습니다.
<dependencies>
   <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>2.26.0</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>5.5.2</version>
       <scope>test</scope>
   </dependency>
<dependency>
   	<groupId>com.github.romankh3</groupId>
   	<artifactId>image-comparison</artifactId>
   	<version>4.3.0</version>
<scope>test</scope>
</dependency>
</dependencies>
여기에 테스트용 라이브러리 두 개를 추가했습니다. 이 라이브러리는 항상 필요합니다. 이미 알고 있듯이 종속성에는 범위 - 범위가 있습니다. 우리의 경우에는 테스트가 지정되었습니다 . 이는 기본 코드에서 이 종속성을 볼 수 없음을 의미합니다. 다음으로 모든 것을 아름답게 보이게 하려면 별도의 태그를 사용하여 <properties/> 버전을 표시할 수 있습니다 .
<properties>
   <mockito.version>2.26.0</mockito.version>
   <junit.version>5.5.2</junit.version>
   <image.comparison.version>4.3.0</image.comparison.version>
</properties>
따라서 ${PROPERTY_NAME} 구성을 사용하여 종속성 블록을 업데이트할 수 있습니다 .
<dependencies>
   <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>${mockito.version}</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>${junit.version}</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>com.github.romankh3</groupId>
       <artifactId>image-comparison</artifactId>
       <version>${image.comparison.version}</version>
       <scope>test</scope>
   </dependency>
</dependencies>
다음에는 빌드 프로세스를 사용자 정의할 수 있는 중요한 <plugins/> 블록이 포함된 큰 <build/> 블록이 있습니다. 다음과 같이 <plugins/> 블록 내에 하나 이상의 플러그인을 추가할 수 있습니다.
<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
           <version>3.2.0</version>
           <executions>
               <execution>
                   <id>attach-sources</id>
                   <goals>
                       <goal>jar</goal>
                   </goals>
               </execution>
           </executions>
       </plugin>
   </plugins>
</build>
여기에서 maven-source-pluginmaven-javadoc-plugin이라는 두 개의 플러그인을 추가한 것을 볼 수 있습니다 . 각 플러그인에는 설정, 속성(매개변수)이 있어 플러그인을 사용자 정의할 수 있습니다. 이것은 미래에 우리에게 흥미로울 것입니다. 지금은 기억하고 넘어가겠습니다. 종속성과 동일한 방식으로 플러그인 버전을 <properties/> 에 넣습니다 . 이를 바탕으로 다음과 같은 메모리를 만들 수 있습니다.
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                     http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.github.javarushcommunity</groupId>
   <artifactId>maven-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>Maven Demo Project</name>

   <url>https://github.com/javarushcommunity/maven-demo/</url>

   <properties>
       <mockito.version>2.26.0</mockito.version>
       <junit.version>5.5.2</junit.version>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <source.plugin.version>3.2.0</source.plugin.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
           <version>${mockito.version}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.junit.jupiter</groupId>
           <artifactId>junit-jupiter-api</artifactId>
           <version>${junit.version}</version>
           <scope>test</scope>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>${source.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-sources</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>${javadoc.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-javadocs</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>
</project>

메이븐 라이프사이클

Maven에는 Maven 수명주기와 같은 것이 있습니다. 이는 메이븐이 수행할 수 있는 일련의 작업이라고 말할 가치가 있습니다. Maven 수명주기 외에 다른 작업이 있을 수 있습니다. 무엇에 관한 것인가요? 프로젝트를 어셈블할 수 있는 명령 세트가 있습니다( 물론 영어로 된 트레이싱 페이퍼를 다시 빌드 하지만 이것이 없으면 아무데도 없습니다), Maven이 수집한 빌드를 삭제하고 Maven 로컬에 설치하여 다음을 수행할 수 있습니다. 로컬에서 프로젝트를 종속성으로 가져오는 등의 작업을 수행합니다. 이제 모든 것에 대해 더 자세히 이야기합시다. 이 팀들에 대한 내 의견을 쓰기 전에, 나는 그들이 이 문제에 대해 인터넷에 쓴 글을 읽기로 결정했고... 설명하기가 매우 어렵다는 것을 깨달았습니다. 작업을 위해서는 초기 작업을 위해서는 몇 가지 명령이 필요합니다 . 그것들을 설명해보자:
  • 컴파일 — 프로젝트를 컴파일합니다. 이것이 첫 번째 단계입니다. 이 단계에서 프로젝트에 컴파일 오류가 있는지 확인할 수 있습니다. 때로는 IDEA에서 작업할 때 여러 가지 도약이 있기 때문에 존재하지 말아야 할 곳에 컴파일 문제가 나타나는 것입니다. 따라서 이 명령은 모든 i에 점을 찍습니다.
  • test - JUnit에서 실행되는 모든 테스트를 실행하며 Maven이 예상하는 위치에 있습니다( src/test/java 가 캡틴입니다).
  • package 는 이전 두 명령을 포함하는 다음 명령입니다. 즉, compile 명령이 먼저 패키지 내부에서 시작된 다음 test 명령이 컴파일된 프로젝트로 전송되고 모든 것이 정상이면 아카이브 생성이 시작됩니다. (< Packaging/>에서 선택한 아카이브))
  • 설치 - 머신에 Maven을 설치하면 프로젝트용으로 다운로드한 라이브러리를 저장하는 로컬 Git 저장소가 있습니다. 그러나 Maven의 장점은 설치 명령을 사용하여 프로젝트를 로컬 Git 저장소에 추가하고 프로젝트를 로컬에서 종속성으로 사용할 수 있다는 것입니다. 나를 믿지 못합니까? 시도해 보세요 :) 이렇게 하면 프로젝트가 다른 프로젝트에 종속된 것처럼 보이는지 빠르게 확인할 수 있습니다.
  • 배포는 이전에 있었던 모든 것의 정점입니다. 설치 시 로컬 저장소뿐만 아니라 액세스 권한이 있는 모든 사람이 종속성으로 사용할 수 있는 원격 저장소에도 프로젝트를 추가할 수 있는 기능을 제공하는 명령입니다.
  • verify - 모든 것을 확인하고 프로젝트 배포 준비가 되었는지 알려주는 명령입니다.
  • 정리 - 물론 컴파일된 파일과 아카이브는 어딘가에 저장되어야 합니다. Maven에는 이에 대한 대상 폴더가 있습니다 . 이는 프로젝트에 필요하지 않은 데이터입니다. 그리고 프로젝트를 다시 조립하기 전에 이전에 나온 모든 것을 삭제하는 것이 좋습니다. 이것이 clean 명령의 용도입니다 .

메이븐 플러그인

플러그인에 대해 좀 더 이야기하고 싶었는데, 글이 벌써 길어졌네요. 이것이 당신의 숙제가 될 것입니다. 그것이 무엇인지, 어떻게 사용하는지 이해하십시오. 이 기사의 계속에서는 실제로 Maven을 다룰 것입니다.

시리즈의 모든 자료 목록은 이 기사의 시작 부분에 있습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION