1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kotlin × Minecraft】開発中のプラグインをワンクリックで楽にリロードする

Posted at

はじめに

開発中のプラグインを、サーバーを再起動せずにワンクリックでリロードできる環境を構築したので、メモを兼ねて記事にします。
これはあくまで「自分なりの方法」です。もっと良い方法や最適解があるかもしれませんが、同じような悩みを持つ方の参考になれば嬉しいです。

やりたかったこと

  • プラグインをビルドしたら、自動でテスト用サーバーにコピーされる
  • サーバーを再起動せずにプラグインをリロードできるようにする

やったこと

1. PluginManager の導入

まずは PluginManager をサーバーに導入します。
私の技術力では、プラグインを完全に再読み込みする処理を自前で作るのは難しかったため、この便利なプラグインに頼ることにしました。

この PluginManager を使えば、サーバーを再起動せずに対象のプラグインをリロードすることができます

2. 更新通知プラグインの開発・導入

AutomaticCreatingPluginUpdate というプラグインを自作し、サーバーに導入しました。

このプラグインの機能:

  • HTTPリクエストを受け取ると、対象のプラグイン名を取得
  • 該当プラグインのリロードコマンドを組み立て
  • チャットに「クリック可能なリロードコマンド」を送信

つまり、「チャットからワンクリックでプラグインをリロードできる」仕組みを作っています!

裏話(失敗談)

本当は「リクエストを受け取った瞬間にリロード処理まで自動でやりたかった」のですが、技術不足により断念しました。今後の課題です。

3. build.gradle.kts でコピー & リクエスト送信

ビルド時に自動で

  • JARファイルをテストサーバーにコピー
  • HTTPリクエストを送信して、チャットにリロードコマンドを表示

という処理を追加しました。

ポート番号は、AutomaticCreatingPluginUpdateで指定したものと同じにしてください

(自分の環境では、開発端末とテストサーバーが別端末なので、Samba 経由でコピーしています)

build.gradle.kts の例
tasks.named("build") {
    // プラグインを特定のパスへ自動コピー
    val copyFilePath = "" // コピー先のフォルダーパス
    val copyFile = File(copyFilePath)
    if (copyFile.exists() && copyFile.isDirectory) {
        doFirst {
            copy {
                from(buildDir.resolve("libs/${project.name}.jar"))
                into(copyFile)
            }
        }
        doLast { // AutomaticCreatingPluginUpdate連携
            // APIリクエストを行う
            val port = // テスト鯖のポート
            val ip = "" // テスト鯖のIPアドレス
            val apiUrl = "http://$ip:$port/plugin?name=${project.name}"
            val url = URL(apiUrl)
            val connection = url.openConnection() as HttpURLConnection

            try {
                connection.requestMethod = "GET"
                connection.connect()

                // レスポンスコードを確認
                if (connection.responseCode == HttpURLConnection.HTTP_OK) {
                    val response = connection.inputStream.bufferedReader().use { it.readText() }
                    println("API Response: $response")
                } else {
                    println("Failed to get response: ${connection.responseCode}")
                }
            } catch (e: Exception) {
                e.printStackTrace()
                println("Error during API request: ${e.message}")
            } finally {
                connection.disconnect()
            }
        }
    }
}

さいごに

このように、PluginManager + 自作通知プラグイン + Gradle連携という形で、かなり快適な開発環境を整えることができました。

最終目標は、「1つのプラグインだけで JAR コピーからリロードまで完結する」ことです!
今後も引き続き改善していきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?