Minecraftサーバーを動かす知識

Bukkitプロジェクトの作成 IntelliJ IDEA編

投稿:  By: HimaJyun

このページでは、Bukkitプラグインを開発するために必要なプロジェクトの作成とIDEの操作全般を解説します。

なお、このページではIntelliJ IDEAを使用した方法を解説します。

Eclipse(Pleiades)を使用している方は「Bukkitプロジェクトの作成 Eclipse編」をご覧ください。

(前のステップは「Bukkitプラグイン開発に必要な知識と用意する物」です)

プロジェクトの作成

ここではIntelliJ IDEAの英語版を使用して説明します。Pleiadesで日本語化している方は適当に読み替えてください。

まずはプロジェクトを作成しましょう。「Create New Project」を選択します。
/bukkit/development/tutorial/create-project-idea/001.png

「Maven」を選択し「Next」(このとき、「Project SDK」に何も表示されていないなら「New」からJDKを指定しましょう)
/bukkit/development/tutorial/create-project-idea/002.png

プロジェクトの情報を入力する画面です。
/bukkit/development/tutorial/create-project-idea/003.png

「GroupId」は他の人と重複しないようにする必要があります。(ここでいう他の人とは、世界中に居るJava開発者の事です)

そのため、ドメイン名を逆順にして利用する事が推奨されています。たとえばこのサイトのドメインはe-craft.ioなのでio.e-craft、他にもexample.comならcom.example……という具合に。

ドメインを持っていない方はGitHubやTwitterのアカウント名を利用しましょう。たとえばGitHubのアカウント名がoctocatならcom.github.octocat……という具合。

「ArtifactId」はプロジェクト名=プラグイン名です。好きなように名付けて構いません。

「Version」はバージョン番号です。好きな番号を付けて構いませんが、「Semantic Versioning」というやり方がよく使われます。

最後に確認画面が表示されます。問題なければ「Finish」を選択しましょう。
/bukkit/development/tutorial/create-project-idea/004.png

pom.xmlの編集

Bukkitプラグインを開発するためにはBukkitAPIを利用できるようにする必要があります。

ちょっとだけ解説しておくと、最初の方に出てきた「Maven」はこれらの「必要なもの(依存関係)」を管理する仕組みです。(Maven以外にもいくつか種類があります)

実際にBukkitAPIを利用できるように設定していきましょう。まずはpom.xmlを開きます。
/bukkit/development/tutorial/create-project-idea/005.png

初期状態では次のような内容になっていると思われます。

<?xml version="1.0" encoding="UTF-8"?>
<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>io.e-craft</groupId>
    <artifactId>ProjectSample</artifactId>
    <version>1.0.0</version>
</project>

BukkitAPIを利用するためにはBukkitのリポジトリを追加する必要があります。(厳密にはSpigotのリポジトリなのですが、細かい事は気にしない)

</project>の上に次のように追加しましょう。

<repositories>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
    </repository>
</repositories>

続いて、BukkitAPIを追加します。(厳密に言えばSpigotAPIですが、細かい事は気にしない)

先ほどと同じように、</project>の上に次のように追加しましょう。

<dependencies>
    <dependency>
        <groupId>org.spigotmc</groupId>
        <artifactId>spigot-api</artifactId>
        <version>1.14.2-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<version>の部分は使いたいバージョンを指定します。「(Minecraftバージョン)-R0.1-SNAPSHOT」と指定します。

他は常に同じなので気にしなくて構いません。

以前まではこれだけでも良かったのですが、最近のJDKでは次のようなエラーが発生します。

[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[ERROR] ソース・オプション5は現在サポートされていません。7以降を使用してください。
[ERROR] ターゲット・オプション5は現在サポートされていません。7以降を使用してください。

これらのエラーを回避するために、</project>の上に次のように追加しましょう。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<maven.compiler.source><maven.compiler.target>は使用するJavaバージョンの指定です。

Java 8までは1.8のように指定しますが、Java 9以降はバージョンをそのまま指定します。(たとえば、Java 11を使用するなら11)

これらの3つを追加すると次のようになっているはずです。

<?xml version="1.0" encoding="UTF-8"?>
<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>io.e-craft</groupId>
    <artifactId>ProjectSample</artifactId>
    <version>1.0.0</version>

    <repositories>
        <repository>
            <id>spigot-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.14.2-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

Mavenのインポート

これでpom.xmlは正しく編集できているのですが、実はこのままではまだBukkitAPIは使えません。

変更を適用するためには"インポート"を行う必要があります。

pom.xmlを変更すると画面右下に「Maven projects need to be inported」と表示されることがあります。

これが表示された際にはインポートが必要になるため、左側の「Import Changes」を選択しましょう。
/bukkit/development/tutorial/create-project-idea/006.png

この操作はプロジェクトを右クリックして「Maven」→「Reimport」からでも行えます。
/bukkit/development/tutorial/create-project-idea/007.png

これらの操作を毎回行うのは面倒なので自動でインポートする事も可能です。

先ほどの画面の右側、「Enable Auto-Import」を選択すると自動でインポートが行われるようになります。
/bukkit/development/tutorial/create-project-idea/006.png

これは設定画面の「Import Maven projects automatically」からも設定可能です。チェックが入っていれば有効。
/bukkit/development/tutorial/create-project-idea/008.png

ちなみに、設定画面は「File」→「Settings...」から開きます。
/bukkit/development/tutorial/create-project-idea/013.png

「正しく設定できているはずなのにエラーが出る」という時にはインポート忘れの可能性があるので確認してみましょう。

プラグインに必要なファイルの作成

BukkitAPIを依存関係に追加した後は実際にプラグインを開発します。

Bukkitプラグインとして認識させるためにはいくつかの作法に従う必要があります。

メインクラスの作成

まずはメインクラスを作成してみましょう。

メインクラスとはBukkitプラグインをロードする時に呼び出されるクラスです。Bukkit版のpublic static void mainみたいなものです。

src/main/javaを右クリックして「New」→「Package」を選択しましょう。
/bukkit/development/tutorial/create-project-idea/014.png

パッケージ名は小文字で、groupIdとプラグイン名をドットで繋げます。

たとえば、今回の例ではgroupIdはio.e-craftなのでio.e_craftです。パッケージ名にハイフン(-)は使えないのでアンダースコア(_)に置き換えます。

今回の例ではプラグイン名はProjectSampleですが、パッケージ名は小文字が原則なのでprojectsampleとなります。

この2つをドットで繋げるのでio.e_craft.projectsampleがパッケージ名となります。
/bukkit/development/tutorial/create-project-idea/015.png

他の例

groupIdがcom.exampleで、プラグイン名がAdminToolsなら、パッケージ名はcom.example.admintoolsとなります。

groupIdがcom.github.octocatで、プラグイン名がCatTreeなら、パッケージ名はcom.github.octocat.cattree……という具合。

パッケージが作成できたら、次は作成したパッケージを右クリックしてクラスを作成します。
/bukkit/development/tutorial/create-project-idea/016.png

クラス名は何でも構いませんが、「Main」やプロジェクト名が分かりやすいでしょう。
/bukkit/development/tutorial/create-project-idea/017.png

小技ですが、パッケージの作成は省略できます。

クラスを作成する際にパッケージ名.クラス名で作成すればパッケージも含めて作成されます。
/bukkit/development/tutorial/create-project-idea/018.png

Hello, world!

さて、作成したばかりのクラスは次のような状態になっていることでしょう。

package io.e_craft.projectsample;

public class ProjectSample {
}

メインクラスではJavaPluginクラスを継承する必要があります。

継承が分からない?大丈夫、extends JavaPluginを書き加えるだけです。

package io.e_craft.projectsample;

import org.bukkit.plugin.java.JavaPlugin;

public class ProjectSample extends JavaPlugin {
}

importに関してはJavaPluginの入力途中で補完が出るでしょうから、そこからJavaPluginを選べば自動で追加されます。

もし、それらの画面が出ず、JavaPluginがエラー(赤文字)になったときはJavaPluginにカーソルを合わせてAlt+Enterを押してみましょう。
/bukkit/development/tutorial/create-project-idea/019.png

「Import class」を選べば必要なimportが追加されます。
/bukkit/development/tutorial/create-project-idea/020.png

次のコードと同じようにonEnableを追加してみましょう。

package io.e_craft.projectsample;

import org.bukkit.plugin.java.JavaPlugin;

public class ProjectSample extends JavaPlugin {
    @Override
    public void onEnable() {
        getLogger().info("Hello, world!");
    }
}

onEnableはプラグインがロードされた時に実行されるコードです。

(今回は使いませんが、プラグインが無効化された際に実行されるのはonDisableです)

getLogger().info()はコンソールにメッセージを表示するためのコードです。

つまり「起動時にコンソールへメッセージを表示する」という事をやっているわけです。

plugin.ymlの作成

ここまでの手順で最低限のプラグインのコードを書きました。

しかし、このままではまだ動作するプラグインは作成できません。

プラグインを動作させるためには、そのプラグインに関する情報を記載したplugin.ymlを作成する必要があります。

src/main/resourcesを右クリックして「New」→「File」を選択します。
/bukkit/development/tutorial/create-project-idea/021.png

plugin.ymlを作成します。
/bukkit/development/tutorial/create-project-idea/022.png

最低限必要なのは次の4つです。

main: "メインクラス"
name: "プラグイン名"
version: "バージョン"
api-version: "APIバージョン"

mainはメインクラスのパッケージ名とクラス名をドットで繋げたものを記載します。

nameはプラグイン名を記載します。versionはプラグインのバージョンです。

api-versionは厳密には必須ではありませんが、ほぼ必須なので記載しておきましょう。

これは対応しているBukkitAPIのバージョンを記載します。たとえば1.13や1.13.2なら1.13、1.14や1.14.2なら1.14という具合です。

今回の例では次のようになります。

main: "io.e_craft.projectsample.ProjectSample"
name: "ProjectSample"
version: "1.0.0"
api-version: "1.14"

mainを間違えていると動作しないので、間違えないように気を付けましょう。

プラグインのコンパイル

ここまででプラグインに最低限必要なファイルの追加が完了しました。

実際にプラグインをコンパイルしてjarファイルを作成しましょう。

画面右側の「Maven」をクリックします。
/bukkit/development/tutorial/create-project-idea/023.png

「Lifecycle」→「packege」を右クリックして「Run Maven Build」を実行します。
/bukkit/development/tutorial/create-project-idea/024.png

「packege」に成功すると、次のようなログが表示されます。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.163 s (Wall Clock)
[INFO] Finished at: 2019-01-01T00:00:00+09:00
[INFO] Final Memory: 12M/48M
[INFO] ------------------------------------------------------------------------

上手くいかない時は「clean」を試してみましょう。古いファイルが削除されて上手くいくようになるかもしれません。

作成されたjarはプロジェクトディレクトリ/targetの中にプロジェクト名-バージョン.jarというファイル名で存在しています。
/bukkit/development/tutorial/create-project-idea/025.png

これをサーバーのpluginsディレクトリに追加して起動してみましょう。

上手く作成できていれば起動したときにメッセージが表示されます。

[00:00:00] [Server thread/INFO]: [ProjectSample] Enabling ProjectSample v1.0.0
[00:00:00] [Server thread/INFO]: [ProjectSample] Hello, world!

/plコマンドでもプラグインとして認識されていることが分かりますね!

>pl
[00:00:00] [Server thread/INFO]: Plugins (1): ProjectSample

知っておくと便利なこと

プラグイン開発に必須な訳ではありませんが、知っておくと便利な事をいくつか紹介しておきます。

JavaDocの取得

Javaにはメソッドの使い方を解説するための「JavaDoc」があります。要するにAPIの使い方です。

JavaDocもMavenを利用して管理されています。インポート時にダウンロードしておくと良いでしょう。

やり方は簡単、プロジェクトを右クリックして「Maven」→「Download Sources and Documentation」です。
/bukkit/development/tutorial/create-project-idea/009.png

設定の「Automatically donwload」から「Sources」と「Documentation」にチェックを入れておくと自動で行われるようになります。
/bukkit/development/tutorial/create-project-idea/010.png

また、「Show quick documentation on mouse move」と「Show the documentation popup in ... ms」にもチェックを入れておくといいでしょう。

これらにチェックを入れておくと、入力補完の際やメソッドにマウスを重ねた際にJavaDocが表示されるようになりとても捗ります。
/bukkit/development/tutorial/create-project-idea/011.png
/bukkit/development/tutorial/create-project-idea/012.png

plugin.ymlをpom.xmlと連動させる

plugin.ymlでプラグインのバージョンを指定しましたね。

それとは別にpom.xmlにもバージョンを指定する項目があります。

原則的に両方とも同じバージョンにするものなのですが、片方のバージョンを上げた時にもう片方も手で更新しなければならないのは面倒です。

「Maven」にはこういった用途に対応するための機能もあります。

次のコードをpom.xml</project>の上に追加しましょう。

<build>
    <resources>
        <resource>
            <targetPath>.</targetPath>
            <filtering>true</filtering>
            <directory>src/main/resources/</directory>
        </resource>
    </resources>
</build>

plugin.ymlを次のように書き換えます。

main: "io.e_craft.projectsample.ProjectSample"
name: "ProjectSample"
version: "${project.version}"
api-version: "1.14"

version${project.version}になっただけですね。

後は先ほど同様にMavenでpackageを実行してjarを作成するだけです。

${project.version}の部分が自動的にpom.xmlに設定したバージョンへ変換されます。

まとめ

ここではIntelliJ IDEAを使用してBukkitプラグインを開発するために必要なプロジェクトの作成とIDEの操作全般を解説しました。

自分の作ったプラグインがBukkitで正しくロードされてゲーム内で動作する。感動ですね!

え?まだ何も出来ないからそうでもない?……その辺は次のステップ(執筆中ダヨ)で解説します。

このページで作成したファイルはGitHubに掲載しているので、参考にしてみてください。