贺兰兰
本帖最后由 贺兰星辰 于 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?

贺兰兰
小黑同学。 发表于 2020-2-12 15:32
不有jdk13了吗,为什么要用8?

forge往往只支持Java8(bukkit部分兼容),你当然可以用Java11或者13,但兼容性就不好说了

纯小黑同学


纯小黑同学
我做错了什么

瑾某人
老家伙,鸽子精!
你的下一章要等到什么时候?

TopLuren
正好是我需要的,太感谢了

sanqiue
wwwwwwwwwwwwwwwwwww
超级感谢,找了好久sponge开发教程
结果在bukkit教程里找我想要的东西了
非常好的教程!!
sponge是个好API,可惜没有好的教程怎么促进更多人开发啊啊
希望继续更新

sanqiue
看了一下关于使用gradle和maven的,
大多都是褒义贬义,
说mavern不好
可是gradle的教程贴实在太少了
还是放弃了

速食冻橘
早该写个用idea+minecraft development的了,效率,方便和简易程度远胜ecp撸插件。
我觉得每个写java的都应该用用idea,开发mc衍生的人都应该试试minecraft development插件,
毕竟,是我玩工具,不是工具玩我

neyc314
咕咕咕咕咕咕咕咕咕咕咕咕

兰苑伊城
准备跟着你的更新学一波。

Ajsjsj
期待下一章

neyc314
咕咕咕咕咕咕咕咕咕咕咕咕2个月辣

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

636939hyf
楼主能把Intellij百度云发出来吗?网址进不去

wordangyou
感谢感谢。

912628490
为什么五年前我就看不懂呢 太真实了哈哈哈哈

绿村民
感谢分享,求更新

sanqiue
写的好啊,新手能看得懂的教程就是好教程
有些教程花里胡哨的,点一下跳到这里,点一下跳到那里

麻蛇
大佬nb期待大佬的下次更新

克鲁鲁殿下
看这个之前个人觉得应该先去看看Java书,了解if,while 和循环之类的判断。。。。

ZiXuan_love
很有道理,我再去看一遍,嘻嘻

MarcoBasso
加油!!

hma-mrfz
MCBBS有你更精彩

Rinbin
收藏永不停止,行动永不开始

lucien寓言
你好,楼主,IntelliJ IDEA的网站无法链接,请问是否有别的下载途径?

贺兰兰
lucien寓言 发表于 2020-3-27 21:43
你好,楼主,IntelliJ IDEA的网站无法链接,请问是否有别的下载途径?

网站没问题确实可以访问,可能是国内网络环境问题。
试试下面这个链接?
https://www.jetbrains.com/idea/d ... indows&code=IIC

dcpswysbbdxy
谁会在意下一秒




enter

ImOxygen
讲的好,快点更第三期啊啊啊啊啊贺兰

88453877
水个帖子

xiyanxinnian
很棒的教程,过去这么久,终于有替代老教程的帖子了[#哭唧唧],一开始没入门的时候看老教程帖子是一脸懵逼。后来转sponge开发了,sponge好在他的文档翻译全面,写插件也相对容易上手。最后,支持楼主!

诗钰啊
想问一下在使用minecraft development插件创建新项目的时候在minecraft version那里没有任何内容,并且提示 应该如何解决,最开始用的时候是没问题的,不知道为啥突然变成了这样,是网络问题吗?

糖一浪
很棒 慢慢学

MiaoLio
贺兰大佬快更新啊建议多些对构建工具这方面的教程

下一页 最后一页