Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 12274|回复: 69

[插件开发教程] 让你的插件开发更轻松——IDEA+Maven开发插件

  [复制链接]
wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-3-28 20:47:28 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 wjwrh 于 2020-6-16 08:20 编辑

使用IntelliJ IDEA&Maven开发插件

目录

一、前言

二、下载IDEA

三、创建项目

四、IDEA&Maven代理的设置

五、Maven的配置

六、实战演示

七、Q&A

更新日志

  • 2020/5/8 更新目录部分结构,完全抛弃了论坛的ljmarkdown解析器
  • 2020/5/7 添加了实战演示与Q&A部分(欢迎向我提出问题~)
  • 2020/3/8 在于论坛的markdown解析器斗智斗勇以后,发布本教程

其它

个人推荐阅读我提供的pdf版本,然后应该会在未来不远的时间内将其同步到我的博客上

  • 由于阿.里.云的NT机制,导致存在我VPS上面的所有图片都无法显示,正考虑修复,修复前请阅读PDF版本
  • 个人博客阅读地址,由于使用GitHub Page,可能访问较慢
  • PDF下载地址 https://www.kurosawaruby.cn/IDEA_with_Maven.pdf
    • 个人的1M带宽小水管VPS,可能加载比较卡
    • 如果之前读过,然后没有及时更新,请Ctrl + F5
  • 百度云地址 链接 提取码vahz

评分

参与人数 7人气 +12 金粒 +57 宝石 +33 贡献 +2 收起 理由
a59118196 + 2 好东西,但是我还是没看懂
凌雨林 + 1 + 5 拒绝白嫖,从我做起!
CyanBillows + 2 MCBBS有你更精彩~
米奇可 + 2 + 12 MCBBS有你更精彩~
乙烯_中国 + 33 MCBBS有你更精彩~
海螺螺 + 4 + 40 + 2 MCBBS有你更精彩~ 优秀奖励
安少An_Shao + 1 MCBBS有你更精彩~

查看全部评分

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-3-29 08:42:51 | 显示全部楼层
本帖最后由 wjwrh 于 2020-5-7 22:29 编辑

一、前言

不知道各位开发插件使用的是什么IDE,eclipse? NetBeans?还是IDEA?相信各位应该对JetBrains全家桶有所耳闻,这也是(我自认为)目前最好的Java IDE,其拥有丰富的插件,具有极强的可扩展性,而且还有很多实用的功能,可以让程序员的生活更加美好。为了方便各位刚刚接触插件的开发者,节省他们因为不称手的工具而浪费的时间,我写下了这篇IDEA + Maven教程,因为,真的是太好用啦!

1. 注意事项

  • 本教程并不包含具体的Java语法教学,但理论上不会Java也能够看懂(但是看懂了也没啥用吧233)
  • 请不要与我争论哪一个 IDE 更好用,这没有意义,纯属浪费时间
  • 本教程的目标为教会各位如何使用 IDEA 配合 Maven 从头开始打包出一个可以使用的插件,其中会可能会穿插一些其他知识的教学,各位可以参考
  • 为了浅显易懂很多东西可能不会讲的很具体,部分细节也会简化,请不要杠谢谢
  • 本教程使用系统环境为Windows 10Linux相关教程暂不提供,因为本教程绝大多数部分都是对于任意操作系统通用的;少部分(例如环境变量配置),我相信有能力使用Linux进行开发的人一定可以自己去完成
  • 强烈建议国内用户使用梯子

2.什么是IDEA?

IntelliJ IDEA是一种商业化销售的Java集成开发环境(Integrated Development Environment,IDE)工具软件,由 JetBrains 软件公司(前称为 IntelliJ)开发,提供Apache 2.0开放式授权的社区版本以及专有软件的商业版本。(什么是IDE? 可以理解为一个工具包,包含了编辑器、编译器、调试器等工具,一条龙服务,使用起来更方便)

3.什么是Maven?

  • Wiki的解释:
    • Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
  • 个人理解:
    • 依赖管理器(当然实际功能不止这么简单)

4.为什么我们需要Maven?

因为你需要一个更好地管理依赖的方式,Maven能够提供依赖包的结构化管理,而且Maven也有丰富的plugin,可以实现更多更强大的功能

回复

使用道具 举报

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-3-29 08:44:05 | 显示全部楼层
本帖最后由 wjwrh 于 2020-3-29 13:49 编辑

二、下载IDEA

IDEA分为两个版本,一个是免费的community版本,一个是收费的ultimate版本


本教程会以收费版IDEA Ultimate 2019.3.4为例进行讲解,如果访问或下载过慢可以使用梯子下载,个人推荐使用Toolbox APP,可以更好的管理Jetbrains的各种IDE


特别注意,如果你是大学生,且你们学校提供了学生邮箱以.edu或.edu.cn结尾,那么你很有可能能白嫖到Jetbrains全家桶!这个是真的香,因为他家别的IDE也十分好用,例如PyCharmWebStorm等等


如果你的学校学生邮箱不可用,你可以去JetBrains/swot项目提pr

回复

使用道具 举报

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-3-29 08:45:29 | 显示全部楼层
本帖最后由 wjwrh 于 2020-4-30 18:27 编辑

三、创建项目

  • 打开IDEA,点击Create New Project



  • 选择Maven并直接点击Next

      

  • 有关这几个选项有必要解释一下




    • Name 项目的名字,可以随便取
    • Location 项目文件的存储地址,可以自己修改
    • GroupId 如果你有域名的话,可以填你的域名,但是需要反过来填写,例如我的域名是kurosawaruby.cn,那么我就要写成cn.kurosawaruby,当然你随便写也是没问题的(,这个的目的主要是为了防止包名的冲突,不过你自己瞎编不要编一个别人的域名出来..
    • ArtifactId 你的插件名字
    • Version 插件的版本
  • 填写完毕之后点击Finish就行啦~,接下来你就可以在src/main目录下添加新的包和类了



回复

使用道具 举报

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-3-29 10:48:39 | 显示全部楼层
本帖最后由 wjwrh 于 2020-4-30 18:27 编辑

四、IDEA&Maven代理的配置

  • 没有代理的同学可以跳过这一条
  • 强烈建议大陆用户使用代理,否则你可能会被低于10kb/s的下载速度折磨的痛不欲生

1. IDEA代理配置

  • 同时按下Ctrl + Alt + S,打开IDEA的Settings界面

  • 在搜索框中输入Proxy,便会进入IDEA的代理设置界面

  • 勾选Manual proxy configuration这里有几个设置项目,设置完成后点击Apply保存即可


    • 代理协议: 这里推荐使用HTTP代理,因为IDEA貌似使用的是socks4代理,而现在主流的代理软件使用的协议都是socks5,注意,如果是使用V2的用户需要开启HTTP代理模式
    • Host name:一般是localhost(127.0.0.1)
    • Post number:代理端口


2.Maven代理配置

  • Maven的代理配置稍显复杂,需要修改Maven的配置文件,首先我们需要找到IDEA的安装目录,使用Toolbox的用户可以在Toolbox的设置中找到

  • 打开{IDEA安装目录}\ch-0\{IDEA内部版本号}\plugins\maven\lib\maven3\conf\settings.xml,转到proxies标签中,去掉红框表示的注释

  • 修改特定的标签为你所需要的,修改好以后的效果应该是这样



修改完成之后就可以使用代理高速下载了~

回复

使用道具 举报

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-3-29 12:26:19 | 显示全部楼层
本帖最后由 wjwrh 于 2020-4-30 18:27 编辑

五、Maven的配置

Maven的配置也是很有讲究的,在一些大型项目中会用到Maven所支持的许多特性,构建一个层次结构分明的依赖管理关系,而本教程作为一个入门教程,并不会教那些很复杂的东西,本教程的目的只有一个——读完教程之后就能够从零开始构建一个自己的插件

Step 0. 打开pom.xml

在之前创建好的项目中打开pom.xml,这个就是本项目的Maven配置文件了,以下所有关于Maven的配置都会在此文件中完成



Step 1. 设置Java源代码的编码方式以及JDK版本

pom.xml的project标签范围内添加以下代码:

  1.     <properties>
  2.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3.         <maven.compiler.target>1.8</maven.compiler.target>
  4.         <maven.compiler.source>1.8</maven.compiler.source>
  5.     </properties>
复制代码

设置编码方式是为了保证跨平台的兼容性,而设置源及目标的JDK版本是为了能够正确的使用某些特性,否则你在使用lambda的时候都有可能会编译错误

Step 2. 从远程仓库添加依赖

有时插件作者会以Maven远程仓库的形式提供给你他插件的依赖,你可以在其插件的开发者文档中找到,这里以Spigot API举例,我们可以在spigot官方找到



对于尚未添加任何依赖的我们来说,直接把这一段复制进pom.xml就好了,之后Maven会询问我们是否要导入修改,我们可以手动导入,也可以开启自动导入



开始导入后,Maven就会自动拉取远程的依赖到本地,如果你没有代理的话你可能需要很久..导入成功后我们就可以在Maven->Dependencies中看到我们导入的依赖了



这里值得一提的就是dependency中的scope标签,这个标签的详解会在下面介绍,姑且让他保持现状,此外就是有多个仓库以及多个远程依赖的情况,我们只需分别在repositories中新建repository标签,在dependencies中新建dependency标签即可,效果如下



Step 3. 导入本地jar文件

有时可能插件作者并没有为你提供远程仓库,这个时候我们就需要自行导入本地的jar文件,例如我们要导入桌面上的Vault.jar文件,可进行如下操作

  • dependencies标签中新建dependency标签,这里我们需要知道三个值,groupId, ArtifactId 以及 version,这三个值我们都可以在插件的plugin.yml中找到

  • 填写上面的值,同时需要设置scope为system,systemPath为你的jar文件的位置



    强烈不推荐这种将依赖地址硬编码的方式,这里只是作为演示才这么写的,规范的处理方式应该是在项目根目录中新建一个lib文件夹,将jar文件放入其中,同时将systemPath改为${basedir}/lib/Vault.jar

Step 4. 使用Shade插件

如果你引入了第三方库,那么你就需要使用maven的shade插件将你引入的第三方库一同打包进最终的jar文件中,否则你的插件会因为找不到指定的class而崩溃,Maven Shade插件是一个功能十分强大的插件,关于这个插件的详细配置十分复杂,emmmm以后可能会考虑专门讲解,现在我们只需要把下列代码直接贴进去就能用了

  1.     <build>
  2.         <plugins>
  3.             <plugin>
  4.                 <groupId>org.apache.maven.plugins</groupId>
  5.                 <artifactId>maven-shade-plugin</artifactId>
  6.                 <version>3.2.0</version>
  7.                 <configuration>
  8.                     <minimizeJar>true</minimizeJar>
  9.                     <createDependencyReducedPom>false</createDependencyReducedPom>
  10.                     <createSourcesJar>false</createSourcesJar>
  11.                     <filters>
  12.                         <filter>
  13.                             <artifact>*:*</artifact>
  14.                             <excludes>
  15.                                 <exclude>META-INF/*.SF</exclude>
  16.                                 <exclude>META-INF/*.DSA</exclude>
  17.                                 <exclude>META-INF/*.RSA</exclude>
  18.                             </excludes>
  19.                         </filter>
  20.                     </filters>
  21.                 </configuration>
  22.                 <executions>
  23.                     <execution>
  24.                         <phase>package</phase>
  25.                         <goals>
  26.                             <goal>shade</goal>
  27.                         </goals>
  28.                     </execution>
  29.                 </executions>
  30.             </plugin>
  31.         </plugins>
  32.     </build>
复制代码

Step 5.关于Scope

常用的scope一共有下列几种

  • compile 这是默认的scope,表示该依赖参与项目的编译、测试和运行阶段,你使用的第三方(可以理解为跟MC没有直接关系的)依赖请设置为compile(但是我也不知道为什么不用shade不会打包进jar文件..)
  • provided 它表示这个依赖在运行时由运行时环境提供,不需要打包进jar文件中,通常绝大多数的其它插件API、服务器API使用此模式,因为在运行时服务端中其它运行中的对应插件会提供指定的类
  • system 模式上与provided相同,唯一的区别就是它不来自远程仓库,而来自本地

回复

使用道具 举报

克鲁鲁殿下 当前离线
积分
2943
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-2-21
查看详细资料
发表于 2020-3-30 16:22:11 | 显示全部楼层
谢谢楼主,但是目录功能是不是更好?

评分

参与人数 1人气 +1 收起 理由
wjwrh + 1 感觉那样编辑起来也不是很方便..我提供的pd.

查看全部评分

回复

使用道具 举报

Himmelt 当前离线
积分
2070
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2014-11-25
查看详细资料
发表于 2020-4-5 10:50:26 来自手机 | 显示全部楼层
gradle它不香吗
回复

使用道具 举报

Nner 当前离线
积分
654
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2015-9-30
查看详细资料
发表于 2020-4-5 11:21:42 来自手机 | 显示全部楼层
这个插件用这一直很舒服
回复

使用道具 举报

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-4-5 17:26:41 | 显示全部楼层

确实gradle用起来会更爽一点,但是感觉现在maven的普及度和知/名度(这个词也踩了?)都比gradle高一些
回复

使用道具 举报

sun弑星 当前离线
积分
90
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-4-2
查看详细资料
发表于 2020-4-5 23:06:40 来自手机 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

梦回繁华ac 当前离线
积分
58
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2020-4-6
查看详细资料
发表于 2020-4-7 08:14:22 来自手机 | 显示全部楼层
666666666666666666666666
回复

使用道具 举报

lq753951456 当前离线
积分
814
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2016-11-20
查看详细资料
发表于 2020-4-30 18:15:30 | 显示全部楼层
我用idea有毒,config.yml文件生成了,内容却是空白的。
回复

使用道具 举报

wjwrh 当前离线
积分
28392
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2013-7-29
查看详细资料
 楼主| 发表于 2020-4-30 18:30:03 | 显示全部楼层
lq753951456 发表于 2020-4-30 18:15
我用idea有毒,config.yml文件生成了,内容却是空白的。

你SaveDefaultConfig()了吗
回复

使用道具 举报

lq753951456 当前离线
积分
814
帖子
主题
精华
贡献
爱心
钻石
人气
下界之星
最后登录
1970-1-1
注册时间
2016-11-20
查看详细资料
发表于 2020-4-30 19:56:01 | 显示全部楼层
wjwrh 发表于 2020-4-30 18:30
你SaveDefaultConfig()了吗

有,我试过很多种方法config的文件都是空白的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2021-9-20 11:04 , Processed in 0.074671 second(s), Total 36, Slave 30 queries, Release: Build.2021.09.13 2028, Gzip On, Redis On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2020 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表