何がしたいのか
PaperやSpigotサーバーで動かすプラグインをリモートサーバーでデバックしながら開発したい。
デバッグとは
実行中のプログラムを止めて変数の中身を見たり、プログラムの変更内容を動的に切り替えることができるようになります。
なぜリモート?
VPSなどのリモートでサーバーを起動する、ぼく的メリットは2つあります。
他の開発者にリアルタイムで開発状況を見てもらえる
ローカルでサーバーを立てる場合でも不可能ではありませんが、ポート開放など環境を整えるのが面倒
低スペックパソコンに優しい
マイクラ鯖ソフトのリソースの使用量は凄まじく、特に8GBのノートパソコンなどではメモリ不足で開発効率が悪くなります。クライアント複数起動なんてもってのほか...
やり方
jvm引数
jarを実行する時に引数にこれをつける
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
IntellijIDEAなどで接続
sshポートフォワーディング
上記のjvm引数を次のようにしてもいいのですが、これではアドレスとポート番号が分かれば誰でも接続出来てしまい、非常に危険です。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
エディタなどでアタッチする前にこのような引数を付けてssh接続しておきます。接続先は、サーバーを起動している場所です。
ssh -L 5005:localhost:5005 <username>@<remote-host>
すると、localhost:5005でデバッグ起動中の鯖にリモートデバッグ接続できるようになります。
Dockerでサーバーを起動している場合
jvm引数のaddressはjdk9以上ではポートしか指定していないと、デフォルトでローカルホストのみになるそうです。
dockerホストから接続できるよう0.0.0.0を付けます。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005
ホストの5005番に接続が来た時、サーバーを起動しているコンテナに繋がるように、dockerでもポートフォワーディングしておきます。加えて、127.0.0.1を付けることで外部からは接続できないようにしておきます。
-p 127.0.0.1:5005:5005
dockerのjvm引数の設定がよくわからなかったので、こちらを確認してみてください。
参考