【Kotlin+Spigot】1.2 プロジェクトを作成する

## 0. 初めに
この説明は、**Intellij** を使用した場合の説明です。
まだ、インストールしていない人は[1.1 開発環境のインストール](https://qiita.com/sya-ri/items/87ad160d5418cdf5db00)を参考にしてみてください。

## 1. プロジェクトを準備する
**Create New Project** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/11dc0522-8cec-a4b1-1b7b-d6ce5bd7d7b6.png)

左側から **Gradle** を選択し、**Kotlin/JVM** だけにチェックをつけてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/74160f8b-85a2-5889-eaee-7f402fcd6ac3.png)

プロジェクトの設定をします。
**Name** と **ArtifactId** はプロジェクトの名前です。同じ名前にしておくといいです。

**Location** はフォルダの場所です。自分の好きなところに設定してください。

**GroupId** はパッケージ名です。他のプロジェクトと区別するための名前です。
一般的にはドメイン名を逆にしたものが使われます。(例: `example.com` → `com.example` , `s7a.dev` → `dev.s7a`)

ドメインを持っていなく、GitHub のアカウント持っていれば、`com.github.(アカウント名)` としましょう。私(sya-ri)であれば `com.github.syari` になります。

アカウントすら持っていなければ、`me.(マイクラのID)` とかでもいいでしょう。私(sya_ri)であれば `me.syari` になります。
これはとてもよく使うので覚えておいてください。

**Version** はバージョンです。そのままでもいいですが、私は `1.0` にしています。

設定し終わったら、**Finish** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/419edbe7-39a4-7993-3e25-852a5a64dbe5.png)

プロジェクトに必要なデータをダウンロードしています。
このような画面が表示されるまで待っててください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/912e98d0-e426-a459-a7f0-ab7abfe90679.png)

右下にこのようなポップアップが出たら **Fix** を選択してください。
そのあとは **Configure Automatically** を選択して、自動で設定を終わらせましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/5489370d-19d8-5fef-81be-ce32877adfaf.png)

上に緑色のバーが表示されていたら、**Ok, apply suggestion!** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/df871a64-c763-031d-2242-54dbf1f3750e.png)

## 2. build.gradle の設定
プロジェクトを作ったばかりの時はこのようになっていると思います。

```build.gradle
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.5.21'
}

group 'me.syari.qiita.p_1_2_how_to_create'
version '1.0'

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
```

**plugins** はビルドに使うプラグインの設定です。そのままで大丈夫です。

**group**, **version** は事前に設定した GroupId, Version です。そのままで大丈夫です。

**repositories** (リポジトリ) に

```gradle
    maven {
        url "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
    }
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
```
を付け足して

```gradle
repositories {
    mavenCentral()
    maven {
        url "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
    }
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
}
```
このように書き換えてください。
これを追加しておくことで、簡単に必要なファイルをダウンロードできるわけです。

**dependencies** (依存関係) に関してです。

```gradle
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
```
の `implementation` を `compile` に書き換えて

```gradle
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
```
のようにしてください。

また、

```gradle
    implementation "org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT"
```

を付け足して

```gradle
dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation "org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT"
}
```

**compileKotlin**や **compileTestKotlin** はそのままで大丈夫です。

一番最後に

```gradle
jar {
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
```
を付け足してください。これを追加することで プラグインを .jar ファイルとして出力できます

最終的にこのようになっていると思います。

```build.gradle
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.5.21'
}

group 'me.syari.qiita.p_1_2_how_to_create'
version '1.0'

repositories {
    mavenCentral()
    maven {
        url "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
    }
    maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    implementation "org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

jar {
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
```

右上に以下のようなリロードボタンが表示されていたら、**必ず押してください**。`build.gradle` の変更を反映するのに必須です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/fda21703-8cdc-5caa-7dfc-026430e801f3.png)

## 3. .kt をかく
左のフォルダやファイルがあるところから
`src` → `main` を開いてください。
そして、`kotlin` を右クリックして `New` → `Package` を選択してください。
パッケージ名は 先ほどから出てきている **GroupId** です。
私であれば以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/14113081-7e06-d957-39e3-ffb1174cc97f.png)
では次に、作成したパッケージを右クリックして `New` → `Kotlin Class/File` を選択してください。
名前は何でもいいですが、分かりやすく `Main` としておきます。
ファイルの種類は `Class` にしてください。これらの違いは後々解説しようと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/48ee444e-2474-f305-d708-b751705ddcc2.png)

生成されたファイルを見ると

```Main.kt
package me.syari.qiita.p_1_2_how_to_create

class Main {
}
```

このような感じになっていると思います。

こちらを編集していきましょう。

```kotlin
class Main {
```
の `Main` と `{` の間に `:JavaPlugin()` というのを書きます。
以下のように候補が出ると思うので、`JavaPlugin`を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/dafc8e1a-7302-098b-5c45-edc1df5e9a92.png)
候補から選択することで `import` というのを自動でやってくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/83297ea9-9b80-304d-2798-e171b9f0b02f.png)
最後に `()` をつければOKです。

###### 補足説明: `import` とは…
簡単に言うと、「これ、使います！！」と宣言をしています。
別のファイルで定義されたものを使いたいときは必ずこれをしなければいけません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/fd665ffc-14dd-d55a-445c-164297bd291b.png)
このように赤くなっていたらカーソルを合わせてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/66869551-57ee-53e7-de25-6a3927081550.png)
`Unresolved reference` かみ砕いて言うと、「どれを使えばいいかわからないよ><」といった感じです。
`Import` を選択すると 自動で書いてくれます。
※ 同じ名前だけど別物 ということがよくあります。
最初のうちに使うものは大抵 `org.bukkit` や `org.spigotmc` から始まります。
それらを選ぶと間違えることが少ないかもしれません。
もしも、間違ったものをインポートしてしまったらその行を消しましょう。

では、実際に処理を書いてみましょう。
まず、

```kotlin
    override fun onEnable() {
        
    }
```
を追記して、下のようにしましょう。

```kotlin
class Main: JavaPlugin() {
    override fun onEnable() {
        
    }
}
```

`onEnable` を日本語で言うと `有効になった時` です。
要するに、プラグインが起動したときに実行される処理をここに書けばいいです。
とりあえず、コンソールに起動したことを知らせるメッセージを送信してみましょう。
`onEnable` の 中括弧 `{ }` の中に処理を書けばいいのです。

```kotlin
    override fun onEnable() {
        logger.info("プラグインが起動したよ")
    }
```
このように編集しましょう。これで .kt の編集は終わりです。

## 4. plugin.yml をかく
処理をいくら書いてもプラグインとしては完成しません。
サーバーに対して、「これはプラグインですよ～」と分かるようにしておかなければなりません。
そこで書くのが `plugin.yml` です。
`src/main/resources` を右クリックして `New` → `File` を選択してください。
ファイル名は `plugin.yml` です。
実際に書いていきましょう。

```plugin.yml
name: 
version: 
api-version: 
main: 
author: 
```
これを書き足していきましょう。
**name** はプラグインの名前です。アルファベットで入力しましょう。私は `HowToCreate` にします。
**version** はプラグインのバージョンです。プロジェクトと同じに設定すれば大丈夫です。
**api-version** は Minecraft 1.13 から追加されたものです。1.13以降はそれを書けば大丈夫です。私は `"1.15"` にします
**main** は `JavaPlugin()` が書いてあるクラスのパスです。指示通りにやっていれば `(グループID).Main` で大丈夫です。
**author** はプラグインの作者の名前です。自分のMinecraftIDを書いておけばいいでしょう。私は `sya_ri` になります。

私の場合はこのようになります。

```plugin.yml
name: HowToCreate
version: "1.0"
api-version: "1.15"
main: me.syari.qiita.p_1_2_how_to_create.Main
author: sya_ri
```

これで終了です。

## 5. プラグインをサーバーに入れる
まずは .jar を生成するところからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/c9569152-f292-db58-4115-74ba4a01ae33.png)
右のほうに `Gradle` と書かれたものがあると思います。それを選択すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/fe4ff996-cc34-57ae-1c27-6272655df181.png)
こんな画面。`プロジェクト名 → Tasks → build` と開いていくと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/9fe90d2d-c134-9236-47e7-72b55c506780.png)
`jar` と書かれたものがあると思いますので、それをダブルクリック。

下のコンソールに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/0756dd96-a509-e1dc-2dc8-b7e87fc9b79b.png)
`BUILD SUCCESSFUL` と出ていたら成功です。

左側の `build` → `libs` を開くと目的の .jar があると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/c7f9895e-f370-19eb-992c-c640a3c7fbcc.png)
これを右クリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/31d2b9cc-694d-7e73-3486-9b33b0f81dc3.png)
`Show in Explorer` というのがあるのでそれをクリックすることで .jar があるフォルダが開かれます。
あとはこれをサーバーの `plugins` に入れるだけ。
それでは、サーバーを起動してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628547/388658fe-5729-33da-f335-a5507e69b36d.png)
「プラグインが起動したよ」とメッセージが出ていれば成功です！！お疲れ様でした。

## 6. 終わりに
これからいろいろなプラグインを作ると思いますが、過去に書いたものを残しておくのも大切なことです。
毎回違うプロジェクトとして保存しておくと見返すときも簡単です。

今回作ったプロジェクトをテンプレートとしておく。
→ 新しいプロジェクトを作ったらコピペで済ませるようにしておく。

こんなようにしてたくさんのプロジェクトを作ってみると達成感も感じられます。
どうか、一つのプラグインを書き換えてチュートリアルを進めていくのはやめてほしいです。
別々にしていたことで役に立つときがいずれありますから。私からのお願いです。

### [プロジェクト用テンプレート](https://gist.github.com/sya-ri/974ad5bbb296e85807ff714cc71750bb#file-projecttemplate)

## リンク
### [次の記事に進む](https://qiita.com/sya-ri/items/2b3e9e063048699ead50)
### [目次に戻る](https://qiita.com/sya-ri/items/bc7eb01ed687b9ff9566#%E7%9B%AE%E6%AC%A1)