Quantcast
Channel: Kengo's blog
Viewing all articles
Browse latest Browse all 157

--add-exportsをMaven/Gradleで使う

$
0
0

--add-exportsなんてオプションは使わないに越したことはないのですが、依存先ライブラリの都合でどうしても必要という私のような人のためのメモ。

ポイントは javacだけでなく javadocないし java(テスト実行)コマンドに対するオプション提供も必要という点です。Gradle用のサンプルプロジェクトMaven用のサンプルプロジェクトもあります。

コンパイラ用の設定

注意点として、--add-exportsオプションは --releaseオプションと同時に使えません

Maven3

<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.9.0</version><configuration><source>11</source><target>11</target><encoding>${project.build.sourceEncoding}</encoding><forceJavacCompilerUse>true</forceJavacCompilerUse><showWarnings>true</showWarnings><compilerArgs><arg>--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg></compilerArgs>

Gradle

// build.gradle.ktsval exportsArgs = listOf(
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
    "--add-exports",
    "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
)

tasks.withType<JavaCompile>() {
    sourceCompatibility = "11"
    targetCompatibility = "11"
    options.compilerArgs.addAll(exportsArgs)
}

javadoc用の設定

いろいろとオプションを指定する手法が提供されていますが、以下のように<additionalOptions>を使う方法での動作を確認しました。内部的にはOptionファイルを経由してjavadocコマンドのオプションを設定しています。

Maven

<build><plugins><plugin><artifactId>maven-javadoc-plugin</artifactId><version>3.3.1</version><configuration><additionalOptions><arg>--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg><arg>--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg></additionalOptions></configuration></plugin>

Gradle

一気にややこしくなります。 options.addStringOption()では動作しないので、Maven同様にOptionファイルを経由しての指定が望ましいです。

// build.gradle.ktsval addExportsFile = file("$buildDir/tmp/javadoc/add-exports.txt")
val createJavadocOptionFile by tasks.registering {
    outputs.file(addExportsFile)
    doLast {
        addExportsFile.printWriter().use { writer ->
            exportsArgs.chunked(2).forEach {
                writer.println("${it[0]}=${it[1]}")
            }
        }
    }
}
tasks {
    withType<Javadoc> {
        dependsOn(createJavadocOptionFile)
        options.optionFiles(addExportsFile)
    }
}

テスト実行

Maven

surefireプラグインJVMをforkするなら、forkするJVM側にオプションを設定します。そうではない場合、以下のような .mvn/jvm.configファイルでMavenを実行するJVM自体に設定を行います。

--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED

Gradle

jvmArgsプロパティを経由して設定します。このプロパティは標準でnullなので、ビルドスクリプトの他の箇所で設定していないなら .addAll()ではなく =を使って設定します。

// build.gradle.kts
tasks {
    test {
        useJUnit()
        jvmArgs = exportsArgs
    }

Viewing all articles
Browse latest Browse all 157

Trending Articles