贺兰兰
本帖最后由 贺兰星辰 于 2020-3-18 21:57 编辑

2 0 2 0 年 辣!
    2020年1月13日,我正所事事地看论坛,从问答版到茶馆,再从茶馆到编程开发,于是乎我想看看泥坛现在比较热门的Bukkit插件开发教程是啥样
结果我一上来就看到了Eclipse
什 么 鬼 玩 意(大声)
然后当我发现那个帖子发帖时间已经是5年以前的时候我释然了,这让我想起了5年前,那个小屁孩看着那个教程学Bukkit开发的样子
(然后并没有学会)
所以我开始思考,为啥明明确实很零基础的开发教程,我当年看不懂呢
后来我发现,流程错了先学技术再学思想救不了中国
所以我决定开坑这个系列,真正的教大家从Java的面向对象(OOP)思想出发,慢慢推进,还有课后作业(划掉),最终教大家掌握Java开发的技巧
那么就是这样,本章作为第零章,教大家安装环境

零.安装环境
   首先,如果你要学习开发Minecraft服务器插件,那么我觉得你至少应该对MC服务端的架构有所了解,例如,什么是Bukkit,什么是Spigot,什么是Sponge,什么是BukkitAPI,什么是SpongeAPI。
Bukkit全称CraftBukkit(?),是一个通过对Minecraft官方服务端(即Vanilla)强行反编译然后制造API(如果你不知道什么是API,那么请看下面“BukkitAPI”项)来实现对服务端的高度自定义的服务端核心
而Spigot(当然还有Paper等等)则是Bukkit核心的优化版,并且代码基于Bukkit,因此也兼容Bukkit插件
Sponge则独立于Bukkit,是一套全新的服务端核心,包括SpongeVanilla和SpongeForge,因为支持ASM等框架因此对MOD兼容非常好(它本身其实就是一个ForgeMOD),他也基于Vanilla,但形式不同,它是以Coremod方式兼容的(不懂也没事,和下面没啥关系,只是顺带介绍)
BukkitAPI则是Bukkit核心所提供的一套“接口”,想想看,我们把Vanilla核心比作一个没有开口的盒子,你没法往里面装你想要的东西,但是Bukkit他把盒子强行捅了一个洞,并且插了一根管子方便你放东西进去,那么这根管子就是BukkitAPI,他是开发人员和程序沟通的桥梁
然而,因为嫌盒子是纯色的太难看了,所以Spigot画了点图案,并且又多插了根管子Paper又觉得Spigot的图案不够,因此又加了一点,并且也插了一根管子这两个管子分别是SpigotAPI和PaperAPI不过别怕,这两个API内均包含BukkitAPI(还记得吗,他们只是多插了一个管子,而不是换掉了),因此以前的管子你还能用,但是如果你用这两个新盒子的话你可以更快捷的放东西。

    如果接受这个设定,那么一切就很好说了,但这并不是我们这一章要讲的,我们这一章讲的是安装环境,Java开发环境
    严格意义上来讲,你其实只需要JDK(Java Development Kit,Java开发工具包)就可以进行编程,但是你能忍受用记事本写代码,然后在CMD或者Powershell上面运行各种编译命令编译项目,而且不容易关联别的项目吗?
    上世纪的程序员们似乎都是这么走过来的,但是这是2020年,我们也许不需要经历先辈们的那些苦痛就可以很方便的进行编程,用一个软件就可以解决上面的所有问题,那么这类东西就叫做IDE(集成开发环境)
    支持Java的IDE有很多,IntelliJ IDEA,Eclipse,Visual Code,Netbeans等等,数不胜数,在这里我们将会使用先进的(也很美观的)IntelliJ IDEA
   
    1.首先我们下载JDK,前往https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载适合你操作系统的JDK8(下载方式很清楚,如果连下载都做不到那谈何开发)(当然如果你希望为1.7.10及以下版本开发插件,那你应该下载JDK7,因为那个时候甚至还没有Java8,在Java8环境运行Java7编译的程序虽然是被兼容的,但总会引起一些问题)
    前排提示,严格意义上来讲,你开服,或是玩MC用的那个所谓“Java”不是Java,他其实属于Java SE系列的JRE(Java运行环境)任何情况下,任何人使用你的Java程序都需要在自己的电脑中安装JRE(但他们没必要安装JDK,他们不是开发者)(你可能会问为啥我下的一些软件不需要什么环境,然而实际上是因为你的Windows系统自带那些.net或是C++运行环境)
    当然,JDK自带JRE,因此你无需安装额外的JRE(如果你已经安装了JRE那也无须担心,两者完全可以共存)
    安装时一路点击下一步安装,直到结束。
    在这个时候,大多数教程一定会教你编辑系统环境变量什么的,但是其实这一步在今天已经不那么重要了,因为IDE会自动指定你的JDK位置,你不需要用系统环境变量来手动指定,因此这里我们直接略过这一步
    2.接下来我们安装IntelliJ IDEA,前往http://www.jetbrains.com/idea/download/下载免费的Community社区版IDEA(对我们来说功能足够了,当然,如果你财大气粗,你可以选择直接购买高级版或是去某宝买激活码),第一次打开会显示是否导入现有IDEA配置文件,我们直接选择无需导入然后点击Next
    在这里我又要前排提示了,你会发现IDEA是英文的,虽然网上有一堆IDEA汉化包,但是我强烈不推荐你使用所谓的汉化包,因为那会造成歧义和语言交流障碍,再者,学习编程你是需要具备一定外语基础的,如果你连public,private都不知道是什么意思,那我建议你回去学英语而不是在这学开发
    如果一切都顺利,那么展现在你面前的应该是这个界面

如果是,那么恭喜你,你已经是半个程序员了
    但是等等,先别急着创建项目,作为MC插件开发者,我们还有捷径可以走
    很显然,如果你要开发Bukkit插件,那你势必需要导入BukkitAPI作为你的项目前置,这样你才有机会使用它里面提供的API,如果你需要别的API,那你还需要手动导入别的,这很麻烦,因此,我建议使用Minecraft Development,它提供了一套对MC开发者的预开发环境
    点击右下角的Configure,点击Plugins,在Marketplace栏中搜索“Minecraft Development”,点击安装
    这下,你又朝着偷懒前进了一步。
    安装完成后Restart IDE,再点击Create New Project,你可以在左边的选框中央看到“Minecraft”这一栏,点击进去,你能够看到几乎所有主流API的开发套件

   为确保插件最大兼容,我们选择Bukkit,点击Next,下面的界面中,你能够看到四个选项,它们分别是
  1. GroupID:
  2. ArtifactID:
  3. Version:
  4. “Maven or Gradle”
复制代码
这里我们就需要理解Java的一些面向对象原理了
    为了满足大型程序构建的需要,Java抛弃了传统的面向过程开发方式,选择了面向对象的开发方式,这是一个很抽象的概念,但是我希望你能基本理解包和类的意思:在这个架构下,所有的程序都处于一个个包(Package)中,包你可以按照字面意思理解,就是一个包裹,例如有一个包名叫做cn.lingyuncraft.learningjava(注意,包名都应该是小写的),那么这是一个叫做cn的包裹里头有一个叫做lingyuncraft的包裹里头还有一个叫做learningjava的包裹(显然,一个包里可以装更多的包,但也不仅仅只能装包,也可以装别的东西,比如下文要说的类);包裹里面装的一般是类(Class,不是班级的意思,忘掉那个意思),类里面存的才是真的代码(事实上,包就是文件夹,一般来说,一个或多个类存放在一个.java文件中)。这样来看,如果基于上文那个包中有一个叫做HelloMinecraft的类,那么这个类的全名应该是cn.lingyuncraft.learningjava.HelloMinecraft(注意,虽然不是必须的,但是我们推荐类名使用这种首字母大写的驼峰命名法,这其实是一种编程的好习惯),注意,Java是大小写敏感的,HelloMinecraft不等于HelloMINECRAFT
    如果理解了上面的意思,那么你需要理解在运行一个大型服务端时肯定有很多插件,服务端核心会把这些插件聚合到一起执行,这些插件中肯定免不了有类名相同的情况,于是,如果没有包的存在,那么我们不仅很难结构化我们的程序,而且还会引起程序冲突,这就是包存在的意义
    回到上面,GroupID其实指的就是你的主包名你的主类放在你的这个包里(当然你可以创建同级,下级甚至上级的其他包,这无所谓,但你需要设定一个主类,程序会获取到你的主类并从这里开始执行代码),我们推荐使用你的域名的反写作为你的主包名以避免冲突(如,cn.lingyuncraft,cn.mcsqrc,等),如果你没有自己的域名,也可以使用me.你的名字(如,me.shaokeyibb),当然,也可以使用代码托管网站的包名(如,io.github.shaokeyibb),只要你能避免和其他人冲突就行,你甚至可以写一个abcdefg.gfedcba,但可读性好不好就不好说了(注意:包的第一个字符不能是数字或下划线,如top.6cnm这种包名就是不被允许的)   
AftifactID是指你的插件名称在MinecraftDevelopment中,他也会成为你的插件主类名,这里应该使用首字母大写的那种形式,比如,HelloMinecraft(这样和上面加起来便会创建cn.lingyuncraft.hellominecraft.HelloMinecraft,注意,HelloMinecraft指HelloMinecraft类,而cn.lingyuncraft.hellominecraft则是这个类所在的包名
    Version就不用多说了,是指你插件的版本,你可以在plugin.yml内修改你的版本号(在MinecraftDevelopment中,由于使用了Maven或是Gradle,因此你应该前往他们的配置文件修改版本号
    接下来着重介绍Maven和Gradle这俩东西:前面说过了,让你去一个一个下载,装载数不胜数的API是很麻烦的,那么捷径是什么呢?那就是Maven和Gradle,他们都可以通过导入一个仓库地址,指定一个API名称和版本来自动为程序下载依赖并自动导入到项目中,非常方便,Maven和Gradle功能基本相同,但Gradle设计理念更新一些,不过由于本人用惯了Maven所以这里我们用Maven
    选好以后点击Next,在上面一行你只需要变动“Minecraft Version”项,指定你希望进行开发的MC版本(有些版本因为改动不大所以其实是向上/下兼容的,1.13以上除外;如果上面没有你想要的版本,那么你可能需要使用传统的方法导入依赖或是导入Maven/Gradle依赖)。下面一行是可选配置,你写入的内容都会被保存到plugin.yml中(后面你会知道这个文件在MC插件中扮演着一个重要的角色),我们可以不填这里。下一页是IDEA基本配置,要求你选择项目保存位置和项目名(和我们插件无关,只是用来标记而已),这里大家自己填写。
    当我们点击Finish,IDEA弹出一个界面,当你看到
  1. package cn.lingyuncraft.hellominecraft;

  2. import org.bukkit.plugin.java.JavaPlugin;

  3. public final class HelloMinecraft extends JavaPlugin {

  4.     @Override
  5.     public void onEnable() {
  6.         // Plugin startup logic

  7.     }

  8.     @Override
  9.     public void onDisable() {
  10.         // Plugin shutdown logic
  11.     }
  12. }
复制代码
的时候,恭喜你,你已经准备好开发一个Bukkit插件了
Tips:如果你在顶部看到“SDK未指定”和Setup SDK按钮时,这说明你的电脑中安装了多个JDK版本,在这里我们应该选择1.8.X而不是1.11.X(1.8是Java8的内部版本号,人们一般叫做Java8)


家 庭 作 业:思考以下问题:
1.按照上面所讲的,Paper是Spigot的优化版,那么Paper可以使用SpigotAPI和BukkitAPI吗,反过来,Spigot可以使用PaperAPI吗
2.思考:cn.lingyuncraft.A.B.C.D.HelloWorld中,哪些是包名,哪些是类名

初次执笔,如有谬误,欢迎指正
觉得好的话也可以评分回复233

下一章应该会讲:plugin.yml,onEnable()方法,MinecraftDevelopment默认提供的依赖,public final extend关键字,@Override注解



第二章传送门:https://www.mcbbs.net/thread-990193-1-1.html


来自群组: Server CT

白灯
不推荐在 Java基础 未学会的情况下直接上手 Bukkit开发

1157695795
奈何本人没文化一句牛逼走天下

时间-空间
贺兰出的这个教程很棒!IDEA牛逼!贺兰牛逼!!!

人走茶凉。
收藏未停止

隔壁老吕
的确不推荐无java基础学bukkit插件,我当时真的一点java都不会写插件,拖了一年才搞懂了语法
个人认为Netbeans的界面是最美观的
Eclipse是什么垃圾,占内存大,卡,搜索速度慢,界面瞎眼

玄月月


yuyuaqwq
好棒,等更新

茶茶茶子
等待更新ing

人走茶凉。
那么,下一章在哪里?!

贺兰兰
myunco 发表于 2020-1-31 21:27
那么,下一章在哪里?!

咳咳暂时还没有写
这几天在搞我的服务器,找时间吧
(这一章花了我俩小时wwww)

Lifelinexy2
收藏可以 很棒!!!!

ksqeib445
搞事情干活了!

ussuii
入坑,学过Java,望加论坛好友,稍后会加QQ,共勉,谢谢

猿汐
群里来的,这种教程比目前很多教程都要好很多。
各种跳基础写插件,我真的想把他X给星星了

瑾某人
IDEA大法好,可惜因为电脑配置不行,带不起来.选择了eclipse
支持一下.

纯小黑同学
不有jdk13了吗,为什么要用8?

下一页 最后一页