CLOVER🍀

That was when it all began.

maven-surefire-plugin、maven-exec-pluginでJavaVM引数を与えることを考える

ちょっとあるコードをデバッグしていて、方法がわからなかったので調べてみました。

サンプルとして、こんなコードを用意します。
src/main/java/App.java

public class App {
    public static void main(String... args) {
        new App().add(2, 3);
    }

    public int add(int a, int b) {
        return a + b;
    }
}

テストコード。
src/test/java/AppTest.java

import static org.assertj.core.api.Assertions.*;

import org.junit.Test;

public class AppTest {
    @Test
    public void test() {
        App sut = new App();
        assertThat(sut.add(2, 3))
            .isEqualTo(5);
    }
}

これらを使って、mvn testやmvn exec:javaを行う時に、JavaVMへ引数を与えることを考えます。例えば、-Xmxとか。

今回は、Bytemanのスクリプトを用意しました。
trace.btm

RULE trace app
CLASS App
METHOD add
AT ENTRY
IF TRUE
  DO traceln("*** args: " + $1 + ", " + $2 + " ***")
ENDRULE

maven-surefire-pluginの場合

argLineを使えばよいらしいです。

http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html

実行。

$ mvn test -DargLine=-javaagent:$BYTEMAN_HOME/lib/byteman.jar=script:trace.btm

結果。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running AppTest
*** args: 2, 3 ***
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.797 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

ちゃんと、スクリプトの内容が織り込まれました。

maven-exec-pluginの場合

MAVEN_OPTSを使うしかなさそう?

$ export MAVEN_OPTS=-javaagent:$BYTEMAN_HOME/lib/byteman.jar=script:trace.btm

実行。

$ mvn exec:java -Dexec.mainClass=App

結果。

*** args: 2, 3 ***

動きましたね。

でも、これならmvn testでargLineにする方がいいなー。