やること
こんな感じでプラグイン有効時にログを表示すると言う超簡単なプラグインを実装します. ちゃんとやれば15分もしないくらいで終わる内容です.対象読者
- minecraftのspigotサーバーを既に構築できている.
筆者の環境
macOS Mojave
バーション: 10.14.6
Macbook Pro (15-inch, 2018)
プロセッサ: 2.2GHz Intel Core i7
メモリ: 16GB 2400MHz DDR4
起動ディスク: Macintrosh HD
グラフィックス: Radeon Pro 555X 4GB
Intel UHD Graphics 630 1536MB
総合開発環境(eclipse)の導入
ダウンロードサイトへアクセスします。
すると以下のようなサイトにアクセスできるはずです.
とりあえず自分は最新版を選択しました.
次にこの中の Java
の full Edition
をインストールします.
Standard Edition
でも問題ないらしいですが特にそちらを選択する理由もないので自分はfull Edition
を使用しました.
ただ,何故かMacのセキュリティで弾かれたので以下のサイトを参考にして解決しました.
(恐らく,Eclipseの最新版がMac側に認証されていなかった?)
Mac - すべてのアプリケーションの実行を許可
プロジェクトの作成
まず,ファイル->新規->Mavenプロジェクト
の順で選択していきます.
そうすると以下のような画面が表示されるので「シングルなプロジェクトの作成(アーキテクチャの選択をスキップ)」にチャックを入れて「次へ>」をクリックします.
次にプロジェクト情報を入力する画面です.
(QiitaがQIitaになってるのはただの僕のタイポです...)
「グループId」は製作者の名前です.
「アーティファクトId」はプロジェクト名=プラグイン名です。好きなように名付けて構いません。
「バージョン」はバージョン番号です。これも好きなように名付けて問題ないです.
この三つを設定します.他は特に変更する必要はないはずです.
これでプロジェクトの作成は完了です!
pon.xml
の設定
次にプラグインを設定するための設定を行なっていきます.
ここで「必要なものの(依存関係)」を準備します.
初期状態ではこうなっていると思います.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.kubota</groupId>
<artifactId>QiitaSample</artifactId>
<version>1.0.0</version>
</project>
ここにspigot関係の設定を記載します.
以下のようにspigot-repository
と Spigot-API
を追加することで'BukkitAPI'を利用できるようになります.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.kubota</groupId>
<artifactId>QiitaSample</artifactId>
<version>1.0.0</version>
<!-- ↓ Spigot-repository -->
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<!-- ↓ Spigot-API -->
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<!-- ↓ (Minecraftバージョン)-R0.1-SNAPSHOT -->
<version>1.13.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
ただこれだけだとマインクラフトのversionによっては動作しないので以下のようにプロパティを記載します.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.kubota</groupId>
<artifactId>QiitaSample</artifactId>
<version>1.0.0</version>
<!-- ↓ Spigot-repository -->
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<!-- ↓ Spigot-API -->
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<!-- ↓ (Minecraftバージョン)-R0.1-SNAPSHOT -->
<version>1.13.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- ↓ プロパティ設定 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- ↓ Java version 12 -->
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
</project>
あと現在はのちに追加するplugin.yml
との連携を容易にするために以下のように変更します.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.kubota</groupId>
<artifactId>QiitaSample</artifactId>
<version>1.0.0</version>
<!-- ↓ Spigot-repository -->
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<!-- ↓ Spigot-API -->
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<!-- ↓ (Minecraftバージョン)-R0.1-SNAPSHOT -->
<version>1.13.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- ↓ プロパティ設定 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- ↓ Java version 12 -->
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
<!-- plugin.yml を pom.xml と連動させる -->
<build>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>src/main/resources/</directory>
</resource>
</resources>
</build>
</project>
以上で,pom.xml
の変更は終了です.
プロジェクトの更新
pom.xml
の変更によって依存関係が多少変化したのでその更新を行う必要があります.
やり方としては作成したプロジェクト(僕の画面上ではQiitaSample
が該当)を右クリックし,Maven->プロジェクトの更新
の順で選択していきます.
こうすることで依存関係の更新が始まります(時間はそんなにかかりませんでした).
そうすると以下のような画面が出ると思います.
(筆者の場合は以前に作成したプロジェクトも出てきますが,初作成なら一つだけでしょう)
これに今回作成したプロジェクトをチャックし,OKを押します,
これで更新は完了です!
プラグインの作成
BukkitAPIの依存関係の設定が完了したのでPlugin自体の作成入っていくことができます.
メインクラスの作成
作成したプロジェクト下のsrc/main/java
を右クリックして「新規」→「パッケージ」の順に選択して行きましょう。
次にパッケージ名は グループIDとプラグイン名を.(ドット)で繋げたもの を使用するようにしましょう.
筆者の場合はグループIDがcom.github.kubota
,プラグイン名がQiitaSample
であるcom.gtihub.kubota.qiitasample
となります
一部変化しているのはこのパッケージ名は大文字が使えないので小文字に置き換えたり,-
(ハイフン)が使用できないので_
(アンダーバー)に置き換えているためです.
そして,作成したパッケージを右クリックして「新規」→「クラス」の順に選択して行きましょう。
そうすると以下のような画面が表示されるのでそこに咲くせうするクラス名を記載しましょう.
名前はなんでもいいですが,わかりやすいように今のプロジェクト名かMain
としましょう.
(ここのQiitaがQIitaになってるのも僕のタイポです...)
これを開くと以下のように記載されているはずです.
package com.github.kubota.qiitasample;
public class QIitaPlugin {
}
これを以下のように変更しましょう.
package com.github.kubota.qiitasample;
import org.bukkit.plugin.java.JavaPlugin;
public class QIitaPlugin extends JavaPlugin{
//↓ onEnableはロードされた時に実行されるメソッド
@Override
public void onEnable() {
// ↓ サーバー上にログを残す
getLogger().info("Hello, Qiita!");
}
}
それでは変更した箇所を一つ一つ解説していきます.
import org.bukkit.plugin.java.JavaPlugin;
この行でplugin
を作成するのに必要な機能をインポートしています.
public class QIitaPlugin extends JavaPlugin{
この箇所で追加したexetends JavaPlugin
によりマインクラフトの基本機能がすでに実装されているクラスに機能を追加していく形で作成していくことが可能になります.
public class QIitaPlugin extends JavaPlugin{
//↓ onEnableはロードされた時に実行されるメソッド
@Override
public void onEnable() {
// ↓ サーバー上にログを残す
getLogger().info("Hello, Qiita!");
}
}
ここで onEnable
メソッド に関して軽く説明します.
@Override
と言う箇所で Javaplugin
クラス内のメソッドを上書きすること示しています.
上書き対象は onEnable
メソッド です.
onEnable
メソッド はプラグインが有効になったタイミングで自動的に実行されるメソッドです.
ここの中の処理は上書きをしない状態であれば何も機能はないです.
なので上書き処理として 'getLogger().info()'メソッドで 「Hello,Qiita!」とコンソールに表示と言うものを追加します.
この上書き処理によって プラグインが有効になったタイミングで自動的に 「Hello,Qiita!」とコンソールに表示する と言う機能をもつメソッドになりました.
plugin.ymlの作成
src/main/resources
を右クリックして「新規」→「ファイル」を選択します.
そして,plugin.yml
という名前のファイルを作成します.
以下の4つが記載されていればです.
name: "メインクラス"
version: "バーション"
main: "メインクラス"
api-version: "BukkitAPIのバージョン""
name
はプラグイン名を記載します。
version
はプラグインのバージョンです。ただ,このversionですが今回はplugin.yml
をpom.xml
と連動させているので${project.version}
と記載すればOKです.
main
はメインクラスのパッケージ名とクラス名をドットで繋げたものを記載します。
api-version
は厳密には必須ではありませんが、ほぼ必須なので記載しておきましょう。
これは対応しているBukkitAPIのバージョンを記載します。たとえば1.13や1.13.2なら1.13、1.14や1.14.2なら1.14という具合です。
name: "QiitaSample"
version: "${project.version}"
main: "com.github.kubota.qiitasample.QiitaSample"
api-version: "1.13"
プラグインのコンパイル
これでもう大体実装は完了しました.
あとはコンパイルするだけです.
方法はプロジェクト名の部分を右クリックして「実行」→「Maven install」を選択します。
これを実行するとコンソール画面に結果が表示されます.
BUILD SUCCESS
と表示されていれば成功です.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.762 s
[INFO] Finished at: 2019-08-12T21:15:44+09:00
[INFO] ------------------------------------------------------------------------
そうすると terget
に Jar
ファイルが追加されているはずです.
これをもともと作成してあったサーバのディレクトリの Plugins
にこのJar
ファイルを追加して実行すればPluginは動き出します
(諸事情によりプラグイン名が QiitaTest
になっていますが上記の手順で正常に動作するのを確認しました)
と言うことで以上で今回の内容は終了です.
自分はMac環境下でプラグインの開発を行いましたが,Eclipseの使い方自体はWindowsも同様なので参考になると思います.
(多少,ボタンの配置は違うかもしれないですが...)
続き
[MineCraftプラグイン]コマンドを受け付けてイベントを発生させる
はまったところ
name: "SampleProject"
version: "${project.version}"
main: "com.github.kubota.sampleproject.SampleProject"
api-version: "1.13"
本編のplugin.yml
には記載していますが.
このmain
のところをパッケージ名のみで問題ないと勘違いしており以下のように記載していました.
name: "SampleProject"
version: "${project.version}"
main: "com.github.kubota.sampleproject"
api-version: "1.13"
これによりSampleProject
ファイルが参照できず以下のようなエラーを吐いていました.
[16:11:39 ERROR]: Could not load 'plugins/SampleProject' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Cannot find main class `com.github.kubota.sampleproject'
at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:62) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:135) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:332) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:252) [spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at org.bukkit.craftbukkit.v1_13_R2.CraftServer.loadPlugins(CraftServer.java:325) [spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at net.minecraft.server.v1_13_R2.DedicatedServer.init(DedicatedServer.java:213) [spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at net.minecraft.server.v1_13_R2.MinecraftServer.run(MinecraftServer.java:698) [spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at java.lang.Thread.run(Thread.java:835) [?:?]
Caused by: java.lang.ClassNotFoundException: com.github.kubota.projectsample
at java.net.URLClassLoader.findClass(URLClassLoader.java:436) ~[?:?]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:136) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:82) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
at java.lang.ClassLoader.loadClass(ClassLoader.java:588) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
at java.lang.Class.forName0(Native Method) ~[?:?]
at java.lang.Class.forName(Class.java:415) ~[?:?]
at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:60) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-dfa7583]
... 7 more