1. Manifest に Main クラスと Class パスを定義する設定
maven-jar-plugin を使う
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.blueskyarea.Main</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>etc/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
- manifest.mainClass で メインクラスを指定
- manifest.addClasspath を true にすることで、依存ライブラリをクラスパスに追加
- 依存ライブラリは lib ディレクトリに入れる予定なので、manifest.classpathPrefix に lib を指定
- プロパティファイルを etc ディレクトリに入れる予定なので、manifestEntries.Class-Path に etc/ を指定(/ が必要)
2. tar.gz にパッケージングする設定
maven-assembly-plugin を使う
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptor>src/main/assembly/bin.xml</descriptor>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
(追記)maven3.3.0 では、descriptor を descriptors で囲む
maven3.3.0
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/bin.xml</descriptor>
</descriptors>
<finalName>${project.artifactId}-${project.version}</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
- descriptor を別ファイル(bin.xml)で指定
3. descriptor の設定
bin.xml
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<formats>
<format>tar.gz</format>
</formats>
<fileSets>
<fileSet>
<directory>src/main/config</directory>
<outputDirectory>etc</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<fileSet>
<directory>target</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
- fileSet にて、src/main/config に含まれる *.properties を etc にコピーするように指定
- fileSet にて、target に含まれる *.jar を tar.gz にコピーするように指定
- dependencySet にて、依存ライブラリを lib にコピーするように指定
4. パッケージングして実行してみる
tar.gz ファイル生成
$ mvn clean package
$ tree
└── target
├── sample-project-bin.tar.gz
tar.gz ファイル解凍
$ tar zxvf target/sample-project-1.0-SNAPSHOT-bin.tar.gz
$ tree
├── sample-project-1.0-SNAPSHOT
│ ├── etc
│ │ └── sample-project.properties
│ ├── sample-project-SNAPSHOT.jar
│ ├── lib
│ │ ├── commons-configuration-1.10.jar
│ │ ├── commons-lang-2.6.jar
以下のようにパッケージングされていたことがわかる。
- ディレクトリ直下に jar ファイル
- lib 以下に依存ライブラリ
- etc 以下にプロパティファイル
Manifest ファイルの中身
$ jar -xvf sample-project-1.0-SNAPSHOT/sample-project-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Built-By: mh
Class-Path: lib/commons-configuration-1.10.jar lib/commons-lang-2.6.ja
r lib/commons-logging-1.1.1.jar lib/jetty-server-9.4.12.v20180830.jar
lib/javax.servlet-api-3.1.0.jar lib/jetty-http-9.4.12.v20180830.jar
lib/jetty-util-9.4.12.v20180830.jar lib/jetty-io-9.4.12.v20180830.jar
lib/jetty-webapp-9.4.12.v20180830.jar lib/jetty-xml-9.4.12.v20180830
.jar lib/jetty-servlet-9.4.12.v20180830.jar lib/jetty-security-9.4.12
.v20180830.jar lib/gson-2.2.4.jar etc/
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_144
Main-Class: com.blueskyarea.Main
以下が定義されていることがわかる。
- Main-Class にメインクラスのパッケージ
- Class-Path に依存ライブラリとプロパティファイルへのパス
jar 実行
$ java -jar sample-project-1.0-SNAPSHOT/sample-project-1.0-SNAPSHOT.jar
2018-11-17 12:52:49.579:INFO::main: Logging initialized @482ms to org.eclipse.jetty.util.log.StdErrLog
2018-11-17 12:52:49.775:INFO:oejs.Server:main: jetty-9.4.12.v20180830; built: 2018-08-30T13:59:14.071Z; git: 27208684755d94a92186989f695db2d7b21ebc51; jvm 1.8.0_144-b01
2018-11-17 12:52:49.889:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2018-11-17 12:52:49.889:INFO:oejs.session:main: No SessionScavenger set, using defaults
2018-11-17 12:52:49.896:INFO:oejs.session:main: node0 Scavenging every 600000ms
2018-11-17 12:52:49.918:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@27efef64{/,null,AVAILABLE}
2018-11-17 12:52:49.952:INFO:oejs.AbstractConnector:main: Started ServerConnector@1ef400fa{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2018-11-17 12:52:49.953:INFO:oejs.Server:main: Started @882ms
-jar で jar ファイルを指定するだけで実行可能。