Maven 참조 설정 파일

  • settings.xml
    • settings.xml은 maven tool 자체에 관련된 설정을 담당
    • MAVEN_HOME/conf/ 아래에 있다.
  • pom.xml
    • 프로젝트 최상위 디렉터리에 “pom.xml”이라는 파일이 생성된다.
    • pom.xml은 POM(Project Object Model)을 설정하는 부분으로 프로젝트 내 빌드 옵션을 설정하는 부분이다.

pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.study</groupId>
    <artifactId>Test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Test</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • 프로젝트 정보
    • modelVersion : maven의 pom.xml 모델 버전
    • groupId : 프로젝트를 생성한 조직 또는 그룹명으로 보통 URL의 역순으로 지정한다.
    • artifactId : 프로젝트의 생성되는 기본 아티팩트의 고유 이름이다.
      • 메이븐에 의해 생성되는 일반적인 artifact는 artifact-version.extension 형식이다.
    • version : 애플리케이션의 버전. 접미사로 SNAPSHOT이 붙으며 아직 개발단계라는 의미이다.
      • 메이븐에서 라이브러리를 관리하는 방식이 다르다고 한다.
    • packaging : jar, war, ear, pom 등 패키지 유형을 나타낸다.
    • name : 프로젝트 명
    • description : 프로젝트 설명
    • url : 프로젝트를 찾을 수 있는 URL
    • properties : pom.xml에서 중복해서 사용되는 설정 값들을 지정해놓는 부분으로 다른 위치에서 $(…)로 표기해서 사용할 수 있다.
      • 위 pom.xml에서 java version 을 1.8로 적용하고 다른 위치에서 $(java.version)이라고 쓰면 1.8이라고 쓴 것과 같다.
    • profiles : 릴리즈를 나눠야 할 필요가 있는 설정 값은 profiles로 설정할 수 있다. (dev, prod)

      <profiles>
          <profile>
             <id>dev</id>
             <properties>
                 <java.version>1.8</java.version>
             </properties>
          </profile>
          <profile>
              <id>prod</id>
              <properties>
                  <java.version>1.9</java.version>
              </properties>
          </profile>
      </profiles>
      
      • maven goal 부분에 -P옵션으로 프로파일을 선택할 수 있다.
      • maven compile -P prod라고 하면 $(java.versoin)은 1.9가 된다.
  • 의존성 라이브러리 정보
    • 의존성 라이브러리 정보를 적을 수 있다.
    • dependencies 안에 작성되며 dependency 안에 groupId, artifactId, version 정보가 필요하다.
      • groupId는 Java의 패키지 이름 규칙을 따라야 함 즉 제어하는 도메인 이름의 반대로 시작
      • artifactId는 JAR 파일의 이름
    • 부모 pom.xml에서 이미 버전정보가 있는 dependency에 경우 version은 따로 지정할 필요가 없다.
      • 스프링부트는 스프링버전에 맞는 버전으로 이미 설정되어 있기 때문에 오버라이드해서 문제가 생길 수 있다.
    • A라는 라이브러리를 사용하는데 B,C,D가 의존성을 가진다면 A를 dependency에 추가하면 자동으로 필요한 B,C,D도 가져오는 기능이 있다.
    • dependency에 scope
      • compile : 기본 scope. 미입력시에도 기본 적용, 모든 상황에서 포함됨
      • provided : compile과 유사하게 모든 상황에서 수행된다.
        • 하지만, 다른 외부 컨테이너에서 기본 제공되는 API인경우 provided로 지정 시 마지막 패키징할 때 포함되지 않음
        • 예를 들면 tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외된다.
      • runtime : 컴파일 시에는 불필요 실행시에 필요한 경우. 런타임 및 테스트 시 classpath에 추가 되지만, 컴파일시에는 추가 되지 않음
      • test : 테스트시에만 사용
      • system : provided와 유사, system의 특정 path를 참조하도록 지정, Maven의 central repository를 사용하지 않음
      • import : scope는 dependencyManagement 섹션에서 pom의 의존관계에 대해 사용
  • build 정보
    • build tool : maven의 핵심인 빌드와 관련된 정보를 설정할 수 있는 곳이다.
    • build 부분에서 설정할 수 있는 값들에 대해 설명하기 전에 “라이프 사이클(life-cycle”에 대해서 알 필요가 있다.
    • 객체의 생명주기처럼 maven에는 라이프 사이클이 존재한다.
    • 크게 build, clean, site 라이프 사이클로 나누고 세부적으로 페이즈(phase) 있다.
      • clean: pre-clean, clean, post-clean
      • build: validate … compile … test … package … verify … install … deploy
      • site: pre-site, site, post-site, deploy
    • 메이븐의 모든 기능은 플러그인(plugin)을 기반으로 동작한다.
    • 플러그인에서 실행할 수 있는 각각의 작업을 골(goal)이라하고 하나의 페이즈는 하나의 골과 연결되며, 하나의 플러그인에는 여러 개의 골이 있을 수 있다.
    • 설정 값
      • finalName : 빌드 결과물(ex .jar) 이름 설정
      • resources : 리소스(각종 설정 파일)의 위치를 지정할 수 있다.
        • resource : 없으면 기본으로 “src/main/resources”
      • testResources : 테스트 리소스의 위치를 지정할 수 있다.
        • testResource : 없으면 기본으로 “src/test/resources”
      • Repositories : 빌드할 때 접근할 저장소의 위치를 지정할 수 있다. 기본적으로 메이븐 중앙 저장소인 http://repo1.maven.org/maven2로 지정되어 있다.
      • outputDirectory : 컴파일한 결과물 위치 값 지정, 기본 “target/classes”
      • testOutputDirectory : 테스트 소스를 컴파일한 결과물 위치 값 지정, 기본 “target/test-classes”
      • plugin : 어떠한 액션 하나를 담당하는 것으로 가장 중요하지만 들어가는 옵션은 제 각각이다. 다행인 것은 플러그인 형식에 대한 것은 안내가 나와있으니 그것을 참고해서 작성하면 된다.
        • plugin이 작성되어 있다고 무조건 실행되는 것은 아니다. 명확한 것은 아니지만 따로 실행할 플러그인을 메이븐 명령어로 실행해야 하는 것으로 알고 있다.
        • executions : 플러그인 goal과 관련된 실행에 대한 설정
        • configuration : 플러그인에서 필요한 설정 값 지정
  • Repository
    • 의존성을 다운로드 받을 위치의 repository
    • 기술되지 않을 시 기본적인 위치 (http://repo.maven.apache.org/maven2)
    • 다수의 repository 기술 가능
    • 회사 내부의 repository를 기술 하기도 한다.
      • nexus
      • artifactory를 이용
      <repositories>
          <repository>
              <id>spring-snapshot</id>
              <name>Spring Snapshot Repository</name>
              <url>https://repo.spring.io/snapshot</url>
              <snapshots>
                  <enabled>true</enabled>
              </snapshots>
              <releases>
                  <enabled>false</enabled>
              </releases>
          </repository>
      </repositories>
      
  • Plugin Repository
    • maven plugin을 다운로드 받을수 있는 저장소 위치를 기술
    <pluginRepositories>
        <pluginRepository>
            <id>acme corp</id>
            <name>Acme Internal Corporate Repository</name>
            <url>http://acmecorp.com/plugins</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>false</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>
    
  • 배포
    <project>
        ...
        <distributionManagement>
            <site>
                <id>website</id>
                <url>scp://www.mycompany.com/www/docs/project/</url>
            </site>
        </distributionManagement>
        ...
    </project>
    
    • 사이트로 배포할 때 위와 같이 설정할 수도 있다.

pom.xml의 부모: spring-boot-starter-parent.xml

  • spring-boot-starter-parent.xml에 부모는 spring-boot-dependencies 이다.
  • parent에 있는 dependency를 사용하면, 버전이 적지 않아도 알아서 가져올 수 있다.
  • 특별하게 원하는 버전이 있으면, 적으면 overriding이 된다.
    • 트리 구조로 dependency가 연결되어 있다.
      • (pom.xml -> spring-boot-starter-parent -> spring-boot-dependencies - … )
    • Dependencies form 의 dependency
      • SpringBoot 폼에 명시된 의존성을 사용하면 버전을 명시하지 않아도 SpringBoot 폼에서 정의된 의존성을 가져와서 사용
      • Maven Dependencies -> Dependency management
      • 우리가 관리해야 하는 일이 줄어드는 것
      • 버전은 오버라이딩 가능
    • Plugin -> 하나의 JAR 파일을 만들어 독립적인 실행이 가능하도록 해준다.
  • Pom.xml의 Parent 폼이 아닌 다른 구조를 쓰는 법
    • 추가하고 싶은 프로젝트를 parent 폼의 넣은 후, 해당 프로젝트의 parent로 spring-boot-starter를 넣으면 된다.
    • Parent를 타고 타고 들어와서 의존성 관리를 받을 수 있다.
    • Parent 폼 변경 안하고, Element를 사용하면 된다.
      • depedencyManagement 는 dependency 영역만 가져와 사용하는거다.
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    • 단점. 의존 관리뿐 아닌 프로젝트에 필요한 환경에 대한 설정(encoding, java version, plugin …) 이 제대로 먹히질 않는다.
    • Parent를 사용하는 것이 기본 세팅을 사용하기(dependency+encoding ..etc) 훨씬 편리하다.
  • 출처: https://jeong-pro.tistory.com/168
  • 출처: 백기선님 Spring Boot
  • 출처: Maven 정복 https://wikidocs.net/book/1910