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 <enter> 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 <enter> to keep the current choice[*], or type selection number: 0
- Eclipse IDE 2020-12
-
Eclipse
を起動する
-
(4-1) [JOSM]プロジェクトの作成
-
「
~/workspace/jsom/core/build.xml
」 を antプロジェクトとしてインポートする- Eclipse メニュー → [
File(F)
] → [新規(N)
] → [その他(O)...
] - 'ウィザードを選択'
- [
Java Project from Existing Ant Buildfile
/既存 Ant ビルドファイルからの Java プロジェクト
] - [
次へ(N) >
] - 'Ant ビルドファイルからの Java プロジェクト作成'
- '
Antビルドファイル(A)
': [~/workspace/josm/core/build.xml
] - '
プロジェクトの定義に使用するJavac宣言を選択(S)
': [< >ターゲット"compile"に"javac"タスクが見つかりました
] - [
完了(F)
] - 'プロジェクト作成でエラーが発生しました'
- エラー[
Reference runtime.path not found.
]が発生するが、後ほど対処するので無視して先に進める - [
OK
]
- Eclipse メニュー → [
(4-2) [JOSM]プロジェクトの設定変更
作成されたプロジェクト[josm
]の設定を手作業で修正していく
- プロジェクト[
josm
]を右クリック
→ [properties
/プロパティ(R)
]- '
Resource
': - '
ロケーション
': [~/workspace/josm
] - '
ビルダー
': [新規 antビルダー
] - [
構成の編集
] - '
Java Build Path
/Javaのビルドパス
' - '
Libraries
/ライブラリー(L)
'
- '
JARの追加(J)...
': [josm/core/dist/josm-custom.jar
] - '
ライブラリの追加(l)...
': [JRE System Library [java-11-openjdk-amd64]
] - '
ライブラリの追加(l)...
': [JUnit5
] - [
適用(A)
]
- '
- Java コンパイラー
- '
プロジェクト固有の設定を可能にする
': [ON
] - '
コンパイラー準拠レベル
': [1.8
] - '
デフォルトの準拠設定の使用
': [OFF
]- '
生成された .class ファイルの互換性
': [1.8
] - '
ソースの互換性
': [1.8
]
- '
- [
適用(A)
]
- '
(4-3) [JOSM]プロジェクトのビルド
- プロジェクト「
josm
」の「build.xml
」を右クリック
→ [実行(R)
]
(5) Eclipseから「JOSM」を起動する
「josm
」のビルドに成功したら、Eclipseから「josm
」を起動してみる
初回は、JOSMが起動するまでケッコウ時間がかかります。(1分ぐらい)
2. JOSMプラグインの開発環境を整備する
ここからは「JOSMプラグイン」を「デバッグモード」で実行できるように環境整備していく
(1) 既存JOSMプラグインの取得[easypresets]プロジェクトの作成
いきなりJOSMのプラグインの開発を開始するのはハードルが高いので、まづは既存のプリセットを動かしてみる
ここでは、maripoさまの「EasyPresets」をサンプルに使わせてもらう
(1-1) プラグインのソースコードを取得する
githubにある「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' → 「
ファイル...
」 → [ファイルシステムからプロジェクトを開く...
]
- インポートソース: [
/home/(user)/workspace/josm/plugins/easypresets
] - [
完了(F)
]
- インポートソース: [
「プロジェクトjosm
」の中に「プロジェクトeasypresets
」が入れ子になって作成される
-
'Eclipse' → 「プロジェクト
josm/plugins/easypresets
」を右クリック
→ [プロパティ(R)...
]- '
Resource
/リソース
'
- 'パス(P)': [
/easypresets
] - 'ロケーション(L)': [
/home/(user)/workspace/josm/plugins/easypresets
] - [
適用(A)
] - '
ビルダー
': [新規 antビルダー
]
- [
構成の編集
] - '
Java Build Path
/Javaのビルドパス
' - '
Libraries
/ライブラリー(L)
'
- '
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 コンパイラー
- '
プロジェクト固有の設定を可能にする
': [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
- 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
になる
-
(5-1) プロジェクト「josm」を右クリック → [デバッグ(D)] → [Javaアプリケーション]
- '一致する項目(M)': [
MainApplication - org.openstreetmap.josm.gui
] - [OK]
- '一致する項目(M)': [
「josm」が起動する
-
(5-2) 「JOSMメニュー」 → 「
プリセット
」 → 「Preset preferences...
」
ブレークポイントで止まっただろうか?
ここまでくればあとはなんとかなるだろう
では、エンジョイ・プログラミング!!