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