Maven Predefined Properties

1. 소개

이 튜토리얼에서는 Maven 내에서 미리 정의된 속성을 살펴보겠습니다. 속성은 빌드 구성을 보다 동적이고 유연하며 재사용 가능하게 만듭니다. 이를 통해 기본값을 갖는 다양한 수준의 속성을 설정하고 필요할 때 쉽게 오버라이드할 수 있습니다. 이러한 속성을 더 자세히 살펴보겠습니다.

2. Maven 미리 정의된 속성

Maven은 구성을 간소화하기 위해 사용할 수 있는 유용한 내장 속성을 제공합니다. 필요한 경우 이러한 속성을 pom.xml 파일에서 직접 사용자 정의할 수 있습니다. 이들은 Maven 리소스 플러그인의 필터링 기능으로 처리되는 모든 리소스 파일에도 사용할 수 있습니다. 예를 들어, application.properties 파일에서도 가능합니다. 사용할 때는 항상 ${}로 감싸 주면 됩니다.

2.1. 사용 예시

출력 디렉토리의 위치를 지정하는 속성의 사용 예를 살펴보겠습니다:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>example.override.properties</groupId>
    <artifactId>parameter-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

위의 예시는 기본값인 ${project.build.directory}을 가져오는 방법을 보여줍니다. 즉, src/main/resources입니다.

2.2. 속성 오버라이드 예제

커스텀 빌드 경로를 제공하는 속성을 살펴보겠습니다:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>example.override.properties</groupId>
    <artifactId>parameter-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>
    <build>
        <directory>src/main/resources/custom</directory>
    </build>
</project>

위의 예에서는 속성 ${project.build.directory}의 기본값을 src/main/resources/custom으로 오버라이드했습니다. 이는 hierarchy -> -> 에서 커스텀 값을 지정하여 가능했습니다.

3. 프로젝트 정보 속성

프로젝트에 대한 정보, 구성, 메타데이터 및 빌드 정보를 참조하는 데 사용되는 몇 가지 속성을 살펴보겠습니다:

속성 설명
${project.packaging} 이 속성은 Maven이 우리 프로젝트에서 생성하는 아티팩트의 종류를 알려줍니다. 기본값은 “jar”입니다.
${project.basedir} 이 속성은 우리가 사용하는 pom.xml 파일이 위치한 프로젝트의 루트 디렉토리를 가리킵니다.

${project.groupId}${project.version}와 같은 일부 속성은 명시적으로 지정하지 않으면 부모 POM에서 기본값을 상속받을 수 있습니다.

4. 프로젝트 빌드 정보 속성

이제 빌드 과정에서 생성되고 저장되는 것과 관련된 몇 가지 특정 속성을 살펴보겠습니다:

속성 설명
${project.build.directory} 이 속성은 빌드 과정에서 생성된 모든 파일의 중앙 허브 역할을 합니다. 기본값은 “target/”입니다.
${project.build.outputDirectory} 이 속성은 Maven이 메인 애플리케이션 코드를 컴파일한 클래스들을 저장하는 위치를 알려줍니다. 기본 값은 “target/classes”입니다.
${project.build.testOutputDirectory} 컴파일된 테스트 클래스가 기본적으로 “target/test-classes”에 저장됩니다.
${project.build.sourceDirectory} 이 속성은 주 Java 소스 코드가 위치한 디렉토리를 가리킵니다. 기본 위치는 “src/main/java”입니다.
${project.build.testSourceDirectory} 이 속성은 단위 테스트 소스 코드가 저장되는 위치를 알려줍니다. 기본값은 “src/test/java”입니다.
${project.build.resources} 이 속성은 모든 프로젝트 리소스 파일들이 들어 있는 디렉토리를 지정합니다. 기본 위치는 “src/main/resources”입니다.
${project.build.testResources} 이 속성은 테스트에 사용되는 리소스들을 위한 것으로, 기본적으로 “src/test/resources”에 위치합니다.
${project.build.finalName} 이 속성은 최종 빌드 아티팩트의 이름을 결정합니다. 기본값은 프로젝트의 아티팩트 ID와 버전 번호를 조합한 것으로, 예를 들어 “${project.artifactId}-${project.version}”입니다.

5. 시스템 속성

자체 내장 속성 외에도 Maven은 컴퓨터의 Java 가상 머신(JVM) 또는 프로그램을 실행할 때 정의된 시스템 속성에 접근할 수 있습니다. 이러한 속성은 파일 경로나 운영 체제와 같은 환경별 세부사항을 위한 편리한 바로가기 역할을 합니다:

속성 설명
${java.home} 이 속성은 JDK 또는 JRE가 시스템에 설치된 위치를 알려줍니다. 이 속성은 직접 사용하지 않는 것이 좋습니다.
${java.version} 이 속성은 사용 중인 Java의 버전을 알려줍니다.
${os.name}${os.version} 이 두 속성은 현재 운영 체제(Windows 또는 macOS 등)와 버전 번호를 알려주기 위해 함께 작동합니다.
${user.dir} 이 속성은 Maven을 실행하는 현재 작업 디렉토리를 알려줍니다.

6. Maven 전용 속성

Maven의 런타임 및 구성에 특정한 속성을 살펴보겠습니다:

속성 설명
${maven.version} 이 속성은 현재 실행 중인 Maven의 정확한 버전을 알려줍니다.
${settings.localRepository} 이 속성은 로컬 Maven 리포지토리의 위치를 가리킵니다. 기본적으로 ${user.home}/.m2/repository에 저장됩니다.
${settings.interactiveMode} 이 속성은 Maven이 빌드 과정에서 입력을 요청할 수 있는지를 결정합니다. 기본값은 true입니다.
${settings.offline} 이 속성은 Maven이 오프라인 모드에서 작동해야 하는지를 제어합니다. 기본적으로는 설정되어 있지 않지만, true로 설정하면 Maven은 로컬 리포지토리에 있는 의존성만 사용합니다.

7. 결론

이 기사에서는 Maven이 제공하는 여러 내장 속성을 살펴보았습니다. 본질적으로 이러한 속성들은 우리 pom.xml 파일 내에서 설정을 쉽게 조정하고 변경할 수 있게 해줍니다.

게다가 경로, 값 또는 기타 구성을 하드코딩하는 대신 이러한 속성을 사용하는 것이 항상 좋은 방법입니다. 이는 프로젝트를 훨씬 더 유연하고 유지보수가 용이하게 만듭니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다