鍍金池/ 教程/ Android/ Kotlin使用Maven
Kotlin內(nèi)聯(lián)函數(shù)
Kotlin開發(fā)環(huán)境設(shè)置(Eclipse)
Kotlin調(diào)用Java代碼
Kotlin使用Ant
Kotlin編譯器插件
Kotlin相等性
Kotlin JavaScript模塊
編寫Kotlin代碼文檔
Kotlin返回和跳轉(zhuǎn)
Kotlin異常處理
Kotlin可見性修飾符
Kotlin委托
Kotlin委托屬性
Kotlin編碼約定/編碼風(fēng)格
Kotlin基礎(chǔ)語法
使用Kotlin進(jìn)行服務(wù)器端開發(fā)
Kotlin接口
Kotlin反射
Kotlin類型別名
Kotlin枚舉類
Kotlin當(dāng)前版本是多少?
Kotlin注解處理工具
Kotlin類型的檢查與轉(zhuǎn)換
Kotlin屬性和字段
Kotlin類型安全的構(gòu)建器
Kotlin相比Java語言有哪些優(yōu)點(diǎn)?
Kotlin JavaScript反射
Kotlin 是什么?
Kotlin泛型
Kotlin慣用語法
Kotlin與OSGi
Kotlin數(shù)據(jù)類型
Kotlin是面向?qū)ο筮€是函數(shù)式語言?
Kotlin動態(tài)類型
Kotlin協(xié)程
Kotlin操作符符重載
Kotlin使用Gradle
Kotlin密封類
Kotlin兼容性
Kotlin集合
Kotlin調(diào)用JavaScript
Kotlin null值安全
Kotlin函數(shù)
Kotlin開發(fā)環(huán)境設(shè)置(IntelliJ IDEA)
Kotlin嵌套類
Kotlin控制流程
Kotlin和Java語言比較
Kotlin 與 Java 語言兼容嗎?
Kotlin教程
Kotlin類和繼承
Kotlin對象表達(dá)式和對象聲明
JavaScript中調(diào)用Kotlin
Kotlin區(qū)間/范圍
Kotlin數(shù)據(jù)類
Kotlin lambda表達(dá)式
Kotlin是免費(fèi)的嗎?
Kotlin包
使用Kotlin進(jìn)行Android開發(fā)
在Java中調(diào)用Kotlin代碼
Kotlin this表達(dá)式
使用Kotlin進(jìn)行JavaScript開發(fā)
Kotlin擴(kuò)展
Kotlin解構(gòu)聲明
Kotlin注解
Kotlin使用Maven

Kotlin使用Maven

插件與版本

kotlin-maven-plugin 用于編譯 Kotlin 源代碼與模塊,目前只支持 Marven V3。

通過 kotlin.version 屬性定義要使用的 Kotlin 版本:

<properties>
    <kotlin.version>{{ site.data.releases.latest.version }}</kotlin.version>
</properties>

依賴

Kotlin 有一個廣泛的標(biāo)準(zhǔn)庫可用于應(yīng)用程序。在 pom 文件中配置以下依賴關(guān)系

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

如果你是針對 JDK 7 或 JDK 8,那么可以使用擴(kuò)展版本的 Kotlin 標(biāo)準(zhǔn)庫,
其中包含為新版 JDK 所增 API 而加的額外的擴(kuò)展函數(shù)。使用 kotlin-stdlib-jre7
kotlin-stdlib-jre8 取代 kotlin-stdlib,這取決于你的 JDK 版本。

如果你的項(xiàng)目使用 Kotlin 反射 或者測試設(shè)施,那么你還需要添加相應(yīng)的依賴項(xiàng)。
其構(gòu)件 ID 對于反射庫是 kotlin-reflect,對于測試庫是 kotlin-testkotlin-test-junit
。

編譯只有 Kotlin 的源代碼

要編譯源代碼,請?jiān)?<build> 標(biāo)簽中指定源代碼目錄:

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

需要引用 Kotlin Maven 插件來編譯源代碼:

<build>
    <plugins>
        <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <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>

同時編譯 Kotlin 與 Java 源代碼

要編譯混合代碼應(yīng)用程序,必須在 Java 編譯器之前調(diào)用 Kotlin 編譯器。
按照 maven 的方式,這意味著應(yīng)該使用以下方法在 maven-compiler-plugin 之前運(yùn)行 kotlin-maven-plugin,確保 pom.xml 文件中的 kotlin 插件位于 maven-compiler-plugin 上面。

<build>
    <plugins>
        <plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <goals> <goal>compile</goal> </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>
                    <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>

增量編譯

為了使構(gòu)建更快,可以為 Maven 啟用增量編譯(從 Kotlin 1.1.2 起支持)。
為了做到這一點(diǎn),需要定義 kotlin.compiler.incremental 屬性:

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

或者,使用 -Dkotlin.compiler.incremental=true 選項(xiàng)運(yùn)行構(gòu)建。

注解處理

請參見 Kotlin 注解處理工具(kapt)的描述。

Jar 文件

要創(chuàng)建一個僅包含模塊代碼的小型 Jar 文件,請?jiān)?Maven pom.xml 文件中的 build->plugins 下面包含以下內(nèi)容,
其中 main.class 定義為一個屬性,并指向主 Kotlin 或 Java 類。

<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>

獨(dú)立的 Jar 文件

要創(chuàng)建一個獨(dú)立的(self-contained)Jar 文件,包含模塊中的代碼及其依賴項(xiàng),請?jiān)?Maven pom.xml 文件中的 build->plugins 下面包含以下內(nèi)容
其中 main.class 定義為一個屬性,并指向主 Kotlin 或 Java 類。

<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>

這個獨(dú)立的 jar 文件可以直接傳給 JRE 來運(yùn)行應(yīng)用程序:

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

針對 JavaScript

為了編譯 JavaScript 代碼,需要使用 jstest-js 目標(biāo)來執(zhí)行 compile

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <version>${kotlin.version}</version>
    <executions>
        <execution>
            <id>compile</id>
            <phase>compile</phase>
            <goals>
                <goal>js</goal>
            </goals>
        </execution>
        <execution>
            <id>test-compile</id>
            <phase>test-compile</phase>
            <goals>
                <goal>test-js</goal>
            </goals>
        </execution>
    </executions>
</plugin>

你還需要更改標(biāo)準(zhǔn)庫依賴:

<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-js</artifactId>
<version>${kotlin.version}</version>

對于單元測試支持,你還需要添加對 kotlin-test-js 構(gòu)件的依賴。

更多信息請參閱以 Maven 入門使用 Kotlin 與 JavaScript
教程。

指定編譯器選項(xiàng)

可以將額外的編譯器選項(xiàng)指定為 Maven 插件節(jié)點(diǎn)的 <configuration> 元素下的標(biāo)簽

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>
    <executions>……</executions>
    <configuration>
        <nowarn>true</nowarn>  <!-- 禁用警告 -->
    </configuration>
</plugin>

許多選項(xiàng)還可以通過屬性來配置:

<project ……>
    <properties>
        <kotlin.compiler.languageVersion>1.0</kotlin.compiler.languageVersion>
    </properties>
</project>

支持以下屬性:

JVM 和 JS 的公共屬性

名稱 屬性名 描述 可能的值 默認(rèn)值
nowarn 不生成警告 true, false false
languageVersion kotlin.compiler.languageVersion 提供與指定語言版本源代碼兼容性 “1.0”, “1.1” “1.1”
apiVersion kotlin.compiler.apiVersion 只允許使用來自捆綁庫的指定版本中的聲明 “1.0”, “1.1” “1.1”
sourceDirs 包含要編譯源文件的目錄 該項(xiàng)目源代碼根目錄
compilerPlugins 啟用編譯器插件 []
pluginOptions 編譯器插件的選項(xiàng) []
args 額外的編譯器參數(shù) []

JVM 特有的屬性

名稱 屬性名 描述 可能的值 默認(rèn)值
jvmTarget kotlin.compiler.jvmTarget 生成的 JVM 字節(jié)碼的目標(biāo)版本 “1.6”, “1.8” “1.6”
jdkHome kotlin.compiler.jdkHome 要包含到 classpath 中的 JDK 主目錄路徑,如果與默認(rèn) JAVA_HOME 不同的話  

JS 特有的屬性

名稱 屬性名 描述 可能的值 默認(rèn)值
outputFile 輸出文件路徑
metaInfo 使用元數(shù)據(jù)生成 .meta.js 與 .kjsm 文件。用于創(chuàng)建庫 true, false true
sourceMap 生成源代碼映射(source map) true, false false
moduleKind 編譯器生成的模塊類型 “plain”, “amd”, “commonjs”, “umd” “plain”

生成文檔

標(biāo)準(zhǔn)的 JavaDoc 生成插件(maven-javadoc-plugin)不支持 Kotlin 代碼。
要生成 Kotlin 項(xiàng)目的文檔,請使用 Dokka;
相關(guān)配置說明請參見 Dokka README
。Dokka 支持混合語言項(xiàng)目,并且可以生成多種格式的輸出
,包括標(biāo)準(zhǔn) JavaDoc。

OSGi

對于 OSGi 支持,請參見 Kotlin OSGi 頁

示例

一個示例 Maven 項(xiàng)目可以從 Github 版本庫直接下載