JOSMプラグイン開発環境を整備する
OSMのエディタとして古くから利用されているJOSMにはJOSMの機能を強化するJOSMプラグインというものがある
JOSMプラグインの開発方法は「https://josm.openstreetmap.de/wiki/DevelopersGuide/DevelopingPlugins」に記載されています。
以上
なのだが、JOSMの「JOSMプラグイン開発ガイド」では「テンプレートを示すからこれで開発できるだろ」的な書き方になっているので、私には敷居が高すぎて手に負えなかった
2017年12月に 救世主現る。 maripoさまの「JOSMのプラグイン作ろうぜ」が発表された。これでやっと「ひょっとしたら俺でもできるんじゃね?」って気分になってきた。
だがしかし、気分だけではどうにもならず、肝心のプログラミングを開始する前の開発環境の準備段階で「DevelopingPlugins」にてこづらされた。
- 英語で書かれてる
- のっけから
svn
でつまづく -
ant
が懐かしすぎる - 結局 JOSMプラグインのプロジェクトはどこにつくるの?
- 日本語化したいけどどうすればいいの?
と、JOSMプラグイン開発に着手するまでの手順が難しすぎる。(週末プログラマーの私は2ヶ月かかった)
ということで これからJOSMプラグイン開発を始めようとする人や、開発再開する人に向けて、同じような苦労をせずにグログラミングを開始できるように JOSMプラグインの開発環境を整備する手順を示す
事前準備
作業に取り掛かる前に下ごしらえ
-
開発マシンのOSは 「Linux mint 19 (Ubuntu 18.04 bionic)」を使っている
JOSMに限らず、OSMの世界はLinuxが標準だ、同じUNIX系の MacOS でも問題はないが、Windowsでの開発はおすすめしない
-
プロジェクトはホームディレクトリの下に「
workspace
」が作成されているものとして説明する。「workspace
」が作成されていない場合には作っておいてくれ。$ mkdir ~/workspace
-
Java
のインストール (JOSM
はjava
で書かれている)- インストール
OpenJDK 1.8
: JOSMはjava 1.8
以降で動作するように作らないといけないから、 - インストール
OpenJDK 11
JOSMプラグインの部分はjava 11
でないとコンパイルできないものが混じっているので...
OpenJDK 1.8
とOpenJDK 11
の両方ともインストールしてくれ - インストール
-
IDEには Eclipse を使うぞ
-
eclipse IDE
- 「Eclipse」は各自でインストールしておいてくれ
わたしはJOSMプラグインをいじるために、10年以上愛用してきた netbeans から eclipse に転んだ...
-
-
その他、下記もインストールしておいてくれ
- 「
svn
」-
# apt install svn
← 確かこんな感じ、svnクライアントだけでOK
-
- 「
git
」# apt install git
- 「
1. ベースJOSMを準備する
まずはじめに、JOSMプラグインが動作する「ベースJOSM」をビルドする。
まずは、JOSMプラグインが動作する基礎部分をつくる。
JOSMのバイナリじゃだめなんだ。ソースからビルドするよ
(1) ベースJOSMのソース取得
JOSMのソースを取得する。JOSMのソースはsvn(Subversion)
で配信されている
svn
の知識は必要ない、下記のコマンドをそのまま実行するだけ
$ cd ~/workspace
$ svn co https://josm.openstreetmap.de/osmsvn/applications/editors/josm
- フォルダ
~/workspace/josm
が作成される。
(2) JOSM更新
すでにJOSMのコードを取得済みの場合は最新のコードにアップデートする
$ cd ~/workspace/josm
$ svn update
(3) JOSMのビルド
ここで取得したJOSM
をIDEを使わずにコマンドラインから手動でビルドする
(3-1) Javaのバージョンを JDK1.8
に切り替える
JOSMはJava 1.8
以降に対応させなければならないので java1.8でコンパイルする
-
sudo update-alternatives --config java
-
sudo update-alternatives --config javac
Selection Path Priority Status
0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
- 1 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode
Press to keep the current choice[*], or type selection number: 1
### (3-2) Josm/coreをビルドする
$ cd ~/workspace/josm/core
$ ant
:
BUILD SUCCESSFUL
Total time: 14 seconds
`BUILD SUCCESSFUL`が表示されれば成功だ
## (4) Eclipseによる JOSMビルド
ベースとなる`JOSM`をビルドしたら Eclipseでもビルドできるようにする
JOSMの公式Wikiには「Eclipse」での開発方法が記載されているので、ここでも素直に「Eclipse」を使う
Eclipseを起動する前に Javaのバージョンを'Java 11'に戻す
* `sudo update-alternatives --config java`
* `sudo update-alternatives --config javac`
Selection Path Priority Status
- 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/javac 1111 manual mode
1 /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 1081 manual mode
Press to keep the current choice[*], or type selection number: 0
* Eclipse IDE 2020-12
* `Eclipse`を起動する
### (4-1) [JOSM]プロジェクトの作成
- 「`~/workspace/jsom/core/build.xml`」 を antプロジェクトとしてインポートする<br/>
- Eclipse メニュー → [`File(F)`] → [`新規(N)`] → [`その他(O)...`]
- 'ウィザードを選択'<br/>
- [`Java Project from Existing Ant Buildfile` / `既存 Ant ビルドファイルからの Java プロジェクト`]
- [`次へ(N) >`]
- 'Ant ビルドファイルからの Java プロジェクト作成'<br/>
- '`Antビルドファイル(A)`': [`~/workspace/josm/core/build.xml`]
- '`プロジェクトの定義に使用するJavac宣言を選択(S)`': [`< >ターゲット"compile"に"javac"タスクが見つかりました`]
- [`完了(F)`]
- 'プロジェクト作成でエラーが発生しました'<br/>
- エラー[`Reference runtime.path not found.`]が発生するが、後ほど対処するので無視して先に進める
- [`OK`]
プロジェクト[`JOSM`]が作成される

### (4-2) [JOSM]プロジェクトの設定変更
作成されたプロジェクト[`josm`]の設定を手作業で修正していく
- プロジェクト[`josm`]を`右クリック` → [`properties` / `プロパティ(R)`]
- '`Resource`':
- '`ロケーション`': [`~/workspace/josm`]
- '`ビルダー`': [`新規 antビルダー`]
- [`構成の編集`]
- タブ[`メイン`]<br/>
- '`Ant buildfile` / `ビルドファイル(L)`': [`${workspace_loc:/josm/core/build.xml}`]
- [`適用(Y)`]
- タブ[`JRE`]<br/>
- '`Runtime JRE` / `ランタイムJRE`':
- 別のJRE(P): [`java-8-openjdk-amd64`]
- [`適用(Y)`]
- '`Java Build Path` / `Javaのビルドパス`'
- '`Libraries` / `ライブラリー(L)`'<br/>
- '`JARの追加(J)...`': [`josm/core/dist/josm-custom.jar`]
- '`ライブラリの追加(l)...`': [`JRE System Library [java-11-openjdk-amd64]`]
- '`ライブラリの追加(l)...`': [`JUnit5`]
- [`適用(A)`]
- Java コンパイラー<br/>
- '`プロジェクト固有の設定を可能にする`': [`ON`]
- '`コンパイラー準拠レベル`': [`1.8`]
- '`デフォルトの準拠設定の使用`': [`OFF`]
- '`生成された .class ファイルの互換性`': [`1.8`]
- '`ソースの互換性`': [`1.8`]
- [`適用(A)`]
### (4-3) [JOSM]プロジェクトのビルド
* プロジェクト「`josm`」の「`build.xml`」を`右クリック` → [`実行(R)`]

## (5) Eclipseから「JOSM」を起動する
「`josm`」のビルドに成功したら、Eclipseから「`josm`」を起動してみる
- プロジェクト「`JOSM`」を`右クリック` → 「`実行(R)`」 → 「`Javaアプリケーション`」<br/>
- 「`MainApplication - org.openstreetmap.josm.gui`」を選択<br/>
- 初回は、JOSMが起動するまでケッコウ時間がかかります。(1分ぐらい)

# 2. JOSMプラグインの開発環境を整備する
ここからは「JOSMプラグイン」を「デバッグモード」で実行できるように環境整備していく

## (1) 既存JOSMプラグインの取得[easypresets]プロジェクトの作成
いきなりJOSMのプラグインの開発を開始するのはハードルが高いので、まづは既存のプリセットを動かしてみる
ここでは、maripoさまの「[EasyPresets](https://github.com/maripo/JOSM_easypresets)」をサンプルに使わせてもらう
### (1-1) プラグインのソースコードを取得する

githubにある「[EasyPresets](https://github.com/maripo/JOSM_easypresets)」を取得する
下記コマンドを打つべし
$ cd ~/workspace/josm/plugins
$ git clone https://github.com/maripo/JOSM_easypresets.git easypresets
- 「プロジェクト`josm`」の「フォルダ`plugins`」に「フォルダ`easypresets`」が作成される
```
$ ll ~/workspace/josm/plugins/easypresets
合計 124
drwxr-xr-x 8 hayashi hayashi 4096 2月 21 11:50 .git/
-rwxr-xr-x 1 hayashi hayashi 114 2月 21 11:50 .gitignore*
-rwxr-xr-x 1 hayashi hayashi 18092 2月 21 11:50 GPL-v2.0.txt*
-rwxr-xr-x 1 hayashi hayashi 35147 2月 21 11:50 GPL-v3.0.txt*
-rwxr-xr-x 1 hayashi hayashi 289 2月 21 11:50 README*
-rwxr-xr-x 1 hayashi hayashi 4391 2月 21 11:50 README-ja.md*
-rwxr-xr-x 1 hayashi hayashi 2717 2月 21 11:50 README.md*
-rwxr-xr-x 1 hayashi hayashi 1463 2月 21 11:50 build.xml*
drwxr-xr-x 2 hayashi hayashi 4096 2月 21 11:50 data/
drwxr-xr-x 3 hayashi hayashi 4096 2月 21 11:50 doc/
drwxr-xr-x 2 hayashi hayashi 4096 2月 21 11:50 i18n/
-rwxr-xr-x 1 hayashi hayashi 109 2月 21 11:50 i18n_deploy.sh*
-rwxr-xr-x 1 hayashi hayashi 351 2月 21 11:50 i18n_start.sh*
drwxr-xr-x 2 hayashi hayashi 4096 2月 21 11:50 images/
drwxr-xr-x 3 hayashi hayashi 4096 2月 21 11:50 src/
drwxr-xr-x 4 hayashi hayashi 4096 2月 21 11:50 test/
```
### (1-2) プロジェクト[easypresets]のインポート
'github'から取得した「フォルダ`easypresets`」を'Eclipse IDE'のプロジェクトとして登録する
- 'Eclipse' → 「`ファイル...`」 → [`ファイルシステムからプロジェクトを開く...`]<br/>
- インポートソース: [`/home/(user)/workspace/josm/plugins/easypresets`]
- [`完了(F)`]
「プロジェクト`josm`」の中に「プロジェクト`easypresets`」が入れ子になって作成される<br/>
- 'Eclipse' → 「プロジェクト`josm/plugins/easypresets`」を`右クリック` → [`プロパティ(R)...`]
- '`Resource` / `リソース`'<br/>
- 'パス(P)': [`/easypresets`]
- 'ロケーション(L)': [`/home/(user)/workspace/josm/plugins/easypresets`]
- [`適用(A)`]
- '`ビルダー`': [`新規 antビルダー`]<br/>
- [`構成の編集`]
- タブ[`メイン`]<br/>
- '名前(N)': [`Ant ビルダー`]
- '`Ant buildfile` / `ビルドファイル(L)`': [`${workspace_loc:/easypresets/build.xml}`]
- タブ[`JRE`]<br/>
- '`Runtime JRE` / `ランタイムJRE`':
- 別のJRE(P): [`java-11-openjdk-amd64`]
- '`Java Build Path` / `Javaのビルドパス`'
- '`Libraries` / `ライブラリー(L)`'<br/>
- '`JARの追加(J)...`': [`josm/core/dist/josm-custom.jar`]
- '`JARの追加(J)...`': [`josm/dist/utilsplugin2.jar`]
- '`ライブラリの追加(l)...`': [`JRE System Library [java-11-openjdk-amd64]`]
- '`ライブラリの追加(l)...`': [`JUnit5`]
- Java コンパイラー<br/>
- '`プロジェクト固有の設定を可能にする`': [`ON`]
- '`コンパイラー準拠レベル`': [`1.8`]
- '`デフォルトの準拠設定の使用`': [`OFF`]
- '`生成された .class ファイルの互換性`': [`1.8`]
- '`ソースの互換性`': [`1.8`]
## (2) EasyPreset 言語変換ファイルを更新する
'(1)'でソースコードを取得した際にすでにコンパイル済みの「言語変換ファイル(`*.lang`)」も含まれているのでわざわざ更新する必要はないのだが、「日本語化」の手順を示すためにここで「`*.lang`」の更新手順を示す

`easypresets`には多言語対応用スクリプトが用意されている
`i18n_start.sh`を実行すると`src/*.java`からテキスト部分を抜き出して`i18n/*.po`が作成される
- `src/*.java` からテキスト部分を抜き出して `i18n/*.po` を作ってくれる
cd ~/workspace/josm/plugins/easypresets/
./i18n_start.sh
`i18n/*.po`を編集してくれ
- `~/workspace/josm/plugins/easypresets/i18n/*.po`を作ってくれるのでそれを編集する
`i18n_deploy.sh`を実行すると、`data/*lang`が作成される
- `i18n/*.po` から `data/*.lang` を作成
cd ~/workspace/josm/plugins/easypresets/
./i18n_deploy.sh
「参考」
- [i18n_start.sh](https://github.com/maripo/JOSM_easypresets/blob/pr46/i18n_start.sh)
- [i18n_deploy.sh](https://github.com/maripo/JOSM_easypresets/blob/pr46/i18n_deploy.sh)
## (3) JOSMプラグインをビルド

プラグインをビルドして、`easypresets.jar`を生成します。
### (3-1) JOSMプラグイン[easypresets]のビルド(コマンド編)
* Javaのバージョンを `OpenJDK 11` に切り替える
`sudo update-alternatives --config java`
`sudo update-alternatives --config javac`
- 2 /usr/lib/jvm/java-11-openjdk-amd64/bin/javac 1111 手動モード
cd ~/workspace/josm/plugins/easypresets
ant clean
ant dist
- フォルダ'`~/workspace/josm/dist/`'に、`easypresets.jar`が生成される
### (3-2) [easypresets]のビルド(Eclipse編)
- 'Eclipse' → プロジェクト[`josm`]-[`plugins`]-[`easypresets`]を右クリック
- → [`プロジェクトのビルド...`]を選択
- フォルダ'`~/workspace/josm/dist/`'に、`easypresets.jar`が生成される
## (4) [easypresets.jar]をデプロイ
「JOSM」は`(ユーザホーム)/.josm/plugins/`'にあるプラグインをロードしようとするので、生成された`easypresets.jar`を実行するには、フォルダ'`(ユーザホーム)/.josm/plugins/`'に、`easypresets.jar`を配置する必要がある

- フォルダ'`~/.josm/plugins/`'に、`easypresets.jar`をコピーする
```
cp ~/workspace/josm/dist/easypresets.jar ~/.josm/plugins/
```
## (5) プラグインの実行
いよいよ実行してみる
ただ実行しただけではつまらないのでブレークポイントを設定してみる
プラグインの開始地点にブレークポイントを設定してみる、プラグインの開始地点は`org.openstreetmap.josm.plugins.Plugin`を extend したクラスのコンストラクタだから、
「EasyPresets」の場合には、クラス`org.maripo.josm.easypresets.EasyPresetsPlugin` になる
- コンストラクタ`EasyPresetsPlugin()`の`super(info)`にブレークポイントを設定してみる<br/>
- (5-1) プロジェクト「josm」を右クリック → [デバッグ(D)] → [Javaアプリケーション]<br/>
- '一致する項目(M)': [`MainApplication - org.openstreetmap.josm.gui`]
- [OK]
「josm」が起動する
- (5-2) 「JOSMメニュー」 → 「`プリセット`」 → 「`Preset preferences...`」
- [`プラグイン`]<br/>
- [`OFF`] '`EasyPresets`:' ... "これはJOSMから提供された公式`EasyPresets`プラグイン"
- [`ON`] '`easypresets`:' ... "こちらが開発中の`EasyPresets`プラグイン"
- [`OK`]
- JOSMを「再起動」する
- 「再起動」しても起動されないので、プロジェクト「josm」を右クリック → [デバッグ(D)] → [Javaアプリケーション] を再実行する
- (5-3) ブレークポイントで止まる<br/>
ブレークポイントで止まっただろうか?
ここまでくればあとはなんとかなるだろう
では、エンジョイ・プログラミング!!