[下一章](第二章-插件要素.md)

# 第一部分 第一章 如何搭建环境
参与编写者: MagicLu550
#### 建议学习时间: 40分钟
##### 学习要点: 学会使用idea搭建maven环境和nukkit开发环境,并学习调试nukkit项目

一. 环境搭建

搭建环境是我们使用nukkit的第一步，虽然其中下载IDE不是必要的一步，但是是我们进行简便开发的第一步。


1. 首先上[idea官网](https://www.jetbrains.com/idea/download/#section=mac)下载我们所需要的版本，我们
一般选择免费的Community版本，当然您也可以选择购买Ultimate版本,Community版本其实已经符合我们使用的需求，当然
作者使用的是Ultimate版本在此教学。
![1-01](images/1-01.png)

2.打开idea后，我们这里使用[maven](https://maven.apache.org/)项目进行构建,这里使用[jdk1.8](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)，为这些选项即可
![1-02](images/1-02.png)

3.输入完groupId和artifactId(这些是自定义的)，创建项目后，我们会进入这个界面,这里我artifactId为MyFirstPlugin
![1-03](images/1-03.png)

```
转自Snake1999: 这里有必要做一些详细说明。GroupId 经常也是 Java 项目的包名。Java 项目的包命名规则有这样的约定：
以 网站倒着写.项目名字 或者 网站倒着写.项目名字.模块名字 为结构
必须以小写字母开头
必须与别的 Java 包相区别
Nukkit 内核的所有包都是遵循这个规定的 Nukkit 的网站是 nukkit.cn，所以里面包含所有方块（block）的包的包名应该是：
cn.nukkit.block
各位在编写 Nukkit 插件的时候，需要编写一个独特的、和他人的项目不一样的包名，以便与他人开发的插件相区别。比如译者的网站是 snake1999.com，如果译者编写了一个叫 ExamplePlugin 的 Nukkit 插件，就可以放在包名为 com.snake1999.exampleplugin 的包内。以下包名的结构都是可以使用的：
com.snake1999.exampleplugin
net.mcbbs.tutorialplugin
ru.nukkit.nkexample
me.fromgate.firstplugin
而以下的包名都是不被推荐使用的：
main.java.plugin
TestPlugin
另外，开发 Nukkit 插件，我们规定不能把插件的任何部分存放在 cn.nukkit 包下，否则后果自负。
关于主类的名称，只要能和别人的主类区分开就可以了，但是不推荐使用MainClass之类的名称。
```

4. 在pom.xml中加入以下标签可以导入

```xml
<distributionManagement>
        <repository>
            <id>releases</id>
            <name>nukkitx-releases</name>
            <url>https://repo.nukkitx.com/release</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <name>nukkitx-snapshots</name>
            <url>https://repo.nukkitx.com/snapshot</url>
        </snapshotRepository>
    </distributionManagement>

    <repositories>
        <repository>
            <id>nukkitx-repo</id>
            <name>nukkitx-snapshot</name>
            <url>https://repo.nukkitx.com/snapshot</url>
        </repository>
    </repositories>
    
    <dependencies>
            <dependency>
                <groupId>cn.nukkit</groupId>
                <artifactId>nukkit</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
```

如图所示
![1-04](images/1-04.png)

5. 接下来在程序上可以进行开发了

二. 项目结构

1.nukkit的基本项目结构为
```

    -- project
        -- src
            -- main-class
        -- resources
            -- plugin.yml
```
因此我们需要创建主类和plugin.yml(插件配置文件)
转自snake1999:

    - 每个插件都有 plugin.yml 文件。
    - 这里介绍一些设置，说明这个文件的格式。
    - 插件没有这个文件，就不会被 Nukkit 识别和加载。
    - 这个文件的最基本的应该是类似这样的：
    
```yaml
        
        name: FirstPlugin             # nukkit运行时识别的插件名
        main: net.noyark.www.Example  # 主类名称
        version: "0.0.1"              # 版本号
        author: 你的名字，这里指作者名称
        api: ["1.0.8"]                # 早期nukkit api为1.0.0，
                                      # 目前大概为1.0.8
        description: My first plugin  #介绍
```

目前大概为这种结构
![1-05](images/1-05.png)

但是，我们项目目前这样是不够的，Example类需要继承PluginBase才可以成为真正可以加载的主类


```java
package net.noyark.www;

import cn.nukkit.plugin.PluginBase;

public class Example extends PluginBase {

    /**
     * 在服务器加载完成前执行一次
     */
    @Override
    public void onLoad() {
        
    }

    /**
     * 在服务器加载完成后执行一次
     */
    @Override
    public void onEnable() {
        
    }

    /**
     * 服务器即将关闭前执行一次
     */

    @Override
    public void onDisable() {
        
    }
}
```

三. 调试插件

其实调试插件很简单，这里我们需要这几个过程

- 编译,打包
- 部署
- 运行加载
- 调试

1. 编译打包很简单,我们使用ideaIDE可以轻松的实现maven打包

PS:当然在打包之前，建议在pom.xml里加下这个，可以解决idea的编译器版本
无效等一系列问题
```xml
    <build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.2</version>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

        </plugins>
    </build>
```
当然项目是jdk8演示的，如果您不是jdk8，则需要修改一个地方
jdk9
```xml
    <build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.2</version>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.9</source>
                    <target>1.9</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

        </plugins>
    </build>
```
jdk10
```xml
    <build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>3.2.2</version>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.10</source>
                    <target>1.10</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

        </plugins>
    </build>
```
以此类推....

如图所示添加这些标签
![1-08](images/1-08.png)
如图中按钮所示(不要在意其中的项目)
![1-06](images/1-06.png)
之后我们找到其中的package,点击即可
![1-07](images/1-07.png)
如图所示，出现"BUILD SUCCESS"我们就成功了
![1-09](images/1-09.png)
一般的，目标jar包会产生在target文件夹中
![1-10](images/1-10.png)

2. 部署

之后把打包好的合法插件丢入plugins文件里就完美运行了，这里将不做图示
这就是插件部署的过程。

3. 运行加载

如果出现了加载$(您的插件名字)成功之类的字样，说明您的插件成功了。

4. 之后进入游戏测试您的插件是否符合您的需求，根据您插件出现的各种问题
进行再次调试，修改，打包等

[下一章](第二章-插件要素.md)

参考文献
- [[教程] [官方] 使用Maven配置Nukkit开发环境的方法（部分）](https://www.mcbbs.net/thread-706178-1-1.html)
- [Nukkit插件从0开始](https://www.cnblogs.com/xtypr/p/nukkit_plugin_start_from_0.html)
- [[教程] [转载] 如何开始制作 Nukkit 插件? Fromgate 的插件教程来了! [长文|多图] ](https://www.mcbbs.net/forum.php?mod=viewthread&tid=552265&page=1&authorid=100001)
