概要

AntでのJavaコードコンパイルにError Proneを使用して、ソースコード解析を強化します。

サンプルターゲット

  • 以下、Installationに記述されているbuild.xmlを参考に作成したターゲットのサンプル
  • 公式のbuild.xmlをほぼ丸写しで動作可能だが、2つほど注意点がある
    • xmlns:unless="ant:unless"をルート要素に追加する必要がある
    • <javaversion>コンディションを使用しているので、ant1.10.2以上を使用する必要がある
<?xml version="1.0" encoding="UTF-8"?>
<project name="example" default="compile" 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, prepare-resource, prepare-web">
    <!-- 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"/>
    <condition property="jdk9orlater">
      <javaversion atleast="9"/>
    </condition>
    <path id="processorpath.ref">
      <fileset dir="${env.ERRORPRONE_HOME}" includes="*.jar" />
    </path>
    <javac srcdir="${build.src}"
           excludes="**/module-info.java"
           includes="**/*.java"
           destdir="${build.dest}"
           encoding="${compile.encoding}"
           debug="${compile.debug}"
           optimize="${compile.optimize}"
           deprecation="${compile.deprecation}"
           fork="yes"
           includeAntRuntime="no"
           classpathref="project.class.path">
      <compilerarg value="-J-Xbootclasspath/p:${javac.jar}" unless:set="jdk9orlater"/>
      <compilerarg line="-XDcompilePolicy=simple"/>
      <compilerarg value="-processorpath"/>
      <compilerarg pathref="processorpath.ref"/>
      <compilerarg value="-Xplugin:ErrorProne -Xep:DeadException:ERROR -Xep:CatchAndPrintStackTrace:OFF" />
      <compilerarg value="-J-Dfile.encoding=UTF-8" />
      <!-- compilerarg value="-J-Dsun.jnu.encoding=UTF-8" / -->
    </javac>
  </target>

解説

  1. Installationに記述されているerror_prone_core-2.3.2-with-dependencies.jarjFormatString-3.0.0.jarjavac-9+181-r4173-1.jarをダウンロードし、適当な(例えば環境変数ERRORPRONE_HOMEを設定した)場所に配置する
  2. 上記のような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

文字化け

  • 環境変数ANT_OPTSなどに-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8を設定してもcygwinbash(Character setUTF-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個

参考リンク

コメント