Windows10からラズパイで実行するjavaFXプログラムをリモートデバッグする方法～環境構築からデバッグ実行まで②～

初めにGitHubのリポジトリを貼っておく
https://github.com/kamoshika9999/HelloRemote.git

###ラズパイにjavaFXを導入する###
※ラズパイは固定IP化しておく。当サイトでは例として192.168.9.112を使用するが読み替えてください
※ラズパイのログイン名/パスワードは初期設定を使用している。

1.ノーマルで入っているJDKはjava-11-openjdk-armfである。
　このバージョンはjavaFXが除外されている為以下の方法でカスタマイズされたJDKを導入する

```
cd /home/pi
wget https://download.bell-sw.com/java/13/bellsoft-jdk13-linux-arm32-vfp-hflt.deb
sudo apt-get install ./bellsoft-jdk13-linux-arm32-vfp-hflt.deb
sudo update-alternatives --config javac
sudo update-alternatives --config java
```
###sambaの導入###
1.本体ダウンロード＆インストール

```
sudo apt-get install samba
```
2.テキストエディタのnano起動

```
sudo nano /etc/samba/smb.conf
```
3.最終行に追記

```
[raspberry_pi]
comment = Share
path = /home/pi/samba
public = yes
read only = no
browsable = yes
force user = pi
```
4./home/piにsambaフォルダを作成

```
sudo mkdir /home/pi/samba
```
5.サービス起動 ※次回以降ラズパイ起動時にも自動起動される

```　
sudo systemctl restart smbd
```
###Window10側の設定###
1.「Windowsの機能の有効化または無効化」から、「SMB 1.0/CIFDクライアント」にチェックを入れて再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/dbc50417-6bd1-6e42-2009-fe7a6cf89601.png)
2.エクスプローラーに\\192.168.9.112と入力しraspberry_piフォルダが見えるか確認する
  ※ネットワーク上のフォルダはraspberry_piだがラズパイ本体からみるとsambaである点に注意しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/b3372c5a-21d0-44cd-cb87-806074a0aeb2.png)

###Antビルド用xmlファイルを準備する###
1.Eclipse パッケージエクスプローラーのHelloRemoteを右クリックし
「エクスポート」-[Java]-[実行可能JARファイル」-「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/5b517425-1cb4-37c2-e2d4-ce3fcff78363.png)
2.
　起動構成 Main-HelloRemote
  エクスポート先 ラズパイのsambaフォルダ+ファイル名「fxtest.jara」　※ファイル名は適当に決める
  Antスクリプトとして保管にチェック
　ロケーションはプロジェクトのワークスペースと同一、ファイル名はbuild.xmlとしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/8b4df46a-c467-5b68-8a5a-c8fce23ffabe.png)
3.完了を押すと警告がでるが、そのままOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/37143e8e-ac89-9f3d-4d33-8ff9b52481cf.png)
4.パッケージエクスプローラーの空白を右クリックしリフレッシュ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/20537d25-d770-4260-76a1-d74a3e6881ce.png)
5.build.xmlを右クリックし、次で開く-ANTエディタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/bc4356de-36e0-cc0a-06d8-2d84b49ab9e8.png)


6.build.xmlを以下に順次変更
ファイルパスの部分は書き換えが必要です

```
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="remotedebug" name="Create Runnable Jar for Project HelloRemote">
    <!--this file was created by Eclipse Runnable JAR Export Wizard-->
    <!--ANT 1.7 is required                                        -->
    <!--define folder properties-->
    <property name="dir.buildfile" value="."/>
    <property name="dir.workspace" value="${dir.buildfile}/.."/>
    <property name="dir.jarfile" value="//192.168.9.112/raspberry_pi"/>

	<property name="raspberrypi" value="192.168.9.112" />
	<property name="raspberryfolder" value="/home/pi/samba" />
	<property name="username" value="pi" />
	<property name="password" value="raspberry" />
	
	<target name="create_run_jar">
        <jar destfile="${dir.jarfile}/fxtest.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <attribute name="Main-Class" value="application.Main"/>
                <attribute name="Class-Path" value="."/>
            </manifest>
            <fileset dir="${dir.buildfile}/bin"/>
            <zipfileset excludes="META-INF/*.SF" src="C:/OPENCV3/pleiades-4.8/pleiades/eclipse/plugins/org.eclipse.fx.ide.css.jfx8_3.3.0.201805280700.jar"/>
        </jar>
    </target>
	
	<target name="remotedebug" depends="create_run_jar">
		<echo>"Starting ${raspberrypi}:${raspberryfolder}/${jar.filename} in debug mode"</echo>
		<sshexec trust="true" host="${raspberrypi}" username="${username}" password="${password}" failonerror="true" usepty="true" command="DISPLAY=:0 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=*:4001,suspend=y -classpath ${raspberryfolder} -jar ${raspberryfolder}/fxtest.jar" />
	</target>
</project>
```
6-1.中身の解説
「default="remotedebug"」は最後に実行されるtargetを指定

```
<project default="remotedebug" name="Create Runnable Jar for Project HelloRemote">
```
「target name="remotedebug" depends="create_run_jar"」のdependsはこのtargetの前に実行されるtargetを指定
　つまり、先に実行可能jarファイルが作成されラズパイに配備される

```
<target name="remotedebug" depends="create_run_jar">
```
jshを使用してsshでコマンドを実行する部分
ポイントは２点　
DISPLAY=:0　この指定がないとなにも表示されない
address=*:4001  *:は任意のホストからアクセスという意味。4001はポート番号で空きがあれば当然変更できる

```
<sshexec trust="true" host="${raspberrypi}" username="${username}" password="${password}" failonerror="true" usepty="true" command="DISPLAY=:0 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=*:4001,suspend=y -classpath ${raspberryfolder} -jar ${raspberryfolder}/fxtest.jar" />
</target>
```
7.jschをクラスパスへ設定
ダウンロードする。スクロールしていくとリンクが見えてくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/7bf82043-02f2-11dd-2f5a-b6851dade73c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/1989c19b-b0d2-4dfc-fdf9-ada005f0be27.png)

7-1.jsch-0.1.55.jarをダウンロードし適用なフォルダに保存

7-2.HelloRemoteを右クリックしインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/26f72728-756e-7b3a-ef4d-a89b71f0aad7.png)
7-3.一般-ファイル・システムを選択し次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/5bfd289c-7b35-0e0a-f797-29bbc077726b.png)
7-4.jsch-0.1.55.jarにチェックいれて完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/570984aa-13bf-8723-00d8-f399ed13e359.png)
7-5.パッケージエクスプローラーにjsch-0.1.55.jarがあるとを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/53dcec67-832c-e198-507f-6d32943000d6.png)
7-6.build.xmlを右クリックし実行-外部ツールの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/9fc6da07-e935-3dfd-340f-abefd82e8e03.png)
7-7.antビルドを選択した後に新規作成のアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/9d716efa-96b6-5d4d-c02e-313157ddfd15.png)
7-8.「クラスパス」タブのユーザ・エントリを選択し、JARの追加ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/4f3e6131-207f-5edf-5572-b51b4582bf83.png)
7-9.ツリーを展開しjsck-0.1.55.jarを選択しＯＫボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/8fbbb57c-6b3b-a704-ca02-ce48475be16a.png)
7-10.クラスパスに追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/21a583ad-16d2-95fb-86cb-ab5aaf2e12c2.png)
8.Antビルドを実行
 実行ボタンを押す。コンソールに以下の表示がでれば成功している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/cefab58b-63be-02ed-da2b-841da0014466.png)
8-1.ソースを変更して２回目以降はアイコンから実行できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/1a20c60a-1582-caa0-fb12-c3ab8d2138f9.png)

ANTビルドを行うと、「ビルド→ラズパイに配備→リモートJVMでの待ち受け」まで一発で実行でき非常に便利
前置きが長いがこれをしておかないと、時間ロスが大きい
Mavenと連携する方法もあるが、またの機会とする

###リモートデバッグを実行###
1.HelloRemoteを右クリックし「デバッグ」-「デバッグの構成」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/ff99ac02-7f23-e38b-416b-1704cd765601.png)
2.リモートJavaアプリケーションを選択し後、新規構成のアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/324eccce-c7a0-52df-c466-b601937df30f.png)
3.ホストにラズパイのIPアドレス
  ポートにbuild.xml内で指定したポート番号
  リモートVMの終了を許可にチェック
  デバッグを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/d562fdbf-9524-37a6-cfd0-5763d77f0b3c.png)
4.こんな感じで実行できる。
ラズパイ側にターミナルは表示されない
※強制的に出す方法をご存じの方、情報を求む！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/8ba3b309-46ab-ab22-ff86-f01cd5b7418f.png)
5.ブレークポイントのテスト
onTestBTメソッド内にブレークポイントを設定しButtonを押すとパースペクティブがデバッグに切り替わり一時停止することを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672650/40128fab-529e-d0b2-d71c-2ed1a22892f4.png)

#次回の予定#
ラズパイのGPIO制御について解説する
主にPI4Jの使い方

2020.0727 kamoshika
当記事と全く関係ないが....主のチャンネルのリンクを貼っておく
https://www.youtube.com/channel/UCbtzwsQhTuUzW3ERoBSYZDw/