良く忘れるのでメモ
様々な事情でプライベートリポジトリを立てられなかったりする場合や、
そもそもプライベートリポジトリ立てるまでもないよねというときに便利なマルチモジュールプロジェクトの構成を作ります。
お題目は、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等をインストールします。
インストーラーが準備されているので方法は割愛します。
Home | Adoptium
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のインストール
EDB: Open-Source, Enterprise Postgres Database Management
よりダウンロードしてインストールしてもいいのですが、
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を押します。
ArtifactIdがmaven-archetype-archetypeのを選びます。
実はどれでもいいです。あとで書き換えるので。
(実はいらないものが含まれてて後でEclipseからビルドパスを消したりしてます。
他にいいもの知っている方がいたら教えてください)
Group Id: com.example.multi-module Artifact Id: multi-module-project-sample Version: 0.0.1 Package: com.example.multiModule
としFinish
を押下します。
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>
このとき、packaging
がpom
になっていることが重要です。
いらないフォルダができるので消しておきます。
(src/main/resourcesなど…)
共通モジュールの作成
common
という名前でモジュールを作成します。
プロジェクトエクスプローラーのmulti-module-project-sample
を右クリックし、
New > Other > Maven > Maven Module
を選択します。
multi-module-common
とModule Nameに入力します。
ArtifactIdがmaven-archetype-archetypeのを選びます。
下記を入力します。
Group ID: com.example.multi-module-common Package: com.example.multiModule.common
そしてFinishを押下します。
こうすると、親の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に入力します。
ArtifactIdがmaven-archetype-archetypeのを選びます。
下記を入力します。
Group ID: com.example.multi-module-batch Package: com.example.multiModule.batch
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でコメントの前の方だけ文字化けする #Eclipse - Qiita
3. Maven 入門 (7) | TECHSCORE(テックスコア)
GitHub - spring-projects/spring-data-examples: Spring Data Example Projects
GitHub - mbogner/spring-boot-multiple-databases
Compose Specification(仕様) — Docker-docs-ja 24.0 ドキュメント
Docker for Windowsでpostgresのデータマウントができない人へ #Docker - Qiita
MongoDB + mongo-expressをDocker Composeでお手軽構築 #Docker - Qiita