Maven assembly プラグインを使う

Java の JARファイルを作成して、java のコマンドオプション -jar を指定して実行できるようにするには、
MANIFEST.MF で、Main-Class: を記述するのだが、依存関係が沢山ある場合、全て実行時のCLASSPATH
解決するようにしなければならなくてそれはそれで面倒くさい。

JARを作成する時に依存するライブラリ全てを同梱させてしまう便利な maven-assembly-plugin というのがある。
 jar-with-dependencies というところによると、JARファイル名の後半と前半にファイル名が分割されているということで、
後半の部分、プロジェクトの任意の場所、src でビルドターゲットにななっていないところ、
src/assembly のように、src の下に assembly と専用に作ってしまった方が良い。
jar-with-dependencies に書いてあるように以下のように、XMLを用意する。

  idタグのところが、JARファイルの後半の名前になるのでこれを変更する。
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="">http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
  <!-- TODO: a jarjar format would be better -->
  <!-- <id>jar-with-dependencies</id> -->
  <id>main</id>

  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

main.xml としておく。

プロジェクトの pom.xml にこの assembly プラグインで JARをゴールにして書く。

  <dependencies>
    :
  </dependencies>

  <build>
      <plugins>
          <plugin>

              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>

                  <archive>
                      <manifest>
                          <mainClass>org.teras.man.TerasMain</mainClass>
                      </manifest>

                   </archive>
                   <finalName>terasman</finalName>
                   <descriptors>
                       <descriptor>src/assembly/man.xml</descriptor>
                   </descriptors>

               </configuration>
               <executions>
                   <execution>
                       <id>make-assembly</id>
                       <phase>package</phase>
                       <goals>
                           <goal>attached</goal>
                       </goals>
                    </execution>
                </executions>
           </plugin>
      </plugins>
  </build>


  manifestに、main メソッド実行クラスを記述、
  finalNameで、指定したものが、JARファイルの前半文字列
  descriptor タグで、先ほどのXMLファイルのパスを指定する。

ビルドを実行すると、terasman-main.jar というファイルが生成される。