Apache Mavenで簡単Javaアプリ実行

Apache Mavenを使うとJavaの開発時にライブラリを簡単に導入できて重宝していますが、Javaアプリを実行することも簡単にできます。さっそくやってみましょう。

準備

まずはJavaアプリの雛形を作成します。お馴染みのQuickStartですね。

$ mvn archetype:generate \
 -DgroupId=org.sssg.soft.sample.maven \
 -DartifactId=simpleapp \
 -DarchetypeArtifactId=maven-archetype-quickstart \
 -DinteractiveMode=false

simpleappディレクトリができあがり、srcにはHello Worldを表示するプログラムが自動生成されます。

exec-maven-plugin

これでJavaアプリの雛形ができるので、できあがったsimpleappディレクトリにあるpom.xmlにexec-maven-pluginを使うための記述を追加します。具体的には「http://maven.apache.org」の行のすぐ下へ下記を追加します。

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <configuration>
        <mainClass>org.sssg.soft.sample.maven.App</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

準備はこれだけです。実行してみましょう。mvn packageをしてから、mvn exec:javaとすると、Hello World!という出力がでているのがわかるでしょうか。

$ cd simpleapp
$ mvn package
$ mvn exec:java
(略)
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ simpleapp <<<
[INFO] 
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ simpleapp ---
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.482s
[INFO] Finished at: Tue Jul 30 17:31:01 JST 2013
[INFO] Final Memory: 5M/15M
[INFO] ------------------------------------------------------------------------

引き数を扱うこともできます。src/main/org/sssg/soft/sample/maven/App.javaを次のように修正します。

package org.sssg.soft.sample.maven;
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
	int i=0;
	for (String a: args) {
          System.out.println("arg" + i + ":" + a);
	  i++;
	}
    }
}

次にpom.xmlを修正します。exec-maven-pluginの設定でarguments要素を追加している点に注目してください。ここで指定した内容が実行時に引き数として渡されます。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sssg.soft.sample.maven</groupId>
  <artifactId>simpleapp</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simpleapp</name>
  <url>http://maven.apache.org</url>
<build>
<plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <configuration>
      <mainClass>org.sssg.soft.sample.maven.App</mainClass>
          <arguments>
            <argument>a1</argument>
            <argument>a2</argument>
          </arguments>
    </configuration>
  </plugin>
</plugins>
</build>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

さっきと同様にしてmvn package してから、mvn exec:java をしてみましょう。下記のように引き数の情報が表示され、引き数がプログラムに渡っていることがわかります。

[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ simpleapp ---
Hello World!
arg0:a1
arg1:a2
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.449s
[INFO] Finished at: Tue Jul 30 17:40:25 JST 2013
[INFO] Final Memory: 5M/15M
[INFO] ------------------------------------------------------------------------

実行時に次のように指定すると、設定ファイルとは別の引き数を渡すことができます。

$ mvn exec:java -Dexec.args="b1 b2 b3" 

便利ですね!

maven-jar-plugin

maven-jar-pluginを使うと、実行時に依存関係があるライブラリをJavaアプリのjarと一緒にtargetディレクトリへ出力することができます。自作アプリを他のマシンへ持っていくときなどに便利ですね。

さきほどの、pom.xmlでbuild要素の中に入れたplugins要素に、maven-jar-pluginの設定を追加します。

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <mainClass>org.sssg.soft.sample.maven.App</mainClass>
          <packageName>org.sssg.soft.sample.maven</packageName>
          <addClasspath>true</addClasspath>
          <addExtensions>true</addExtensions>
          <classpathPrefix>dependency</classpathPrefix>
        </manifest>
      </archive>
    </configuration>
  </plugin>
</plugins>

例えばlog4jを追加すると下記のようなpom.xmlとなります。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sssg.soft.sample.maven</groupId>
  <artifactId>simpleapp</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simpleapp</name>
  <url>http://maven.apache.org</url>
  <build>
   <plugins>
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-jar-plugin</artifactId>
     <version>2.4</version>
     <configuration>
      <archive>
        <manifest>
          <mainClass>org.sssg.soft.sample.maven.App</mainClass>
          <packageName>org.sssg.soft.sample.maven</packageName>
          <addClasspath>true</addClasspath>
          <addExtensions>true</addExtensions>
          <classpathPrefix>dependency</classpathPrefix>
        </manifest>
      </archive>
     </configuration>
    </plugin>
   </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

ライブラリをclasspathPrefix要素で指定したdependencyディレクトリへ出力するには次のようにします。

$ mvn package
$ mvn dependency:copy-dependencies

Manifestファイルにも使用するライブラリの情報が書き込まれます。

$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Extension-List: log4j
Built-By: hiro345
Build-Jdk: 1.7.0_25
Class-Path: dependency/log4j-1.2.17.jar
Package: org.sssg.soft.sample.maven
log4j-Extension-Name: log4j
Created-By: Apache Maven 3.0.4
log4j-Implementation-Version: 1.2.17
Main-Class: org.sssg.soft.sample.maven.App
Archiver-Version: Plexus Archiver

実行は下記のようになります。targetディレクトリにJARファイルとdependencyディレクトリが生成されるので、targetディレクトリでjarファイルを実行すれば良いということですね。

$ cd target
$ java -jar simpleapp-1.0-SNAPSHOT.jar

依存ライブラリをdependencyではなく例えばlibとかのディレクトリへ出力するように変更したい場合は、classpathPrefix要素のボディ部をlibと変更して、mvn dependency:copy-dependenciesを実行するときに-DoutputDirectory=target/libとします。

$ mvn package
$ mvn dependency:copy-dependencies -DoutputDirectory=target/lib
同じタグの記事: Java
同じタグの記事: Maven
同じカテゴリの記事: Java
関連書籍: Java