Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Maven + Eclipseでマルチモジュールプロジェクトを作成する

スポンサードリンク

f:id:fa11enprince:20190723093752j:plain 良く忘れるのでメモ
様々な事情でプライベートリポジトリを立てられなかったりする場合や、 そもそもプライベートリポジトリ立てるまでもないよねというときに便利なマルチモジュールプロジェクトの構成を作ります。 お題目は、Spring Boot + MongoDB + PostgreSQLにしましょう。
ちなみにですが、あまり解説はしていませんが、本プロジェクトはマルチデータソースに対応しています。
PostgreSQL + MongoDBです。

概要

少々解説すると、

@SpringBootApplication
@ComponentScan(basePackages = { "${packages.common.component}", "${app.package}" })
public class SampleDbAccessApp implements ApplicationRunner {
    @Autowired
    PosgresSampleService postgresSampleService;
    @Autowired
    MongoSampleService mongoSampleService;
    
    public static void main(String[] args) {
        SpringApplication.run(SampleDbAccessApp.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        PostgresSample postgre = new PostgresSample();
        postgre.setName("John");
        postgresSampleService.save(postgre);
        List<PostgresSample> findResult1 = postgresSampleService.findAll();
        findResult1.forEach(System.out::println);
        
        MongoSample mongo = new MongoSample();
        mongo.setName("Kate");
        mongoSampleService.save(mongo);
        List<MongoSample> findResult2 = mongoSampleService.findAll();
        findResult2.forEach(System.out::println);
    }
}

最初のコードによる設定周りさえきちんとやっておけば、特に意識せず上記のように使えます。
PosgresSampleService がPostgresSampleRepository 経由で
PostgreSQLにアクセスできます。
MongoSampleService が MongoSampleRepository 経由で
MongoDBにアクセスできます。

ちなみにWindows前提です。Mac/Linuxも大して変わらないと思います。

ソフト バージョン 備考
Java 1.8
Maven 3.6.1
lombok 1.18.8
Eclipse 2019-12
Font Myrica M
PostgreSQL 10.9 Docker利用
MongoDB 3.6.13 Docker利用
Spring Boot 2.1.6

あと、Docker for WindowsとHyper-V(Windows 10 Pro)が必要です。 なければ、直接入れるなどしてください。 Eclipse IDE 2019‑12で日本語のコメント文字の不具合が修正されていましたのでフォントは不要です。

完成したもの

今回作成するものの完成品です。 下記は具体的な手順です。まさかのJavaのインストールから書いてます。

手順

Javaのインストール

Adopt Open JDK等をインストールします。 インストーラーが準備されているので方法は割愛します。
AdoptOpenJDK - Open source, prebuilt OpenJDK binaries
Java 8のHotSpotがおすすめです。

Mavenのインストール

Maven – Download Apache Maven
よりapache-maven-3.6.1-bin.zipダウンロードします。
ダウンロードしたものを解凍しapache-maven-3.6.1をC直下に移動します。
Cに移動した後、binの位置が下記のようになっていればOKです。
C:\apache-maven-3.6.1\bin
環境変数を設定します。
M2_HOME%USERPROFILE%\.m2
さらに今回はシステム環境変数のほうに上記binのパスを設定します。
C:\apache-maven-3.6.1\bin

Proxy環境で虐げられている人は、まぁ調べてくださいというところですが、
ヒントはやり方は2通りあって、%USERPROFILE%\.m2\settings.xmlを作成するのが一番お手軽です。

念のためコマンドプロンプトにmvn -vを打って下記が表示されればOKです。

>mvn -v
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00)
Maven home: C:\apache-maven-3.6.1\bin\..
Java version: 1.8.0_192, vendor: Azul Systems, Inc., runtime: C:\Program Files\Zulu\zulu-8\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

私の環境ではZuleのJDKを使っていますが、たぶん、Adopt Open JDK HotSpotのほうがおすすめです。

PostgreSQLのインストール

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads よりダウンロードしてインストールしてもいいのですが、 docker-composeで入れることにします。 GitHubのReadMe.mdを参照してください。
initdbがうまくいかない場合は
File in docker-entrypoint-initdb.d never get executed when using docker compose - Stack Overflow
に記載してあるように

$ docker volume ls
$ docker volume rm docker_postgresql

として、この後docker-compose up -dをし直せばちゃんと動きます。 にしてもDocker For Windowsでvolumeが簡単にマウントできない問題とか
初回一発再起動しないとまともに動かない問題ってどうにかならないんだろうか。

MongoDBのインストール

Download MongoDB Community Server | MongoDB より3.6.13をダウンロードしてもいいのですが、 docker-composeで入れることにします。 GitHubのReadMe.mdを参照してください。

Eclipseのインストール

2019-06版を入手します。 https://www.eclipse.org/downloads/ ダウンロードした後、インストーラーを立ち上げて、
Eclipse IDE for Enterprise Java Developersを選択します。

いろいろAcceptを聞いてくるので受け入れます。

フォントの設定

特にSTS(Spring Boot Suite)と組み合わせると日本語文字化けが特にコメント周りで発生するので デフォルトフォントをMyrica Mに変更します。 Preference > General > Appearence > Colors and Fonts
Java Editor Text Fontを選択し、Edit Default
でお好みのフォントに変更できます。

lombokのインストール

Java開発ならもはや必須です。標準に取り込んでほしいくらいです。
単なるGetter/Setterを書かなくていいばかりでなく、それ以上の恩恵があります。
https://projectlombok.org/download
よりlombok.jarをダウンロードし、jarをダブルクリックします。 しばらくするとecliseを検知するので、Install/Updateをクリックします。 そのあと、Eclipseを再起動します。

Maven Projectの作成

Eclipseを立ち上げて、
File > New > Maven Projectを選択します。
ひとまずNextを押します。
f:id:fa11enprince:20190728215501p:plain ArtifactIdがmaven-archetype-archetypeのを選びます。
実はどれでもいいです。あとで書き換えるので。
(実はいらないものが含まれてて後でEclipseからビルドパスを消したりしてます。
他にいいもの知っている方がいたら教えてください)
f:id:fa11enprince:20190728215737p:plain

Group Id: com.example.multi-module
Artifact Id: multi-module-project-sample
Version: 0.0.1
Package: com.example.multiModule

としFinishを押下します。
f:id:fa11enprince:20190728223147p:plain

pom.xmlをダブルクリックし、開きます。
Spring Boot用に次のように編集します。 Spring Bootに加えよく使うものを依存関係に含めます

<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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.example.multi-module</groupId>
    <artifactId>multi-module-project-sample</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>
    <name>Archetype - multi-module-project-sample</name>
    <url>http://maven.apache.org</url>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
    </dependencies>
</project>

このとき、packagingpomになっていることが重要です。
いらないフォルダができるので消しておきます。
(src/main/resourcesなど…)

共通モジュールの作成

commonという名前でモジュールを作成します。
プロジェクトエクスプローラーのmulti-module-project-sampleを右クリックし、
New > Other > Maven > Maven Moduleを選択します。
f:id:fa11enprince:20190728221559p:plain
multi-module-commonとModule Nameに入力します。
f:id:fa11enprince:20190728223336p:plain
ArtifactIdがmaven-archetype-archetypeのを選びます。
f:id:fa11enprince:20190728221816p:plain
下記を入力します。

Group ID: com.example.multi-module-common
Package: com.example.multiModule.common

そしてFinishを押下します。
f:id:fa11enprince:20190729002139p:plain
こうすると、親のpom.xmlに

 <modules>
        <module>multi-module-common</module>
    </modules>

が追加されます。 ここでmulti-module-project-commonのpom.xmlを次のように書き換えます。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module</groupId>
        <artifactId>multi-module-project-sample</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.multi-module-common</groupId>
    <artifactId>multi-module-common</artifactId>
    <name>Archetype - multi-module-common</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
    </dependencies>
</project>

一旦ここで親プロジェクトから右クリック > Maven > Maven Installを実行します。

共通モジュールのソースコードを書きます

最初に貼ってあるGitHubを参照してください。

メインのモジュールを作成

ここは実際にはWebAppだったりBatchだったりすると思うのですが、サンプルなので単純なバッチとします。 例によって、親プロジェクトを右クリックしてサブモジュールを追加します。 New > Other > Maven > Maven Moduleを選択します。
multi-module-batchとModule Nameに入力します。
f:id:fa11enprince:20190729003706p:plain
ArtifactIdがmaven-archetype-archetypeのを選びます。
f:id:fa11enprince:20190729003823p:plain
下記を入力します。

Group ID: com.example.multi-module-batch
Package: com.example.multiModule.batch

f:id:fa11enprince:20190729003948p:plain
pom.xmlからバージョンのみ消して下記のようになっていればOKです

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module</groupId>
        <artifactId>multi-module-project-sample</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.multi-module-batch</groupId>
    <artifactId>multi-module-batch</artifactId>
    <packaging>pom</packaging>
    <name>Archetype - multi-module-batch</name>
    <url>http://maven.apache.org</url>
</project>

ちなみに書き忘れてましたが、いらないフォルダができるので消しておきます。
(`src/main/resourcesなど…)
またこのモジュールもpomのpackaging指定にします。

さらにサンプル用モジュールを作成します

先程作ったcom.example.multi-module-batchの配下にサンプル用のモジュールを作成します。 例によってこの配下にMaven Moduleを作成します。 キャプチャは飽きたと思うので

Module Name: sample-db-access
Group Id: com.example.sample-db-access
Package: com.example.multiModule.sampleDbAccess

とします。 pom.xmlからバージョン指定を消します。さらにdependencyに先程作成したcommonを追加してあげます。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module-batch</groupId>
        <artifactId>multi-module-batch</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.sample-db-access</groupId>
    <artifactId>sample-db-access</artifactId>
    <name>Archetype - sample-db-access</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.example.multi-module-common</groupId>
            <artifactId>multi-module-common</artifactId>
            <version>0.0.1</version>
        </dependency>
    </dependencies>
</project>

この辺りでMavenが文句を言ってくるのでプロジェクトを右クリックして
Maven > Update Maven Project
を実行しますと黙ります。

ソースコードを書きます

前述のGitHubを参照してください。

おまけ Ecliseの設定

プロジェクトとパッケージを階層表示にする

インストール直後だとデフォルトでいろいろ嫌なところがあるので変更します。
トップの親プロジェクトをProject Explorerで選択し、▽マークのアイコンを押します。
Project Presentation > Hierarchical さらに
Package Presentation > Hierarchical にします。

空白、Tab、改行などを表示する

Window > Preferences > General > Editors > Text Editors
Show whitespace charactersをチェックしてOKを押下します。

参考リンク

Eclipseでコメントの前の方だけ文字化けする - Qiita
3. Maven 入門 (7) | TECHSCORE(テックスコア)
GitHub - spring-projects/spring-data-examples: Spring Data Example Projects
GitHub - mbogner/spring-boot-multiple-databases
Compose ファイル・リファレンス — Docker-docs-ja 17.06 ドキュメント
Docker for Windowsでpostgresのデータマウントができない人へ - Qiita
MongoDB + mongo-expressをDocker Composeでお手軽構築 - Qiita