본문 바로가기
각종 언어 기본 문법/JAVA

메이븐으로 자바 프로젝트 생성하기 (실습 - 2)

by 혀니쌤1 2022. 10. 3.

목차

    메이븐 관련 세 번째 글이다.

    첫 번째 글은 메이븐이 무엇인지에 대해 설명하였다. 앤트 빌드가 아닌 메이븐 빌드에 가진 장점과 특징에 대해 설명했다.

    두 번째 글은 직접 IDE를 사용하여 메이븐으로 조그만 프로젝트를 만들어 보았다. 새 메소드 (mockito)를 사용하기 위하여, 기존 junit 외에 새 라이브러리를 다운받는 과정이 나와있다.

    세 번째 글 역시 실습이다.

    이번에는 서브 모듈 프로젝트를 생성하여, 프로젝트 프로젝트 간 의존성이 있을 때, 어떻게 pom.xml이 기록되고 라이브러리가 다운받아지는지 작성하고자 한다.

     

     

    메이븐이란? (JAVA Maven the build tool)

    회사에서 일을 하면서 내가 정말 해멨던 메이븐에 대해서 정리해보고자 한다. 나는 회사에서 메이븐 때문에 고생을 많이 했다. 정말정말정말정말!!!! 코드가 아무리 맞게 짜여져 있어도 메이븐

    mylittlenotepad.tistory.com

     

    메이븐으로 자바 프로젝트 생성하기 (실습 - 1)

    지난 번 글에선 메이븐이 무엇인지 설명했었다. 이미 만들어져있는 프로젝트나 폼파일을 가지고 설명했었다. 메이븐이란? (JAVA Maven the build tool) 회사에서 일을 하면서 내가 정말 해멨던 메이븐

    mylittlenotepad.tistory.com

     

     

    현 프로젝트에 딸린 서브 프로젝트 (서브 모듈)을 생성하는 방법은 간단하다.

    부모 프로젝트(모듈) 우클릭 후 create new module을 클릭하면 된다.

    그럼 마치 create new project를 했을 때와 같은 창이 뜰 것이다.

    나는 이름은 "common"으로, archetype은 역시 quickstart로 했다. 그럼 메인 프로젝트와 같은 구조로 src.main.java.App 및 src.test.java.AppTest가 생성될 것이다. 

    (난 이후 이것을 CommonApp 및 CommonAppTest로 이름을 바꾸었다)

     

    초기 commom 프로젝트의 폼파일 상태는 아래와 같다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <parent>
        <artifactId>mavenbuildproject</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
    
      <artifactId>common</artifactId>
    
      <name>common</name>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
            <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
            <plugin>
              <artifactId>maven-site-plugin</artifactId>
              <version>3.7.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-project-info-reports-plugin</artifactId>
              <version>3.0.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>

     

    그리고 common 프로젝트가 생성되면서 메인 프로젝트는 아래 처럼 폼파일이 업데이트 되었다. (깃을 이용하면 전후 비교가 편리하다)

    딸린 모듈에 common이 있다고 되어있다.

    하지만 아직 dependency에 common 모듈이 있다는 정보는 폼파일에 추가되지 않았을 텐데, 아직 메인 프로젝트에서 common 모듈의 함수를 사용하지 않았기 때문이다.

    그래서 common 모듈에서 간단히 string을 리턴하는 함수를 생성하고, 메인 프로젝트에서 그 것을 사용하게끔 했다.

    package org.example;
    
    public class CommonApp {
    
        public static void main(String[] args) {
            System.out.println("Hello Common!");
        }
    
        public String createGreeting(String name) {
            String s = "Hi";
            if (name != null) {
                s = String.format("Hello %s. How do you do?\n", name);
            }
            return s;
        }
    }

     

    package org.example;
    
    public class App {
    
        public static void main(String[] args) {
            System.out.println("Hello World!");
            CommonApp common = new CommonApp();
            String s = common.createGreeting("James");
            System.out.print(s);
        }
    }

     

    그랬더니 의존성을 추가하라는 요구사항이 뜨고, 수행해 주었다.

     

    그럼 아래와 같이 메인 프로젝트의 폼파일에 dependency가 자동으로 추가 된다.