2020-10-5 메이븐 기초(2) - 프로젝트 생성

프로젝트 생성

  • 메이븐 프로젝트를 생성하기 위해서는 프로젝트 디렉토리에서 mvc archetype:generate명령어를 입력한다.

    • Choose a number: 8:
      Define value for property 'groupId': me.jimmy
      Define value for property 'artifactId': mavenStudy
      Define value for property 'version' 1.0-SNAPSHOT: :
      Define value for property 'package' me.jimmy: :
      Confirm properties configuration:
      groupId: me.jimmy
      artifactId: mavenStudy
      version: 1.0-SNAPSHOT
      package: me.jimmy
      
    • groupId : 프로젝트를 생성하는 개인 또는 단체.

    • artifactId : 프로젝트 ID. 개발프로젝트에 할당되는 ID

    • 버전 : 프로그램 버전. default로 1.0-SNAPSHOT으로 되어있다.

    • 패키지 : default로 groupId가 되어있다.
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── me
    │           └── jimmy
    │               └── App.java
    └── test
        └── java
            └── me
                └── jimmy
                    └── AppTest.java

  • 위와 같은 구조로 프로젝트가 생성된 것을 확인할 수 있다.
  • src : 프로젝트에서 필요한 파일들을 모아둔 곳이고, pom.xml은 빌드파일을 지칭한다.
  • src디렉토리는 main, test로 구별되는데 작성하는 소스코드는 main에 테스트코드는 test폴더에 작성하면 된다.

프로그램생성(mvn package)

  • pom.xml이 있는 루트 디렉토리에서 mvn package를 생성하면 컴파일하고 Jar파일을 생성한다.

  • 컴파일하고 빌드할때 기본적으로 테스트들을 실행시킨다.

    • [INFO] -------------------------------------------------------
      [INFO]  T E S T S
      [INFO] -------------------------------------------------------
      [INFO] Running me.jimmy.AppTest
      [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s - in me.jimmy.AppTest
      [INFO]
      [INFO] Results:
      [INFO]
      [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
      [INFO]
      [INFO]
      

프로그램 실행

  • packaging을 하면 target디렉토리가 생성된다. 내부에 mavenStudy-1.0-SNAPSHOT.jar와 같은 jar파일이 존재하는데, 빌드된 jar파일이다.

  • $java -classpath mavenStudy-1.0-SNAPSHOT.jar me.jimmy.App
    
  • jar파일 자체만으로 실행되지 않는다. -classpath로 jar파일을 지정하고, main클래스를 지정해야한다. 전용 플러그인을 제공하면 main클래스를 따로 지정하지 않아도 된다.

maven goal

  • mvn package를 통해 프로그램을 빌드했다. 이때 package를 goal이라고 한다.
  • 메이븐에서 goal은 “처리의 역할”을 의미한다. 이전에 mvn archetype:generate 명령어 역시 archetype플러그인의 generate라는 골을 실행한거다.
  • 메이븐의 goal
    • package : 패키지를 생성하기 위한 것. compile, test-compile, test도 내부에서 실행
    • compile : 컴파일, 하지만 jar 파일은 생성안한다.
    • test-compile : 테스트 프로그램 컴파일한다. src/test에 있는 소스코드를 컴파일
    • test : 테스트를 실행. src/test에 있는 테스트를 실행
    • clean : 컴파일에서 생성된 파일을 모두 삭제.

pom.xml

  • 메이븐 커맨드를 입력해서 프로젝트를 만들거나 빌드가 가능하다. 메이븐이 의존성을 모두 중앙에서 관리하지만 프로젝트 관리를 위해서는 빌드파일을 이해해야한다.

  • pom.xml의 pom => Project Object Model

  • <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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.devkuma</groupId>
      <artifactId>SampleMavenApp</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>SampleMavenApp</name>
      <url>http://maven.apache.org</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </project>
    
    • pom.xml은 project태그 내에서 모든 정보를 기술한다. project뒤에 있는 xmlsn와 같은 기타 속성들은 정해진 값?으로 볼 수 있다.
  • 프로젝트 기본속성 : project태그에는 아래와 같은 기본 속성태그들이 존재한다.

    • <modelversion> : pom 모델의 버전. 4.0.0으로 명시하자.
    • <groupId> : 그룹Id로 프로젝트에서 제작자,회사 프로젝트를 식별하기 위해 사용
    • <artifactId> : 프로젝트 고유한 Id
    • <version> : 프로그램 버전. 보통 1.0-SNAPSHOT이 기본으로 설정된다.
    • <packaging> : 패키징의 종류. jar 혹은 zip으로 설정한다. 웹애플리케이션은 war도 지정한다.
    • <name> : 프로그램 이름. 보통 artifactId를 그대로 쓴다.
    • <url> : 프로젝트와 관련된 url
  • <properties> : 프로젝트와 관련된 속성들. 보통 project.build.sourceEncoding만 포함.

  • <dependencies> : 의존성들을 모아둔 태그. 자바 기본 라이브러리는 제외한다.

  • 의존성이 계층적으로 구성되어있기때문에 전체를 <dependencies>로 감싸고 하위에 <dependency>를 명시한다.

  • <dependency> : 라이브러리 정보를 기술한다.

    • groupId, artifactId,version는 위의 설명과 유사하지만 scope가 존재한다.
    • <scope> : 라이브러리가 이용되는 범위를 지정한다. runtime, test와 같은 범위가 존재한다.

느낀점

  • 메이븐 명령어를 잘 몰랐고, groupId, artifactId도 헷갈렸고, dependencies내부에 있는 dependency를 제외하고 다른 태그들이 어떤 의미를 가지고 있는지 잘몰랐다. 잘 정리해둔 글을 참조해서 명령어들을 하나하나 입력하면서 어떻게 프로젝트가 생성되는지 확인할 수 있었다. 스프링 개발을 하다보면 plugin들을 설정하고 pom.xml에서 다양한 설정들을 하게 되는데, 다음번에는 의미를 이해할 수 있을거 같다.

Reference

  • http://www.devkuma.com/books/pages/102
Written on October 5, 2020