しいしせねっとわーくAmazon.co.jp アソシエイト
[しいしせねっと] [Java] [J2EE] [smtp]

Maven (書きかけ

Apacheで開発されているAntに代わるJavaのビルドツール。リポジトリがあるのでいいかもしれない。

プラグインで機能を拡張できるがいろいろ複雑にも見える。

CLASSPATHを指定したいよ

<classpath>

セントラルリポジトリ編?

バージョン管理とSNAPSHOT

Mavenはパッケージ管理システムで、ソース管理はできません。基本的にソースコードはGitなどで管理します。リリース時などのバージョンをMavenのリポジトリで管理する形になります。

リリース版は基本的に変更せず次のバージョンを更新します。開発中のバージョンをMavenリポジトリで共有する場合、SNAPSHOTなどのリリースバージョンをつける方法があります。

Central Repository に公開する

Maven の公開リポジトリは Central Repository などがあり、sonatype というところで申請すると使えるようになります。難しくはなさそうです。

https://central.sonatype.org/publish/publish-guide/ 公開手順のはじめかた Publishing my artifact Getting Started

  1. GPGの準備
  2. sonatype のJIRAにアカウントを作る
  3. GitHubにJavaとMavenなプロジェクトを作る (Maven 3以降)
    とりあえず1つあればOK
  4. sonatypeのフォームを使って登録申請を書く
    何のプロジェクトか簡単な説明を加えて申請します
    groupId なども決めます
    botなのか人なのか、が素早い処理してくれます
  5. groupId に使うURLの所有証明をする
    1. GitHub内ならファイルを作る
    2. 独自ドメインならTXTレコードに申請コードを追加する
  6. 申請を再オープンする
  7. 問題なければ完了

GnuPGの署名鍵作成

https://central.sonatype.org/publish/requirements/gpg/

Maven centralではコード署名が必要になるのでコードの署名に使うGnuPGの鍵がない場合はつくります。ツールなどは違いますが、SSL/TLSなPKI系やOpenSSH用の鍵と基本的な役割は同じです。おまけでGitHubの方にも録してみます。

名前とメールアドレスのデジタル署名で使えるものです。

https://www.gnupg.org/download/ からgpg をインストールします。

Windowsの場合 Gpg4win や Simple installer for the current GunPG のどちらでもいいのかもしれません。 1.4 はやめておきます。

> gpg --version
gpg (GnuPG) 2.4.3
libcrypt 1.10.2
Copyright (C) 2023 g10 Code GmbH
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the ectent permitted by law.

Home: C:\Users\okome\AppData\Roaming\gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIMEMD160, SHA256. SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

こんなかんじ version は 2.1.17以降であること。

とりあえず sonatypeの説明では gpg --gen-key とされているが古いので新しい方で作る

> gpg --full-generate-key

https://docs.github.com/ja/authentication/managing-commit-signature-verification/generating-a-new-gpg-key

目安

作った鍵があればこんなふうに出てくる 例 rsaとeddsaの2つ、ドメインはexample.com に変えてある

> gpg --list--keys
C:\Users\okome\AppData\Roaming\gnupg\pubring.kbk
------------------------------------------------
pub   rsa3072 2021-11-05 [SC] [expires: 2024-11-04]
      89F649264BDF2BA4B97F2E69BB673015B2AA838C
uid [ultimate] 名前 <user@example.com>
sub rsa3072 2021-11-05 [E] [expires: 2024-11-04] pub ed25519 2023-11-05 [SC] [expires: 2026-11-04]
2B28E9DC385FA43B207688ED93AFFA7659CC439C
uid [ultimate] 名前 <siisise@example.com>
sub cv25519 2023-11-05 [E] [expires: 2026-11-04]

pub の下の行がKey IDっぽい 短縮して右側の方を使う場合がある

gpg -ab ファイル名 で拡張子.asc の署名を作れる

Maven用登録

公開鍵を公開できるところに登録する Mavenで必要なのは次の3つのどれか。Key IDは自分のものと入れ換えて。

> gpg --keyserver keyserver.ubuntu.com --send-keys 2B28E9DC385FA43B207688ED93AFFA7659CC439C

> gpg --keyserver keys.openpgp.org --send-keys 2B28E9DC385FA43B207688ED93AFFA7659CC439C

> gpg --keyserver pgp.mit.edu --send-keys 2B28E9DC385FA43B207688ED93AFFA7659CC439C

3箇所がMavenのsonatypeから参照されるようなので全部登録してみた

keys.openpgp.org からメールで確認が届くので開いてURLをつついておく。1回目は確認(メールは英語、Webは日本語対応)。2回目のメール(日本語)をクリックすると公開完了。本人のメールアドレスである証明になります。

GitHub用出力

おまけでGitHubでもgpgが使えるので登録する

github.com の 右上の自分のアイコン開いて Settings > SSH and GPG keys と進む

GPG keys の [New GPG key] を開いて次のコマンドで出てくる長いコードをコピー ペーストする (別途メールアドレスの確認は必要) TitleはMavenでもなんでもいい

> gpg --armor --export 2B28E9DC385FA43B207688ED93AFFA7659CC439C
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZZkT1hYJKwYBBAHaRw8BAQdAwhluw2eGRh5Mv3c+7hyN6Yuvc8tCCvjKgX7h
z7meeDS0IlNBVE8gTWFzYXRvc2hpIDxva29tZUBzaWlzaXNlLm5ldD6ImQQTFgoA
QRYhBCso6dw4X6Q7IHaI7ZOv+nZZzEOcBQJlmRPWAhsDBQkFo5qABQsJCAcCAiIC
BhUKCQgLAgQWAgMBAh4HAheAAAoJEJOv+nZZzEOcT4UBAIKUaKJEcNK0U8aVEzRD
LYSW5wmPZLcyA/KYUCzRNpN9AP9nC3/BbIUPlEkE/rWr7UNp0d7LZUK17HWpHEdW
Gj3iDbg4BGWZE9YSCisGAQQBl1UBBQEBB0CgNvpN/+OuKuVQZdFbf9HhtY5E6LCC
8/GVBI71wSosNAMBCAeIfgQYFgoAJhYhBCso6dw4X6Q7IHaI7ZOv+nZZzEOcBQJl
mRPWAhsMBQkFo5qAAAoJEJOv+nZZzEOcevUA/2f4jUsNAbxMdmCBzMsac6Vo5zvK
5bmTTDB+0UeSdfB7APsG3wrp04x6EwqYh2nsLXvsWoIRSKEAedO0ysxgaBl0BA==
=AwzV
-----END PGP PUBLIC KEY BLOCK-----

RSAだとこれより長くなる

長いKey ID の右の方がKey IDとして表示されている。

JIRAに登録する

https://central.sonatype.org/publish/publish-guide/ の続き

メールアドレス、フルネーム、ユーザ名、パスワードを決めます。

プロジェクト

ログインした状態でプロジェクトを登録します。

Project URL は本人証明が必要になるのでGitHubなどにしておくと比較的楽かもしれません。自ドメインの場合はTXTレコードかWebかどちらかをつついたかもしれません。

どこかのSNSっぽいところに投稿されるかたちになります。他の人が投稿しているのを眺めて内容を決めてもいいのかもしれません。説明は比較的短くても承認されたりします。

本人確認が必要な場合は一度止まるので修正したらコメントか何か追加して確認してもらいました。botか人かはよくわかりません。

(略)

Mavenのpom.xml と settings.xml の編集

pom.xml は個別のファイル、settings.xml は共通のファイル

 

 

上級編

maven-jlink-plugin を使うとJREが作れる

jlink はJava 9以降のmodule systemを使って最小構成の配布用Java (JRE) を作る機能のようなものです。JREはJDK 9以降くらいには含まれていません。java.base ぐらいしか使っていないものだとフルJDKの1/3くらいのサイズになります。実行可能なコマンドやパッケージを作るにはjpackager が別にあります。

maven から使いたかったのにそれっぽい情報が全くない気がするので苦しみながらお気楽メモしてみました。

本当は複数ProjectをMavenでまとめているときに使えるのかも?

とりあえずNetBeansからは動かなかった maven-jlink-plugin、いろいろ条件があるようなのでメモ

基本ですが、module-info.java が必要です。JDK 1.8ではmodule-info.javaが使えないので分けて管理するなどが必要になるのかもしれません。main class の指定などは不要です。依存関係はjdepsなどで確認します。

module softlib {
    requires java.base;
    requires java.logging;
}

module名はjar名になる artifactIdと同じにします。配布用artifactIdに大文字が使えないので小文字推奨です。

リリースバージョンを指定します。SNAPSHOTを振っていたりするとjar名からmodule名が探せなくなるのか使えません。

NetBeansからは使えないのでコマンドラインなどから使います。

<project><build><plugins> の中

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jlink-plugin</artifactId>
<version>3.1.0</version>
<executions> <execution> <!--
<phase>verify</phase> <goals> <goal>jlink</goal> </goals> --> <configuration> <addModules> <module>java.base</module> <module>java.logging</module> </addModules> </configuration> </execution> </executions> </plugin>

phaseはとりあえずverify。packageにできるのか不明。phaseとgoalを指定しないことにした。

configuration のmodule指定部分はmodule-infoでも指定してあるので必要なのか不明です。

<project>直下の最後ぐらいにJDKのバージョンを指定しているかと思うので11以降くらいにします。

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

mvn package を事前に実行する必要があるようです。

mvn jlink:jlink を実行します。

softlib-1.x.x.jar の他に softlib-1.x.x.zip が作られて、JRE相当のセットが入っています。

外部ライブラリを利用する場合はまだ未検証です。

 

参考