このページは未完成人です
はじめに
Java ベースのアプリケーションフレームワークである Spring Framework の開発環境をインターネット接続ができないオンプレミス環境へ構築しようという話です。
大きく、以下のテーマを取り上げます。
- Maven リポジトリサーバーの構築
- Spring Initializr のミラーを構築
コマンドの例は、Linux を基準に書いていますのでパスデリミタの / は環境に合わせて適宜、読み替えてください。
必要な知識等
- Java
- Apache Maven
- Git
- diff 出力が理解できること
- シェルまたはコマンドプロンプト
- 英語が読めなくてもページをそっ閉じしない気概
Maven リポジトリサーバーの構築
Spring Framework の依存ライブラリをキャッシュした Maven ローカルリポジトリ(ホームディレクトリの .m2 ディレクトリなど)を配布する手もありますが、メンテナンス性を考慮して Maven リポジトリサーバーを構築したいと思います。
Maven のリポジトリマネージャーとしては、公式でも使われている Sonatype の Nexus(Professional Edition、OSS Edition)が有名なようですが、必要とするリソースや構築の容易性を考慮して Apache Archiva を使用したいと思います。
必要な環境
項目 | 説明 |
---|---|
JDK | 1.8 |
ディスクスペース | Apache Archiva 展開時は 80M バイト程度ですが、実際にリポジトリをキャッシュしていくと G バイト単位で確保した方が良いでしょう。 |
OS | Linux、Mac OS、Solaris、Windows |
2020/5/1 追記
以降の手順で「インターネットに接続できる環境にもデプロイします。」とありますが、インターネットに接続できる環境では、Apache Achiva を使わずに直接、Maven を使用し、ローカルの ~/.m2 にダウンロードし、~/.m2/repository の中身をターゲット環境の apache-archiva-2.2.4/repositories/internal へ何らかの手段でコピーすれば良いとご指摘を受けました。
Apache Archiva のダウンロード
https://archiva.apache.org/download.html からダウンロードできます。
Tomcat を同梱したスタンドアロン版(tar.gz or zip)と WAR 版が選択できます。
既に稼働している Tomcat などの Java アプリケーションサーバーがあれば、WAR 版を利用する方が良さそうですが、設定ファイルの作成や依存ライブラリの配置などが必要です。詳細は、以下のリンクを参照してください。
ここでは、構築が簡単なスタンドアロン版を選択しました。
Apache Archiva のデプロイ
ターゲットとするオンプレミス環境だけでなく、ターゲット環境にリポジトリの内容を移行するためにインターネットに接続できる環境にもデプロイします。それぞれの環境で以下の手順を踏んでください。
まず、アーカイブを展開します。リポジトリのディレクトリ階層が深くなることを考慮すると Windows の場合は、ドライブ直下など、できるだけ浅い階層に展開した方が良いと思います。
以下は、zip 版を unzip コマンドで展開する例です。(バージョン番号は投稿当時。)
$ unzip apache-archiva-2.2.4-bin.zip
展開ができたら、Apache Archiva を起動します。
$ cd apache-archiva-2.2.4/bin
$ ./archiva console
なお、サービス化する方法は、環境により異なりますので以下のドキュメントを参照してください。
英語ですが、タイトルとコマンドの実行例が分かれば、何とかなると思います。
Apache Archiva が、起動出来たら、Web ブラウザーで http://localhost:8080/ にアクセスします。以下のような画面が表示されれば OK です。
管理者ユーザーの作成
Apache Archiva の Web インターフェースの右上の方にある Create Admin User
という赤いボタンをクリックします。管理者ユーザー作成用のフォームが表示されますので以下の必須項目を入力します。
- Password : パスワードを入力します。
- Confirm Password : 確認用に上記と同じパスワードを入力します。
- Email Address : メールを利用しない場合もダミーで良いのでメールアドレス風の文字列を入力します。
入力が完了したら、Save
ボタンをクリックします。
パスワードの有効期限について
デフォルトでは、パスワードの有効期限が90日で設定されています。この設定を変更したい場合は、次の手順を実行します。
- 左サイドのメニューから、
Users Runtime Configuration
をクリック -
Properties
タブを開く - ページナビゲーションで3ページ目を開く
- 以下の値を変更し、
Save
ボタンをクリック- security.policy.password.expiration.days : 有効期限を日数で入力
- security.policy.password.expiration.enabled : 有効期限を設けない場合は、 false を入力
Apache Archiva からアーティファクト(ライブラリ)を取得する設定
ホームディレクトリの .m2 というディレクトリに以下のような内容で settings.xml というファイルを配置します。(localhost
の部分は適切なホスト名に変更します。)
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors>
<mirror>
<id>archiva.default</id>
<url>http://localhost:8080/repository/internal/</url>
<mirrorOf>external:*</mirrorOf>
</mirror>
</mirrors>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
デフォルトでは、リモートリポジトリとして Maven Central が設定されているだけです。他のリポジトリも使用したい場合は、以下のリンクを参照してください。
- Archiva Documentation – Using as a Repository
- Archiva Documentation – Understanding Repository Configuration of Apache Archiva
- Archiva Documentation – Understanding Proxy Connector Configuration of Apache Archiva
必要なアーティファクト(ライブラリ)の取得
インターネットに接続できる環境でにおいて、Maven プロジェクトで通常通り、mvn
コマンドを利用します。通常、使うと思われる Goal や Phase を実行してください。(Spring Boot プロジェクトの場合は、同梱の mvnw
を使用しても構いません。)
$ ./mvn spring-boot:run
$ mvn clean
$ mvn package
$ mvn test
上記で設定したホストから、ダウンロードされることを確認してください。
なお、Spring Tool Suite(Spring Tools for Eclipse) でも上記の設定を利用してくれます。
ターゲット環境へリポジトリーをコピーしインデックスを更新
apache-archiva-2.2.4/repositories/internal 以下をターゲット環境の apache-archiva-2.2.4/repositories/internal へ何らかの手段でコピーします。
Apache Archiva の Web インターフェースにログインし、左サイドのメニューから、Repositories
を選択し、Action
というドロップダウンリストから、Directories Scanning
を選択します。
しばらく時間がかかりますので時間をおいてから、左サイドのメニューから Browse
を選択し、コピーしたディレクトリ等が表示されるか、確認します。
Spring Initializr のミラーを構築
Spring Boot アプリケーションのひな形を生成できる Spring Initializr のミラーを構築します。
pom.xml を自力で書いたり必要なファイル構成が分かっていれば、必要ないとは思いますが、Spring Boot の手軽さが半減(言い過ぎ?)しますし、Spring Tool Suite(Spring Tools for Eclipse)との親和性も考慮して構築を行います。
なお、以下の作業は、特に断りのない限り、インターネットに接続できる環境で行います。また、上記、Apache Archiva を経由する設定にしていると必要なライブラリが取得できないので一旦、設定を解除してください。(クライアント側)
私は、Virtual Box 上の CentOS 8.1 に 20G バイトのハードディスクを割り当てて作業しましたが、色々、試している内に /tmp の使用量が肥大になり、ビルドが失敗する事象が発生しました。適宜、/tmp の中を掃除してください。
start.spring.io を clone する
Spring Initializr のソースは、GitHub で管理されています。以下のように clone します。
$ git clone https://github.com/spring-io/start.spring.io.git
application.yml の修正(2020/05/30 bootVersions 修正)
clone したプロジェクトのままパッケージ化するとインターネットに接続できない環境で起動した際に以下のように選択できる Spring Boot のバージョンが、本家と異なってしまいます。(https://spring.io/project_metadata/spring-boot からメタデータを取得できないため。)
start.spring.io/start-site/src/main/resources/application.yml の bootVersions
セクションを修正します。私の場合は SNAPSHOT 版は不要なので以下のように修正しました。
index 25dc9cb..2cd2e56 100644
--- a/start-site/src/main/resources/application.yml
+++ b/start-site/src/main/resources/application.yml
@@ -1431,12 +1432,17 @@ initializr:
id: groovy
default: false
bootVersions:
- - name : Latest SNAPSHOT
- id: 2.2.0.BUILD-SNAPSHOT
- default: false
- - name : 2.1.1.
- id: 2.1.1.RELEASE
+ - name : 2.3.0
+ id: 2.3.0.RELEASE
default: true
+ - name : 2.2.7
+ id: 2.2.7.RELEASE
+ default: false
+ - name : 2.1.14
+ id: 2.1.14.RELEASE
+ default: false
---
なお、default: true
が確実に1つあるように修正する必要があります。すべて false になっていると画面が一瞬表示されたのち、真っ白になってしまいます。(経験者は語る)
また、以下のように bootVersions
セクションの次に group-id
セクションを追加すると Group
のデフォルトの値、com.example
を jp.co.example
に変更することができます。
group-id:
value: jp.co.example
インデントを bootVersions
に合わせてください。
2020/05/29 追記: 本家サイトに metadata の取得に行かないようにする
古いリファレンスマニュアルにしか記述がありませんが、 initializr.env.springBootMetadataUrl
を空または null にすれば、本家に metadata を取得に行こうとしなくなります。
--- a/start-site/src/main/resources/application.yml
+++ b/start-site/src/main/resources/application.yml
@@ -24,6 +24,7 @@ spring:
initializr:
env:
+ springBootMetadataUrl: ""
boms:
azure:
groupId: com.microsoft.azure
参考
You can set initializr.env.springBootMetadataUrl to empty (or null), or to a location that you know will resolve correctly.
@Override
public InitializrMetadata update(InitializrMetadata current) {
String url = current.getConfiguration().getEnv().getSpringBootMetadataUrl();
List<DefaultMetadataElement> bootVersions = fetchSpringBootVersions(url);
if (bootVersions != null && !bootVersions.isEmpty()) {
if (bootVersions.stream().noneMatch(DefaultMetadataElement::isDefault)) {
// No default specified
bootVersions.get(0).setDefault(true);
}
current.updateSpringBootVersions(bootVersions);
}
return current;
}
private String springBootMetadataUrl = "https://spring.io/project_metadata/spring-boot";
/* (中略) */
public String getSpringBootMetadataUrl() {
return this.springBootMetadataUrl;
}
ビルド
README.adoc にある通り、ビルドを行います。
$ cd start.spring.io
$ ./mvnw clean install
それなりに時間を要するので気長に待ちます。
動作確認
ビルドが問題なく終了したら、実際に起動してみます。できれば、インターネットに接続できない状態でテストすると良いでしょう。
$ cd start-site
$ ../mvnw spring-boot:run
起動が出来たら、 http://localhost:8080/ に Web ブラウザーでアクセスします。(過去に同じアドレスで他のサービスを動かしていた場合は、更新をかけてください。)
画面の幅によりデザインが異なりますが、上記のように表示できると思います。Artifact
の変更、Dependencies
の追加を行い、Explore
や Generate
が動作することを確認します。
パッケージング
上記で問題なく動作していれば、パッケージングを行います。インターネットに接続して、以下のコマンドを実行します。
$ ../mvnw package
こちらもテストに時間がかかるので気長に待ちます。
パッケージングがうまくいくと target
ディレクトリに start-site-exec.jar
というファイルが生成されます。
ターゲット環境へのデプロイ
何らかの方法で start-site-exec.jar
をターゲット環境に配置します。以下のコマンドで起動します。
$ java -jar start-site-exec.jar
デフォルトのリッスンポート 8080
を変更したい場合は、--server.port=ポート番号
を末尾に付与します。次の例は、ポート番号を 3000
に変更して起動します。
$ java -jar start-site-exec.jar --server.port=3000
サービスとして起動したい場合は、以下のリンクなどを参照してください。
- サービスとしてのSpring Bootアプリケーション (機械翻訳のようなので読みづらいかもしれません。)
Spring Tool Suite から利用する
Initializr の設定
- メニューから、
Window
→Preferences
の順に選択し、設定画面を開きます。 - 左側のカテゴリーから、
Spring
→Boot
→Initializr
を選択します。 -
Initializr URLs
から、デフォルトのhttps://start.spring.io
をRemove
し、New
でターゲット環境の Initializr の URL を追加します。
画面の例のように変更できたら、Apply and Close
をクリックします。
Spring Starter Project の作成
Package Explorer の何もないところで右クリック
→New
→Spring Starter Poject
を選択します。
以下のように設定した URL でインターネット接続環境と同様の作業が行えます。
参考リンク
- Spring Initializr Reference Guide
- spring-io/initializr: A quickstart generator for Spring projects
- spring-io/start.spring.io: https://start.spring.io
- How to customize the Spring Initializr - Digital Frontiers — Das Blog - Medium
- Spring Sweets: Running Our Own Spring Initializr Server - Messages from mrhaki