AntでError Proneを使用する
Total: 3509
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
Ant
でのJava
コードコンパイルにError Prone
を使用して、ソースコード解析を強化します。
サンプルターゲット
- 以下、Installationに記述されているbuild.xmlを参考に作成したターゲットのサンプル
- 公式の
build.xml
をほぼ丸写しで動作可能だが、2
つほど注意点があるxmlns:unless="ant:unless"
をルート要素に追加する必要がある<javaversion>
コンディションを使用しているので、ant
は1.10.2
以上を使用する必要がある- Release Notes of Apache Ant 1.10.2
sdkman
でant
をインストールすると、2018-10-27
現在の最新は1.10.1
なのでエラーになる
<?xml version="1.0" encoding="UTF-8"?>
<project name="example" default="compile" xmlns:if="ant:if" xmlns:unless="ant:unless">
...
<path id="project.class.path">
<pathelement location="${build.dest}" />
<pathelement location="${java.home}/lib/javaws.jar" />
<pathelement path="${java.class.path}" />
</path>
<target name="errorprone" depends="prepare-src">
<!-- using github.com/google/error-prone-javac is required when running on JDK 8 -->
<property name="javac.jar" location="${env.ERRORPRONE_HOME}/javac-9+181-r4173-1.jar"/>
<path id="processorpath.ref">
<fileset dir="${env.ERRORPRONE_HOME}">
<include name="*.jar" />
<exclude name="error_prone_core-2.10.0-with-dependencies.jar" if:set="jdk9orlater" />
<exclude name="javac-9+181-r4173-1.jar" if:set="jdk9orlater" />
<exclude name="jFormatString-3.0.0.jar" if:set="jdk9orlater" />
</fileset>
</path>
<javac srcdir="${build.src}"
destdir="${build.dest}"
encoding="${compile.encoding}"
debug="${compile.debug}"
optimize="${compile.optimize}"
deprecation="${compile.deprecation}"
fork="yes"
includeAntRuntime="no"
classpathref="project.class.path">
<include name="**/*.java" />
<exclude name="**/module-info.java" if:set="jdk9orlater" />
<compilerarg value="-J-Xbootclasspath/p:${javac.jar}" unless:set="jdk9orlater"/>
<compilerarg value="-XDcompilePolicy=simple"/>
<compilerarg value="-processorpath"/>
<compilerarg pathref="processorpath.ref"/>
<compilerarg value="-Xplugin:ErrorProne -Xep:DeadException:ERROR -Xep:MultipleTopLevelClasses:OFF" />
<compilerarg value="-J-Dfile.encoding=UTF-8" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED" if:set="jdk9orlater" />
<compilerarg value="--add-exports=java.desktop/com.sun.java.swing.plaf.windows=ALL-UNNAMED" if:set="jdk9orlater" />
</javac>
</target>
解説
- Installationに記述されている
error_prone_core-2.3.2-with-dependencies.jar
、jFormatString-3.0.0.jar
、javac-9+181-r4173-1.jar
をダウンロードし、適当な(例えば環境変数ERRORPRONE_HOME
を設定した)場所に配置する - 上記のような
errorprone
ターゲットをbuild.xml
に追加する、またはcomplie
ターゲットの<javac>
を置き換えてコンパイルする
- 例えば
MultipleTopLevelClasses
をチェックしないように設定する場合は、以下のように-Xep:MultipleTopLevelClasses:OFF
を引数に追加する<compilerarg value="-Xplugin:ErrorProne -Xep:DeadException:ERROR -Xep:MultipleTopLevelClasses:OFF -Xep:CatchAndPrintStackTrace:OFF" />
- Command-line flags
Error Prone 2.4.0
Ant
+Error Prone 2.4.0
で以下のような例外が発生する?- ThreeTen-Extra - Homeの
Releases
、Download
からthreeten-extra-1.5.0.jar
をダウンロードしてクラスパス(上記のbuild.xml
の場合${env.ERRORPRONE_HOME}
に設定したディレクトリ)に配置すれば解消する
- ThreeTen-Extra - Homeの
An unhandled exception was thrown by the Error Prone static analysis plugin. [javac] Please report this at https://github.com/google/error-prone/issues/new and include the following: [javac] [javac] error-prone version: 2.4.0 [javac] BugPattern: (see stack trace) [javac] Stack Trace: [javac] java.lang.NoClassDefFoundError: org/threeten/extra/AmPm [javac] at com.google.errorprone.bugpatterns.time.FromTemporalAccessor.<clinit>(FromTemporalAccessor.java:103) [javac] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [javac] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [javac] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [javac] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [javac] at com.google.errorprone.scanner.ScannerSupplierImpl.instantiateChecker(ScannerSupplierImpl.java:84)
文字化け
- 環境変数
ANT_OPTS
などに-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
を設定してもcygwin
のbash
(Character set
はUTF-8
)で文字化けするPMD
などの出力は正常javac
タスクのencoding
を指定しても効果なし
errorprone: [javac] Compiling 1 source file to C:\jst\ComboBoxItemCopy\target\classes [javac] C:\jst\ComboBoxItemCopy\target\src\example\MainPanel.java:105: �x��:[CatchAndPrintStackTrace] Logging or rethrowing exceptions should usually be preferred to catching and calling printStackTrace [javac] ex.printStackTrace(); [javac] ^ [javac] (see https://errorprone.info/bugpattern/CatchAndPrintStackTrace) [javac] �x��1��
javac
タスクの子要素に<compilerarg value="-J-Dfile.encoding=UTF-8" />
を追加すると文字化けは解消された- コンソール出力には
<compilerarg value="-J-Dsun.jnu.encoding=UTF-8" />
が効きそうだが、なぜか効果なし
- コンソール出力には
errorprone: [javac] Compiling 1 source file to C:\jst\ComboBoxItemCopy\target\classes [javac] C:\jst\ComboBoxItemCopy\target\src\example\MainPanel.java:105: 警告:[CatchAndPrintStackTrace] Logging or rethrowing exceptions should usually be preferred to catching and calling printStackTrace [javac] ex.printStackTrace(); [javac] ^ [javac] (see https://errorprone.info/bugpattern/CatchAndPrintStackTrace) [javac] 警告1個