Maven3/mavenでパッケージしたjarの中のmainメソッドを実行する

Maven3/mavenでパッケージしたjarの中のmainメソッドを実行する

Mavenのちからで実行する

packageとかでコンパイルしたものを実行しようとすると

$ java target.classes.com.hoge.hoge01.App
Exception in thread "main" java.lang.NoClassDefFoundError: target/classes/com/hoge/hoge01/App (wrong name: com/hoge/hoge01/App)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: target.classes.com.hoge.hoge01.App.  Program will exit.

なんて言われて。mainがわかんねーよだって。

これにも作法があるっぽくて

$ mvn exec:java -Dexec.mainClass=com.hoge.hoge01.App

と実行するクラスを指定してやるとやるとできる。

Maven Repository: org.codehaus.mojo » exec-maven-plugin

pomに直接書くこともできて

<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <configuration>
          <executable>java</executable>
          <mainClass>com.hoge.hoge01.App</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

のように指定すれば実行対象を指定無しで実行できる。

そもそも実行可能なjarを作る

↓のプラグインを入れると依存性を全部jarに練りこんだ状態でビルドされる

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

ビルド!

$ mvn package

実行できる

$ java -cp target/hogehoge.jar hoge.piyo.fuga.HelloWorld
java/apache_maven/maven3/run_main_method_in_jar_with_maven.txt · 最終更新: 2019-06-14 18:46 by ore