EclipseでMinecraftのプラグイン開発環境構築

# はじめに
一年以上前に[VPS上でMinecraftマルチサーバー環境構築の記事](https://qiita.com/ttk1/items/ab863e1e3cf73b92b192)を投稿しました。
今回は今更ですがその続編です。

仕事の都合でJavaを勉強する機会があり、せっかくなのでMinecraftのプラグインを作るかと重い腰を上げた次第です。実は、数カ月前に[Java Day Tokyo](http://www.oracle.co.jp/events/javaday/2017/)に行く機会があったのですが、そこでこんな本を買っていたのでした。

「[マインクラフトでマルチサーバーを立てよう! (Think IT Books)](https://www.amazon.co.jp/dp/4295000809)」

この本は[ecolight](https://twitter.com/ecolight)さんによる[Think IT連載](https://thinkit.co.jp/author/9624)が書籍化したものです。この本ではプラグインの開発環境として[NetBeans](https://netbeans.org)を用いた方法が紹介されています。説明がわかりやすくおすすめです。

この記事では私が普段使用しているEclipseを用いたプラグイン開発環境整備の備忘録として残します。
**エンジニア一年目で開発は素人に毛が生えた程度なので間違っている点はぜひご指導ください。**

***プラグインを共同開発してくれる人募集中です***

# 概要
はじめに前回の続きとしてサーバーMODである「Spigot」を導入する方法を紹介します。
次に、EclipseとMavenを使ったプラグイン開発のための初期設定をします。
最後に、テストプラグインをビルドしてサーバー上で動かしてみます。

# Spigotの導入
すでにバニラサーバー（公式のサーバー）が動かせる状態にある前提で話を始めます。
バニラサーバーの導入方法については[前回書いた記事](https://qiita.com/ttk1/items/ab863e1e3cf73b92b192)を参考にしてもらえたらと思います(ただし書いたのが一年以上前なので情報が古くなっているかもしれません)。
サーバーMOD利用経験者の方にとってはおなじみの作業だと思うので、適宜読み飛ばしてください。

## gitのインストール
サーバーMODであるspigotはライセンスなどの問題（詳しくは知りませんが）で実行ファイルが公開されていません。そのかわりに、利用者が公開されているソースコードから実行ファイルを生成するという形をとっています。実行ファイルを生成するためのツール「[BuildTools](https://www.spigotmc.org/wiki/buildtools/)」も公開されています。

はじめに、ソースコードをダウンロードするためのツール「git」をインストールします。

```
[root@host-150-95-181-84 ~]# yum install git -y
```

## Buildtoolsのダウンロード
BuildToolsは[ここ](https://hub.spigotmc.org/jenkins/job/BuildTools/)からダウンロードできます。最新版のダウンロードURLは[https://hub.spigotmc.org/jenkins/job/BuildTools/lastStableBuild/artifact/target/BuildTools.jar](https://hub.spigotmc.org/jenkins/job/BuildTools/lastStableBuild/artifact/target/BuildTools.jar)になっています。

```
[root@host-150-95-181-84 ~]# wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastStableBuild/artifact/target/BuildTools.jar
```

## ビルドの実行
Buildtoolsを使ってサーバーの実行ファイルを生成します。
Buildtoolsを実行すると複数のファイルが生成されるので、個別フォルダ内で行うといいかもしれません。

```
[root@host-150-95-181-84 ~]# mkdir buildtools
[root@host-150-95-181-84 ~]# mv BuildTools.jar buildtools/
[root@host-150-95-181-84 ~]# cd buildtools/
[root@host-150-95-181-84 buildtools]#
```

Buildtoolsを実行するコマンドは[このページ](https://www.spigotmc.org/wiki/buildtools/)に書いてあります。
バージョンを指定する場合は、

```
java -jar BuildTools.jar --rev 1.12.1
```

のようにします。最新のバージョンにする場合は、

```
java -jar BuildTools.jar --rev latest
```

のようにします。
今回は特にバージョンは気にしないので最新バージョンにします。
コマンドを実行すると、ソースコードのダウンロードとビルドが自動で行われてサーバーの実行ファイルが生成されます。

```
[root@host-150-95-181-84 buildtools]# java -jar BuildTools.jar --rev latest
~~ 中略（結構時間かかります） ~~
Success! Everything compiled successfully. Copying final .jar files now.
Copying craftbukkit-1.12.2-R0.1-SNAPSHOT.jar to /root/buildtools/.
  - Saved as craftbukkit-1.12.2.jar
Copying spigot-1.12.2-R0.1-SNAPSHOT.jar to /root/buildtools/.
  - Saved as spigot-1.12.2.jar
[root@host-150-95-181-84 buildtools]# ls
apache-maven-3.5.0  BuildTools.log.txt  craftbukkit-1.12.2.jar  work
BuildData           Bukkit              Spigot
BuildTools.jar      CraftBukkit         spigot-1.12.2.jar
[root@host-150-95-181-84 buildtools]#
```

実行ファイル`spigot-1.12.2.jar`が生成されているとビルド成功です（現時点の最新版が1.12.2）。

## Spigotの起動
Spigotの実行ファイルをサーバー用のディレクトリにコピーし起動します。
この辺はバニラサーバーと同じです。

```
[root@host-150-95-181-84 buildtools]# cd ..
[root@host-150-95-181-84 ~]# mkdir server
[root@host-150-95-181-84 ~]# cp buildtools/spigot-1.12.2.jar server/
[root@host-150-95-181-84 ~]# cd server/
[root@host-150-95-181-84 server]java -jar spigot-1.12.2.jar nogui
Loading libraries, please wait...
[01:53:34 INFO]: Starting minecraft server version 1.12.2
[01:53:34 WARN]: To start the server with more ram, launch it as "java -Xmx1024M -Xms1024M -jar minecraft_server.jar"
[01:53:34 INFO]: Loading properties
[01:53:34 WARN]: server.properties does not exist
[01:53:34 INFO]: Generating new properties file
[01:53:34 WARN]: Failed to load eula.txt
[01:53:34 INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[01:53:34 INFO]: Stopping server
```

バニラサーバーと同様、eula.txtの変更をする必要があります。

```
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Mon Sep 25 01:53:34 JST 2017
eula=true
```

もう一度Spigotの実行をします。
今度はちゃんと起動できるはずです。

```
[root@host-150-95-181-84 server]# java -Xmx512M -Xms512M -jar spigot-1.12.2.jar nogui
```

一度起動すると、バニラサーバーとは異なり`plugins`というフォルダが生成されています。次回以降、起動時にこのフォルダにプラグインのファイルが入っていると読み込まれる仕組みになっています。

```
[root@host-150-95-181-84 server]# ls
banned-ips.json      commands.yml  logs             plugins            spigot.yml      world
banned-players.json  eula.txt      ops.json         server.properties  usercache.json  world_nether
bukkit.yml           help.yml      permissions.yml  spigot-1.12.2.jar  whitelist.json  world_the_end
```

# プラグイン開発環境構築
*前置きが長くなってしまいましたが、ここからが本題です。*
今回はEclipseを使ってプラグインの開発環境構築をしていきます。

## Eclipseのインストール
インストールインストーラは[ここ](https://eclipse.org/home/index.php)から入手できます。
Windows版では起動すると次のような画面になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/baadbd2a-2ad7-60cd-5f10-6f415f2c985e.png)

今回はMavenを使うので一番上を選択すればいいでしょう。（他は使ったことが無いです）
ワークスペースの場所を決める画面が出ると思いますが、特に気にならないのであればデフォルトのままでいいでしょう。
Gitと連携する場合などは適宜変更してください。

## Mavenプロジェクトの作成
無事にインストールができると、次のような画面が立ち上がります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/86f4f849-2138-3955-093e-2598b60a7ee3.png)

はじめにデフォルトのテキストエンコーディングをUTF-8に変更します。
メニューバー->Window->Preferenceを選択し、設定画面のGeneral->WorkspaceのText file encodingをUTF-8に変更してApply and Closeをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/e72c67b3-a6b1-e47c-7cca-b9313c479881.png)

Mavenプロジェクトを作成していきます。
メニューバー->File->New->Otherを選択するかCtrl+Nで新規作成画面になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/b3599968-fc65-f19a-5c57-422194482052.png)

Mavenの中にMaven Projectがあるので選択しNextをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/54dd8193-49d1-9acb-2779-2939921a9641.png)

**Create a simple project**にチェックを入れます。
チェックを外したままにするとアーキタイプと呼ばれるプロジェクトの雛形を利用できるのですが、今回は使いません。
Nextをクリックすると次の画面になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/b3057f19-b413-22cf-e5c0-20f77cdbc5b6.png)

**Group Id**はプロジェクトを一意に見分けるための名前になります。ルートパッケージ名にするのが一般的らしいです。
他のIdとの重複を避けるために、独自ドメインを逆順にしたものを使用すると良いみたいです。（私の場合はttk1.netを持っているのでnet.ttk1を使用します。）
特に公開するわけではないのであれば重複を気にする必要はありません。

**Artifact Id**は生成される実行ファイルの名前になります。今回はtest_pluginにします。
デフォルトで**Version**は0.0.1-SNAPSHOT、**Packaging**はjarになっているので、生成されるファイルは「test_plugin-0.0.1-SNAPSHOT.jar」になります。今回はデフォルトのままにしておきます。

Finishをクリックすると空のプロジェクトが生成されます。

## pom.xmlの記述
SpigotAPIを使うためにはそのパッケージファイルをダウンロードする必要があります。
Mavenプロジェクトではpom.xmlファイルに、必要なパッケージファイルの情報を記述しすることで自動でダウンロードしてくれます。
SpigotAPIのための記述内容は[ここ](https://www.spigotmc.org/wiki/spigot-maven/)にあるものを利用できます。下の画像の赤線で囲んだ部分をコピーします。
ただし、**version**をSpigotサーバーと同じにする必要があります。（今回は1.12.2-R0.1-SNAPSHOTなのでそのままコピーします。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/e5193d96-71d7-9f42-491f-86b559926ceb.png)

SpigotAPIとBukkitAPIの両方の記述があるのでSpigotAPIの部分だけを使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/d7f75abe-94a1-4247-4060-9407ea9d3afd.png)

pom.xmlを更新すると自動でMaven Dependency内にパッケージファイルがダウンロードされます。

## メインクラスの作成
まず、パッケージを作成します。
Package Explorerでsrc/main/javaを右クリック->New->Packageを選択します。
**name**には先ほど入力したGroup Idと同じものを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/5371a8bb-fb03-5029-7ad2-e8f556d72cce.png)

次に、メインクラスを作成していきます。
Package Explorerでnet.ttk1を右クリック->New->Classを選択します。
Testクラスを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/417b2dbb-39e7-4686-44d7-db8f21d08de9.png)

テストとして、ログイン時に「Welcome to my world!」というメッセージを表示するクラスを作成します。
今回はプログラム内容についての説明は省略しますが、Test.javaの記述は次のようになります。

```
package net.ttk1;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class Test extends JavaPlugin {
    @Override
    public void onEnable() {
    	//ログインメッセージの表示設定
    	getServer().getPluginManager().registerEvents(new LoginMsg(), this);
    	//開始時のログ出力
        getLogger().info("test enable");
    }

    @Override
    public void onDisable() {
    	//停止時のログ出力
        getLogger().info("test disable");
    }
    
    class LoginMsg implements Listener {
    	@EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
        	event.getPlayer().sendMessage("Welcome to my world!");
        }
    }
}
```

## plugin.ymlの記述
plugin.ymlはSpigotサーバーがプラグインを読み込むために必要なファイルです。
[ここ](https://bukkit.gamepedia.com/Plugin_YAML)に詳しい内容が書いてあります。
**name**、**version**、**main**の三項目が必須のようです。
nameはプラグインを識別する名前で、サーバー上でプラグインのデータを保存するディレクトリ名にも使用されます。
versionはプラグインのバージョンです。Mavenプロジェクトのバージョンでも入れておきましょう。
mainはメインクラス（今回はTestクラス）の完全修飾名を入れましょう。

```
name: test_plugin
version: 0.0.1
main: net.ttk1.Test
```

plugin.ymlは「src/main/resources」に作成します。
Package Explorerでsrc/main/resourcesを右クリック->New->Fileを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/c4c88428-0890-b894-80e8-400ac2fb9506.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/24c4c5ef-1bd3-2d10-4e9b-ce04dc549918.png)

# テストプラグインのビルドと実行
プロジェクトをビルドしましょう。
メニューバー->Run->Run Configurationsを選択すると、次の画面が表示されるので「Maven Build」を右クリックしNewを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/67fa0353-bd7a-0b35-9784-fdc2a54d6022.png)

次の画面が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/78ba65f6-ae99-193b-ab7f-4ced4c48b4e7.png)

赤線で囲ったWorkspaceをクリックすると、プロジェクトの選択画面が出るので「test_plugin」を選択します。
すると**Base directory**に文字列が入力されます。

**Goals**には「package」と入力します。

***JDKの指定をしないとビルドに失敗します。内容修正中***

Runをクリックするとビルドが開始します。
次のように表示されたらビルド成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/70871feb-3c1c-6231-cf8c-c56c05f792b7.png)

WARNINGが出ていますが、これはpom.xmlの`<project>~</project>`内に

```
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
```

を追記すると消えます。

出来上がったプラグインをサーバーのpluginsフォルダにアップロードしましょう。
プラグインは`Building jar:`の行に表示されている場所に保存されています。

アップロードはDropboxやGoogleDriveに保存して共有リンクをサーバー上から`wget`する方法などもありますが、scpコマンドを使うのが一番手っ取り早いでしょう。

```
$ scp C:/Users/tama/eclipse-workspace/test_plugin/target/test_plugin-0.0.1-SNAPSHOT.jar root@150.95.181.84:./server/plugins
root@150.95.181.84's password:
test_plugin-0.0.1-SNAPSHOT.jar                100% 3245   299.0KB/s   00:00
```

Spigotサーバーを起動しましょう。

```
[root@150-95-181-84 server]#java -Xmx512M -Xms512M -jar spigot-1.12.2.jar nogui
Loading libraries, please wait...
[03:44:26 INFO]: Starting minecraft server version 1.12.2
~~ 中略 ~~
[03:44:27 INFO]: [test_plugin] Loading test_plugin v0.0.1
~~ 中略 ~~
[03:44:31 INFO]: [test_plugin] Enabling test_plugin v0.0.1
[03:44:31 INFO]: [test_plugin] test enable
[03:44:31 INFO]: Server permissions file permissions.yml is empty, ignoring it
[03:44:31 INFO]: Done (4.552s)! For help, type "help" or "?"
>
```

プラグインは問題なく読み込まれたようです。
Minecraftのクライアントから接続してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126305/975dc910-56e9-92fe-92dd-1dad90d6a02c.png)

***Welcome to my world!***が表示されました！

今回はちょっと難しかったでしょうか？


# まとめ
EclipseとMavenを用いてプラグインの開発環境を構築しました。
今回はプラグインを作ることが目的ではなかったので、作ったのは単純なプラグインでしたが、SpigotAPIは他にももっと機能があります。便利なプラグインを作ってMinecraftを盛り上げていきましょう。

**勢いで書き切ったため間違った情報、不適切な表現、誤字脱字あるかもしれません。気づかれた方ご指摘お願いします。**


# 参考
[Eclipse+Maven という便利な開発環境をインストールからプロジェクト作成まで](https://qiita.com/daikuro/items/4d4d694ddb3cc620bee1)
[マインクラフトでマルチサーバーを立てよう! (Think IT Books)](https://www.amazon.co.jp/dp/4295000809)
[連載:マインクラフトでマルチサーバーを立てよう！ プラグイン開発の基礎](https://thinkit.co.jp/article/10707)