menu
書いてる野郎
orebike@gmail.com
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に練りこんだ状態でビルドされる
<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