Skip to content

메이븐

메이븐은 모든 자바 기반 프로젝트를 빌드하고 관리하는 데 사용할 수 있는 빌드 시스템입니다.

플러그인 구성 및 활성화

kotlin-maven-plugin은 코틀린 소스와 모듈을 컴파일합니다. 현재는 Maven v3만 지원됩니다.

pom.xml 파일에서 사용할 코틀린 버전을 kotlin.version 프로퍼티에 정의합니다:

xml
<properties>
    <kotlin.version>2.2.10</kotlin.version>
</properties>

kotlin-maven-plugin을 활성화하려면 pom.xml 파일을 업데이트합니다:

xml
<plugins>
    <plugin>
        <artifactId>kotlin-maven-plugin</artifactId>
        <groupId>org.jetbrains.kotlin</groupId>
        <version>2.2.10</version>
    </plugin>
</plugins>

JDK 17 사용

JDK 17을 사용하려면 .mvn/jvm.config 파일에 다음을 추가합니다:

none
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED

저장소 선언

기본적으로 mavenCentral 저장소는 모든 메이븐 프로젝트에서 사용할 수 있습니다. 다른 저장소의 아티팩트에 접근하려면, <repositories> 엘리먼트에 각 저장소의 ID와 URL을 지정합니다:

xml
<repositories>
    <repository>
        <id>spring-repo</id>
        <url>https://repo.spring.io/release</url>
    </repository>
</repositories>

Gradle 프로젝트에서 mavenLocal()을 저장소로 선언하면 Gradle과 Maven 프로젝트 간에 전환할 때 문제가 발생할 수 있습니다. 자세한 내용은 저장소 선언을 참조하세요.

의존성 설정

코틀린은 애플리케이션에서 사용할 수 있는 광범위한 표준 라이브러리를 가지고 있습니다. 프로젝트에서 표준 라이브러리를 사용하려면 다음 의존성을 pom.xml 파일에 추가합니다:

xml
<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>

다음과 같은 이전 버전의 코틀린으로 JDK 7 또는 8을 대상으로 하는 경우:

  • 1.8 미만 버전에서는 각각 kotlin-stdlib-jdk7 또는 kotlin-stdlib-jdk8을 사용하세요.
  • 1.2 미만 버전에서는 각각 kotlin-stdlib-jre7 또는 kotlin-stdlib-jre8을 사용하세요.

프로젝트에서 코틀린 리플렉션 또는 테스트 기능을 사용하는 경우, 해당 의존성도 추가해야 합니다. 아티팩트 ID는 리플렉션 라이브러리의 경우 kotlin-reflect이고, 테스트 라이브러리의 경우 kotlin-testkotlin-test-junit입니다.

코틀린 전용 소스 코드 컴파일

소스 코드를 컴파일하려면 <build> 태그에 소스 디렉터리를 지정합니다:

xml
<build>
    <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
</build>

소스를 컴파일하려면 코틀린 메이븐 플러그인을 참조해야 합니다:

xml
<build>
    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>

            <executions>
                <execution>
                    <id>compile</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>

                <execution>
                    <id>test-compile</id>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

코틀린 1.8.20부터 위 <executions> 엘리먼트 전체를 <extensions>true</extensions>로 대체할 수 있습니다. 확장을 활성화하면 compile, test-compile, kapt, test-kapt 실행이 빌드에 자동으로 추가되어 해당 라이프사이클 단계에 바인딩됩니다. 실행을 구성해야 하는 경우 ID를 지정해야 합니다. 다음 섹션에서 이 예시를 찾을 수 있습니다.

여러 빌드 플러그인이 기본 라이프사이클을 덮어쓰고 extensions 옵션을 활성화한 경우, <build> 섹션의 마지막 플러그인이 라이프사이클 설정에 우선권을 가집니다. 이전 라이프사이클 설정에 대한 모든 변경사항은 무시됩니다.

코틀린 및 자바 소스 컴파일

코틀린 및 자바 소스 코드가 포함된 프로젝트를 컴파일하려면 자바 컴파일러 이전에 코틀린 컴파일러를 호출합니다. 메이븐 용어로는 pom.xml 파일에서 kotlin 플러그인이 maven-compiler-plugin보다 먼저 오도록 하여, kotlin-maven-pluginmaven-compiler-plugin보다 먼저 실행되어야 함을 의미합니다:

xml
<build>
    <plugins>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <extensions>true</extensions> <!-- 라이프사이클 정보를 자동으로 가져오도록 이 옵션을 설정할 수 있습니다 -->
            <executions>
                <execution>
                    <id>compile</id>
                    <goals>
                        <goal>compile</goal> <!-- 플러그인에 대한 확장을 활성화하는 경우 <goals> 엘리먼트를 생략할 수 있습니다 -->
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals>
                        <goal>test-compile</goal> <!-- 플러그인에 대한 확장을 활성화하는 경우 <goals> 엘리먼트를 생략할 수 있습니다 -->
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <executions>
                <!-- Maven에서 특별히 처리되므로 default-compile을 대체합니다 -->
                <execution>
                    <id>default-compile</id>
                    <phase>none</phase>
                </execution>
                <!-- Maven에서 특별히 처리되므로 default-testCompile을 대체합니다 -->
                <execution>
                    <id>default-testCompile</id>
                    <phase>none</phase>
                </execution>
                <execution>
                    <id>java-compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
                <execution>
                    <id>java-test-compile</id>
                    <phase>test-compile</phase>
                    <goals>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

증분 컴파일 활성화

빌드를 더 빠르게 만들려면 kotlin.compiler.incremental 프로퍼티를 추가하여 증분 컴파일을 활성화할 수 있습니다:

xml
<properties>
    <kotlin.compiler.incremental>true</kotlin.compiler.incremental>
</properties>

또는 -Dkotlin.compiler.incremental=true 옵션으로 빌드를 실행합니다.

어노테이션 처리 구성

kapt – Maven에서 사용하기를 참조하세요.

JAR 파일 생성

모듈의 코드만 포함하는 작은 JAR 파일을 생성하려면 pom.xml 파일의 build->plugins 아래에 다음을 포함합니다. 여기서 main.class는 프로퍼티로 정의되며 메인 코틀린 또는 자바 클래스를 가리킵니다:

xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>${main.class}</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

독립 실행형 JAR 파일 생성

모듈의 코드와 의존성을 모두 포함하는 독립 실행형 JAR 파일을 생성하려면 pom.xml 파일의 build->plugins 아래에 다음을 포함합니다. 여기서 main.class는 프로퍼티로 정의되며 메인 코틀린 또는 자바 클래스를 가리킵니다:

xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals> <goal>single</goal> </goals>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

이 독립 실행형 JAR 파일은 애플리케이션을 실행하기 위해 JRE에 직접 전달할 수 있습니다:

bash
java -jar target/mymodule-0.0.1-SNAPSHOT-jar-with-dependencies.jar

컴파일러 옵션 지정

컴파일러를 위한 추가 옵션과 인자는 메이븐 플러그인 노드의 <configuration> 엘리먼트 아래에 태그로 지정할 수 있습니다:

xml
<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <version>${kotlin.version}</version>
    <extensions>true</extensions> <!-- 빌드에 실행을 자동으로 추가하려면 이 옵션을 활성화합니다 -->
    <executions>...</executions>
    <configuration>
        <nowarn>true</nowarn>  <!-- 경고 비활성화 -->
        <args>
            <arg>-Xjsr305=strict</arg> <!-- JSR-305 어노테이션에 대한 strict 모드 활성화 -->
            ...
        </args>
    </configuration>
</plugin>

많은 옵션은 프로퍼티를 통해서도 구성할 수 있습니다:

xml
<project ...>
    <properties>
        <kotlin.compiler.languageVersion>2.1</kotlin.compiler.languageVersion>
    </properties>
</project>

다음 속성이 지원됩니다:

JVM 관련 속성

이름프로퍼티 이름설명가능한 값기본값
nowarn경고 생성 안 함true, falsefalse
languageVersionkotlin.compiler.languageVersion지정된 코틀린 버전과의 소스 호환성 제공"1.8", "1.9", "2.0", "2.1", "2.2" (EXPERIMENTAL)
apiVersionkotlin.compiler.apiVersion번들된 라이브러리의 지정된 버전에서만 선언 사용 허용"1.8", "1.9", "2.0", "2.1", "2.2" (EXPERIMENTAL)
sourceDirs컴파일할 소스 파일을 포함하는 디렉터리프로젝트 소스 루트
compilerPlugins활성화된 컴파일러 플러그인[]
pluginOptions컴파일러 플러그인 옵션[]
args추가 컴파일러 인자[]
jvmTargetkotlin.compiler.jvmTarget생성된 JVM 바이트코드의 대상 버전"1.8", "9", "10", ..., "24""1.8"
jdkHomekotlin.compiler.jdkHome기본 JAVA_HOME 대신 지정된 위치의 사용자 지정 JDK를 클래스패스에 포함

BOM 사용

코틀린 자재 명세서(BOM)를 사용하려면 kotlin-bom에 대한 의존성을 작성합니다:

xml
<dependencyManagement>
    <dependencies>  
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-bom</artifactId>
            <version>2.2.10</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

문서 생성

표준 Javadoc 생성 플러그인(maven-javadoc-plugin)은 코틀린 코드를 지원하지 않습니다. 코틀린 프로젝트의 문서를 생성하려면 Dokka를 사용하세요. Dokka는 혼합 언어 프로젝트를 지원하며 표준 Javadoc을 포함한 여러 형식으로 출력을 생성할 수 있습니다. 메이븐 프로젝트에서 Dokka를 구성하는 방법에 대한 자세한 내용은 Maven을 참조하세요.

OSGi 지원 활성화

메이븐 프로젝트에서 OSGi 지원을 활성화하는 방법 알아보기.