Maven

주빈·2022년 6월 23일
2

framework

목록 보기
4/11
post-thumbnail
post-custom-banner

오늘은 Apache Maven에 대해 알아보자.

📘 Maven 이란?

  • 자바용 프로젝트 관리 도구로써 project object model(POM) XML 문서를 통해 해당 프로젝트의 버전 정보 및 라이브러리 정보들을 통합하여 관리하는 도구로써 Apache License 2.0 으로 배포되는 오픈 소스 소프트웨어이다.

📜 라이브러리 종속성

  • 일반적인 프로젝트는 개발자가 필요한 라이브러리를 직접 찾아서 추가해야 하지만, Maven을 사용하면 pom.xml 문서에 사용하고자 하는 라이브러리를 등록하여 자동으로 프로젝트에 추가되게 하여 라이브러리 관리의 편의성을 제공한다.

  • Maven을 사용하면 이전과는 다르게 /WEB_INF 폴더 하위에 라이브러리 폴더를 만들어 직접 하나하나 추가하지 않아도 된다.

📜 POM 이란?

  • POM(Project Object Model)은 하나의 프로젝트에서 사용하는 자바 버전, 라이브러리, 플러그인 구성을 통합하여 관리할 수 있게 각 설정 정보를 XML로 문서화 한 것을 말한다.

✏ pom.xml의 구성

<project>
  <modelVersion>4.0.0</modelVersion> <!-- Maven 2 버전 이후 POM의 경우 항상 4.0.0 -->
  <groupId>com.kh</groupId> <!-- 최초 만든 패키지 1, 2레벨 --> 
  <artifactId>spring</artifactId> <!-- 최초 만든 패키지 3레벨 = context-path -->
  <name>springProject</name> <!-- 프로젝트 명 -->
  <version>1.0</version>

  <!-- properties : 메이븐이 적용된 프로젝트에서 공통적으로 사용할 버전 또는 설정값 정보를 작성하는 태그 -->
  <properties>
    <java-version>11</java-version>
    <org.springframework-version>5.3.14</org.springframework-version>
    <org.aspectj-version>1.9.4</org.aspectj-version>
    <org.slf4j-version>1.7.25</org.slf4j-version>
  </properties>
  
  <dependencies> <!-- 라이브러리 의존성 주입 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope> <!-- 이 라이브러리는 테스트 실행 및 컴파일에만 사용 -->
    </dependency>
  </dependencies>
  
  <!-- build : 프로젝트 빌드 시 사용되는 플러그인 추가 및 버전 정보 설정 -->
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.9</version>
        <configuration>
          <additionalProjectnatures>
            <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
          </additionalProjectnatures>
          <additionalBuildcommands>
            <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
          </additionalBuildcommands>
          <downloadSources>true</downloadSources>
          <downloadJavadocs>true</downloadJavadocs>
        </configuration>
      </plugin>

      <!-- 컴파일러 플러그인은 프로젝트의 소스(자바코드)를 컴파일하는 데 사용 jdk 1.6 이상 사용 시 3.0 이상 버전을 
		   사용, source, taget에는 사용하는 jdk 버전을 작성 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <!-- jdk 버전과 맞춤 -->
          <source>11</source>
        <target>11</target>
        <compilerArgument>-Xlint:all</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
        </configuration>
      </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <configuration>
        <mainClass>org.test.int1.Main</mainClass>
      </configuration>
    </plugin>

    <!-- Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer -->
    <!-- 메이븐 구성 문제로 인한 pom.xml 오류 발생 시 해결 -->
    <plugin>
      <artifactId>maven-war-plugin</artifactId>
      <version>3.2.2</version>
    </plugin>
    </plugins>
  </build>

</project>

project

  • modelVersion
  • groupId
  • artifactId
  • name
  • version

properties

  • maven 내부에서 반복적으로 사용될 상수 값을 정의할 때 사용한다.

dependencies (의존성 라이브러리 정보)

  • project 태그 바로 하위에 위치한다.
  • 의존성 라이브러리 정보를 포함한다.
  • 최소 groupId, artigfactId, version의 정보가 필요하다.
  • dependencies 색션 아래 세부 'dependency'가 기술된다.

buid

  • project 태그 바로 하위에 위치한다.
  • plugins - 빌드에서 사용할 플러그인을 의미
  • 디렉토리의 구조를 하고 있다.

✏ pom.xml에 관련된 기타 사항

build와 plugins는 중복이 불가능하다!

  • 먼저 plugin의 태그보다 선행되는 build 태그와 plugins 태그는 중복이 될 수 없다.
    즉, 1개만 존재가 가능하며, 모든 plugin 들을 모아서 적어야 한다.
<build>
	<plugins>
		<plugin>
			~
		<plugin>
		<plugin>
			~
		<plugin>
			.
			.
			.
	<plugins>
<build>

plugin은 꼭 써야 하는가?

  • pom.xml을 기술하는 plugin은 필수가 아니다.
  • 해당 plugin에 설정 정보를 기술하는 태그로써, 설정 정보가 필요하지 않다면 굳이 사용하지 않아도 된다.
  • 입력하지 않더라도 입력한 goal을 메이븐에서 해석해서 로드해온다.
  • plugin 을 기술하지 않아도 로드가 되는 이유는 pluginRepositories 태그 안에 배치된 pluginRepository 안에 있는 plugin들을 받아오기 때문이다.
  • 추가적으로 plugin에 대한 설정이 필요한 경우에만 plugin을 작성하면 된다.
profile
누구에게나 필요한 개발자가 꿈
post-custom-banner

0개의 댓글