モチベーション
よくわからないJavaアプリケーションの実装を理解するために、とりあえず動かしてみながらソースコードのどこを通っているのかざっくり理解したいときってないでしょうか。そんなときカバレッジを取得しながら動かしてみると、調査が捗るかもしれません。OpenLiberty, Mavenを使った場合の例です。
方法
1.アプリケーションのコンパイルをする時にはデバッグ情報を含めるようにします。Mavenを利用する場合は以下のように設定します
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
<debug>true</debug>
<debuglevel>lines,vars,source</debuglevel>
</configuration>
</plugin>
2.https://www.jacoco.org/jacoco/ から入手したzipを入手してjarを展開すると出てくるjacocoagent.jarを-javaagent
オプションで実行時に以下のオプションを指定します。Libertyの場合はjvm.options
に記載します
-javaagent:/適当なパス/jacocoagent.jar
3.アプリケーションを手動で実行します。Libertyの場合はuser/servers/defaultServer
などサーバーのディレクトリにjacoco.exec
が出力されます
4.生成されたjacoco.exec
を使ってレポートを生成します。--classfiles
にはwarファイルを直接指定しても良いようです。--sourcefiles
はsource.jarでなくソースコードが存在するディレクトリを指定します(このオプション自体を複数回指定可能)。ソースコードの文字コードを指定したい場合は、--encoding UTF-8
のように指定します。
java -jar jacococli.jar report jacoco.exec \
--classfiles myapplication.war \
--sourcefiles src/main/java --html jacocoreport --csv jacocoreport.csv
レポート生成時に警告が出力される
コンパイル、アプリケーション実行、レポートの生成に別のバージョンのJavaを使うと以下のような警告が出力されることがあります。またJPAエンティティのように実行時に書き換えられるようなクラスファイルはどうしても警告が出力されてしまうようです。
https://www.jacoco.org/jacoco/trunk/doc/faq.html
[WARN] Some classes do not match with execution data.
[WARN] For report generation the same class files must be used as at runtime.