このガイドでは、Maven を使用して簡単な Java プロジェクトを構築する方法を説明します。

構築する

時刻を提供するアプリケーションを作成し、Maven でビルドします。

必要なもの

  • 約 15 分

  • お気に入りのテキストエディターまたは IDE

  • JDK 8 (英語) 以降

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、プロジェクトをセットアップするに進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-maven/complete のコードに対して結果を確認できます。

プロジェクトをセットアップする

まず、Maven がビルドする Java プロジェクトをセットアップする必要があります。Maven に焦点を当て続けるために、現時点ではプロジェクトをできるだけシンプルにしてください。選択したプロジェクトフォルダーにこの構造を作成します。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

 └──  src
     └──  main
         └──  java
             └──  hello

src/main/java/hello ディレクトリ内で、必要な Java クラスを作成できます。このガイドの残りの部分との一貫性を維持するには、これら 2 つのクラス HelloWorld.java および Greeter.java を作成します。

src/main/java/hello/HelloWorld.java

package hello;

public class HelloWorld {
  public static void main(String[] args) {
    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}

src/main/java/hello/Greeter.java

package hello;

public class Greeter {
  public String sayHello() {
    return "Hello world!";
  }
}

Maven でビルドする準備ができたプロジェクトができたため、次のステップは Maven をインストールすることです。

Maven は、https://maven.apache.org/download.cgi (英語) で zip ファイルとしてダウンロードできます。必要なのはバイナリのみです。apache-maven- {version} -bin.zip または apache-maven- {version} -bin.tar.gz へのリンクを探してください。

zip ファイルをダウンロードしたら、コンピューターに解凍します。次に、bin フォルダーをパスに追加します。

Maven インストールをテストするには、コマンドラインから mvn を実行します。

mvn -v

すべてうまくいけば、Maven のインストールに関する情報が表示されます。次のようになります(おそらく少し異なります)。

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
Maven home: /home/dsyer/Programs/apache-maven
Java version: 1.8.0_152, vendor: Azul Systems, Inc.
Java home: /home/dsyer/.sdkman/candidates/java/8u152-zulu/jre
Default locale: en_GB, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-36-generic", arch: "amd64", family: "unix"

おめでとう!これで、Maven がインストールされました。

情報 : Maven ラッパー (GitHub) を使用して、開発者が Maven の正しいバージョンを持っているか、まったくインストールしないようにすることを検討してください。Spring Initializr (英語) からダウンロードしたプロジェクトには、ラッパーが含まれています。プロジェクトの最上位に mvn の代わりに実行するスクリプト mvnw として表示されます。

シンプルな Maven ビルドを定義する

Maven がインストールされたため、Maven プロジェクト定義を作成する必要があります。Maven プロジェクトは、pom.xml という名前の XML ファイルで定義されます。とりわけ、このファイルは、プロジェクトの名前、バージョン、および外部ライブラリに対する依存関係を提供します。

プロジェクトのルートに pom.xml という名前のファイルを作成し(つまり、src フォルダーの隣に配置し)、次の内容を指定します。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-maven</artifactId>
    <packaging>jar</packaging>
    <version>0.1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>hello.HelloWorld</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

オプションの <packaging> 要素を除いて、これは Java プロジェクトのビルドに必要な最も単純な pom.xml ファイルです。プロジェクト構成の次の詳細が含まれます。

  • <modelVersion>。POM モデルバージョン(常に 4.0.0)。

  • <groupId>。プロジェクトが属するグループまたは組織。多くの場合、逆ドメイン名として表されます。

  • <artifactId>。プロジェクトのライブラリアーティファクトに付けられる名前(たとえば、JAR または WAR ファイルの名前)。

  • <version>。ビルド中のプロジェクトのバージョン。

  • <packaging> - プロジェクトのパッケージ方法。JAR ファイルのパッケージ化のデフォルトは「jar」です。WAR ファイルのパッケージ化には「war」を使用します。

バージョン管理スキームの選択に関しては、Spring はセマンティックバージョン管理 (英語) アプローチを推奨しています。

この時点で、最小限でありながら有能な Maven プロジェクトが定義されました。

Java コードをビルドする

Maven でプロジェクトをビルドする準備ができました。プロジェクトのコードをコンパイルし、ライブラリパッケージ(JAR ファイルなど)を作成し、ローカル Maven 依存関係リポジトリにライブラリをインストールするなど、Maven でいくつかのビルドライフサイクルのゴールを実行できます。

ビルドを試すには、コマンドラインで次を発行します。

mvn compile

これにより、Maven が実行され、コンパイルのゴールを実行するように指示されます。完了したら、コンパイルされた .class ファイルが target/classes ディレクトリにあります。

.class ファイルを直接配布したり操作したりする可能性は低いため、代わりにパッケージのゴールを実行することをお勧めします。

mvn package

パッケージのゴールは、Java コードをコンパイルし、テストを実行し、ターゲットディレクトリ内の JAR ファイルにコードをパッケージ化することで終了します。JAR ファイルの名前は、プロジェクトの <artifactId> および <version> に基づきます。例:以前の最小の pom.xml ファイルを指定すると、JAR ファイルの名前は gs-maven-0.1.0.jar になります。

JAR ファイルを実行するには:

java -jar target/gs-maven-0.1.0.jar
<packaging> の値を「jar」から「war」に変更した場合、結果は JAR ファイルではなく、ターゲットディレクトリ内の WAR ファイルになります。

Maven は、プロジェクトの依存関係にすばやくアクセスできるように、ローカルマシンの依存関係のリポジトリ(通常はホームディレクトリの .m2/repository ディレクトリ)を維持します。プロジェクトの JAR ファイルをそのローカルリポジトリにインストールする場合は、install ゴールを呼び出す必要があります。

mvn install

インストールのゴールは、プロジェクトのコードをコンパイル、テスト、およびパッケージ化し、ローカルの依存関係リポジトリにコピーして、別のプロジェクトが依存関係として参照できるようにすることです。

依存関係について言えば、今度は Maven ビルドで依存関係を宣言します。

依存関係を宣言する

単純な Hello World サンプルは完全に自己完結型であり、追加のライブラリに依存しません。ただし、ほとんどのアプリケーションは、一般的な複雑な機能を処理するために外部ライブラリに依存しています。

例:「Hello World!」と言うだけでなく、アプリケーションに現在の日付と時刻を出力させたいとします。ネイティブ Java ライブラリの日付と時刻の機能を使用することもできますが、Joda Time ライブラリを使用することでさらに面白くすることができます。

まず、HelloWorld.java を次のように変更します。

src/main/java/hello/HelloWorld.java

package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
  public static void main(String[] args) {
    LocalTime currentTime = new LocalTime();
    System.out.println("The current local time is: " + currentTime);
    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}

ここでは、HelloWorld は Joda Time の LocalTime クラスを使用して現在の時刻を取得および出力します。

mvn compile を実行してプロジェクトをビルドする場合、ビルドでコンパイル依存関係として Joda Time を宣言していないため、ビルドは失敗します。これを修正するには、pom.xml に次の行を追加します(<project> 要素内)。

<dependencies>
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.9.2</version>
		</dependency>
</dependencies>

この XML ブロックは、プロジェクトの依存関係のリストを宣言します。具体的には、Joda Time ライブラリの単一の依存関係を宣言します。<dependency> 要素内で、依存関係座標は 3 つのサブ要素によって定義されます。

  • <groupId> - 依存関係が属するグループまたは組織。

  • <artifactId> - 必要なライブラリ。

  • <version> - 必要なライブラリの特定のバージョン。

デフォルトでは、すべての依存関係は compile 依存関係としてスコープされます。つまり、それらはコンパイル時に使用可能でなければなりません(そして、WAR の /WEB-INF/libs フォルダーを含む WAR ファイルを作成している場合)。さらに、<scope> 要素を指定して、次のスコープのいずれかを指定できます。

  • provided - プロジェクトコードのコンパイルに必要な依存関係ですが、コードを実行するコンテナー(Java Servlet API など)によって実行時に提供されます。

  • test - テストのコンパイルと実行に使用される依存関係。ただし、プロジェクトのランタイムコードの構築または実行には必要ありません。

mvn compile または mvn package を実行すると、Maven は Maven セントラルリポジトリからの Joda Time 依存関係を解決し、ビルドが成功します。

テストを書く

最初に、テスト範囲で、pom.xml への依存関係として JUnit を追加します。

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>

次に、次のようなテストケースを作成します。

src/test/java/hello/GreeterTest.java

package hello;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;

import org.junit.Test;

public class GreeterTest {

  private Greeter greeter = new Greeter();

  @Test
  public void greeterSaysHello() {
    assertThat(greeter.sayHello(), containsString("Hello"));
  }

}

Maven は、「surefire」というプラグインを使用して単体テストを実行します。このプラグインのデフォルト構成は、*Test と一致する名前を持つ src/test/java のすべてのクラスをコンパイルして実行します。次のようにコマンドラインでテストを実行できます

mvn test

または、すでに上で示した mvn install ステップを使用します(「インストール」のステージとして「テスト」が含まれるライフサイクル定義があります)。

完成した pom.xml ファイルは次のとおりです。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>org.springframework</groupId>
	<artifactId>gs-maven</artifactId>
	<packaging>jar</packaging>
	<version>0.1.0</version>

	<properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>

	<dependencies>
		<!-- tag::joda[] -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.9.2</version>
		</dependency>
		<!-- end::joda[] -->
		<!-- tag::junit[] -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- end::junit[] -->
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>2.1</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<transformers>
								<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
									<mainClass>hello.HelloWorld</mainClass>
								</transformer>
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>
完成した pom.xml ファイルは、JAR ファイルを実行可能にするという単純な利便性のために Maven Shade プラグイン (Apache) を使用しています。このガイドの焦点は、この特定のプラグインを使用せずに、Maven を開始することです。

要約

おめでとう! Java プロジェクトを構築するためのシンプルで効果的な Maven プロジェクト定義を作成しました。

関連事項

次のガイドも役立ちます。

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください (GitHub)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。