基于FML的MinecraftMod制作教程(1) - MCP/FG和IDE的配置

首先需要强调,这个教程不是给没有任何编程基础的人准备的...你至少要懂得最基础的编程知识和OOP(面向对象编程)的基础,如果你真的对编程一窍不通的话建议先读读Java教程.

胡来的前言
明明在索引贴不是已经有一个前言了吗?那个是我在3月份写的,在离死又近了7个月后,我又有些新的话想说.前言和教程内容没有任何关系,懒得看文字的跳过就好了.
"当我们追求各种各样的Mod的时候,还记得当初在Alpha时代拿着石镐裸身下矿洞时的感动吗?"这个是我在PD服务器管理组讨论服务器Mod配置问题时说的,以现在的眼光看,Alpha版的MC无比简陋,然而当初我们却能孜孜不倦地下坑,挖矿,努力从矿洞中逃出生天,如此反复直到被骷髅送去见四季映姬(早期版本的JJ怪真不是威胁)...
"一个遗世独立的理想乡"这是我对Alpha1.1的MC的评价,在那个时候,没有Mod,没有MCP,没有作为新人的梦魇的HIM,没有明争暗斗的ModLoader和Forge,没有飞扬跋扈的Spout,没有短命的MCP MF/MS,就连当时的服务器端都是没有Mob的...MC就宛如一片生机盎然的净土(对开局随机到雪地地图的人例外)而玩家作为这片世外桃源中唯一的人类,用双手用工具,开拓出自己的家园.有人在树林中建起一座木屋,有人建起了一座城堡,玩家们挖开了家周围的泥土种上沙子和仙人掌作为护城沟,掏空了一座山建造自己心目中的Secret Base.MC犹如一片乐土,但是这又能维持多久呢...
一年半后,MC迎来了正式版,杀死Ender龙后的诗凝缩了Notch在3年间对Minecraft的所有感情,所有的辞藻汇聚成Notch眼中的MC的主题"A Dream",梦终了,Notch投身于0x10c中.不小心在自己名字中多打了一个e的JeB成了开发组的老大,MC也自然开始向"Jeb眼中的MC"发展,我倒并不是认为Jeb将MC搞砸了,但我感觉MC在慢慢变成一个RPG游戏,而不是最初的沙盒.可又能批评什么呢?"所有人都是如此爱着这个世界,以至于不允许它不向自己希望中的方向发展."谁都有权将MC改变成自己希望中的样子,这正是MC的魅力,而Mod则是实现这一目的的工具.
我尽力将这篇教程写好,我会竭力让它通俗易懂,能够让更多的人明白MCMod的开发.如果有人将上面的前言看完的话,Vielen Dank.

-szszss
-2012.10.27 23:00
-听着"八云紫のタイムマシン" 写下了这篇肾疼的前言

开发环境准备
首先你要准备JDK(Java开发工具包)和一个代码编辑器,我习惯用Eclipse(曾经是最流行的Java代码编辑器,现在嘛...至少是最流行的免费代码编辑器.不过在IDEA推出免费的社区版之后,它或许连最流行的免费代码编辑器都不是了 ?)

最新版本的JDK应该是JDK8,虽然MC要求Java6,但高版本JDK可以编译出低版本的代码.因此在版本的选择上不用太在意.JDK可以在官网下载,网址是:
JDK8:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

B1-5
根据自己的操作系统来选择相应的版本,64位的Windows使用Windows x64版,32位Windows使用Windows x86版.

然后是准备一个Java编辑器,我使用的是Eclipse,这篇教程的代码也是在Eclipse下编写的,如果你喜欢的话,你也可以使用IDEA或NetBeans.现在很多人称IDEA很好用,但我总是不习惯IDEA的界面(感觉像是儿童玩具(笑) 不过JetBrain能用Swing搭出这种界面也不容易了).具体两者的对比可以上网搜一下,但不建议参考逼乎.

Eclipse可以在这里下载,网址是:http://www.eclipse.org/downloads/
最新版Eclipse是4.5版(代号Mars),同时Eclipse还分很多个定制版本,每个定制版本都预装了不同的插件,我因为个人需要所以使用的是"Eclipse for RCP and RAP Developers",你可以考虑"Eclipse IDE for Java Developers".同样每个版本又细分为64位版和32位版,根据你的操作系统来选择下载.这里下载来的是英文版,安装汉化的方法可以参照这个文章:http://www.cnblogs.com/yaotong/archive/2011/12/28/2305421.html.

IDEA可以从官网下载免费的社区版,开发MCMod足以了:https://www.jetbrains.com/idea/#chooseYourEdition

首先安装JDK,通常来说如果安装顺利的话程序会自动配置环境变量,否则你需要按照这个的步骤来自行配置环境变量
http://zhidao.baidu.com/question/351018707.html
http://www.cnblogs.com/kevinlocn/archive/2009/10/12/1581855.html

之后安装Eclipse或IDEA,Eclipse无需注册表或任何安装程序,直接将其解压到一个目录下就行了.IDEA则是通过安装包来安装.

然后便是MDK的安装.首先要说明什么是MCP和MDK,以及ForgeGradle、Forge和FML的区别.

MCP即Minecraft Coder Pack,它类似于其他软件的SDK(Software Development Kit,软件开发工具包),供开发者进行二次开发的源代码与工具包,那为什么MCP不直接叫MSDK(MC SDK)呢?因为MCP是个被官方默许的反向工程项目,Minecraft是个闭源的软件,而MCP的工作组则是将MC反编译并顺带反混淆(官方对源代码进行了混淆操作,将原本有意义的变量,方法,类名变成了无意义的文字,反混淆则是分析其功能并附上合理的名字),同时附上了一些有用的开发工具.MCP是Mod开发的基础,一定程度上说,没有MCP的话,MC也就没有如今的成就.
遗憾的是,MCP项目已经开始没落了...这个将会在下面的FML部分说到.

Forge则是MinecraftModAPI库,它实现了一些被大众所需的最基本的功能,最初Forge只是一个使用ModLoader(简称ML)的Mod,因为它依赖一些ML的功能,同时依赖ML的Mod加载功能.后来在某个版本中Forge实现了自己的Mod加载,于是摆脱了对ModLoader的依赖,并且与ModLoader开始不兼容...后来Forge搞出了个ForgeModLoader.

ForgeModLoader(简称FML)是ModLoader的替代品.尽管ForgeModLoader和Forge从来都是捆绑发布和运行的,但从代码的角度来看,两者其实是独立的,这一点你可以从FML和Forge的包结构中看出来.FML跟ModLoader相比有很多优点,首先它是开源的,这意味着任何人都可以对FML做出补充,这也是为什么FML的功能越来越丰富,而ModLoader则始终是只有那几样而已.FML的开发维护者也很多,除去两三位主力外,还有上百位开发者在或多或少贡献代码.更重要的是,如今FML已经掌起了MCMod界的大旗,毫不夸张的说,MC的最高版本不是由Mojang决定而是由FML决定...(就拿1.8来说,如果FML不更新的话,你会玩1.8吗?)如今MCP基本已经弃坑了,其发起人Searge已被Mojang招安...FML已经接替了MCP的任务,并且从1.7开始,FML使用了一种新的代码构建方式:ForgeGradle.

ForgeGradle是一个封装好的Gradle插件,它能够形式原本MCP的责任,反编译MC并准备开发环境.Gradle是一个构建工具,它比Ant(一个很基本的Java构建工具)要高级,但比Maven(一个很高大上的Java构建工具)要简化一些.虽然看上去低不成高不就,但它使用起来确实挺不错,首先它比Ant的构建功能要强,正好适合MCMod复杂的发布方式,其次它支持使用Maven的代码仓库,Maven制定了一套代码仓库标准,一个程序库发布后可以直接上传到在线的仓库中,使用者能直接从仓库下载需要的库,而无需自己手动寻找.最后,Gradle比Maven要简单很多,开发者不必花费大量的时间来学习.

不过,有很长一段时间Forge官方对Mod开发环境一直没有一个正式的称呼,直到MC1.8的晚期版本,Forge开发组才给Mod开发环境起了个正式名字:MDK(Mod Development Kit?)

我们为什么需要ModLoader和FML?最原始的Mod是直接修改游戏文件,这意味着如果两个Mod修改了同一个文件的话,就会发生可怕的冲♂突.ModLoader的出现一定程度上解决了这个问题,它封装了最基本的一些操作,这让大部分Mod无需修改MC原本的类就能实现各种功能.MCPModSystem(请为它点一支蜡烛,虽然没有人记得它,但它确实曾在这个世界上存在过),Spout和ForgeModLoader则将这一特性发扬光大.

(关于Forge,FML和FG的更多的故事,可以看这个帖子的5L)

开发环境的配置

首先我们要下载MDK,MDK的下载地址在这里

http://files.minecraftforge.net/

在某次网站改版之后,Forge下载站有了完善的界面,现在已经很直观地能看出如何选择要下载的版本.建议下载Recommended版(即稳定版,非稳定版有小概率遇到猎奇事件,例如某个非稳定版的Forge无法创建世界).如果没有Recommended,那再考虑Latest.由于我们是开发者,这里是点"Mdk"来下载开发工具.(如果是1.7或更早版本的话,是点"Src")

B1-1n
图:撰稿时Forge下载站1.9.4只有Latest版,当你看的时候应该已经有Recommended版了.

(提示:Forge的默认下载链接是到adfoc,它是让你先看5秒广告,然后才能点右上角的链接继续下载.如果你不喜欢看广告,或者在你那里adfoc被墙了的话,可以右键Mdk选复制链接(或者其他什么的,取决于你用的浏览器,如果是IE那就是"复制快捷方式"),然后粘贴到浏览器地址栏里,手动删掉前面的adfoc地址,只留下后半段真实下载位置)

将MDK的压缩包解压到一个文件夹,建议避免目录中带有非ASCII字符(比如汉字),也不推荐带有空格,我们先来视奸一下MDK中都有什么.

B1-2

除去txt文本和.gitignore,这里主要分为四部分:

  • Gradle的终端 - 用于在未安装Gradle的机器上部署Gradle,以及运行Gradle指令.由文件夹gradle和文件gradle与gradle.bat组成,后两者分别是Unix/OSX和Windows下的终端.
  • build.gradle - 构建文件,这个文件用来告诉Gradle如何部署和构建一个项目.
  • eclipse - 预置的Eclipse工作目录,由于Eclipse的配置文件包含了不少二进制数据,想就地生成比较困难,因此MDK提供了一个已经预置了一些配置的Eclipse工作目录,注意区分工作目录和项目.此外,在老版本(1.7和早期的1.8)中这还是存放调试时的游戏文件的地方,在新版中已经改到run目录了.
  • src - 源码目录,存放Mod的代码和资源文件,这个之后会详细介绍.

现在可以通过Gradle终端来着手配置环境了.打开命令窗口并切换到这个文件夹.
(Windows7及以上有个很方便的方式,就是按住Shift然后右键,就能选择直接在当前目录中打开命令窗口.这个是yuxuanchiadm教给我的...)

在控制台内输入:

gradlew.bat setupDecompWorkspace

(注:其实即使在Windows下,"gradlew.bat"也可以简写成"gradlew",CMD会自动执行gradlew.bat文件的.我这里是习惯了改不过来了?)
(再补充一条@HaozheJiang在评论中提到的Linux下的指令:"./gradlew setupDecompWorkspace",此外如果中途遇到权限不足的问题的话,可以尝试"chmod +777 gradlew")

然后回车执行...之后ForgeGradle就会自动下载和配置操作环境了,很方便吧...

gradlew1

(提示:其实我还习惯加上-i,来让控制台显示当前的进度,否则卡住了的话连卡在哪都不知道...)

如果你真以为方便那你就输了,你可能会在下载过程中遇到各种谜の卡死或下载不能,甚至会在gradle文件下载时就卡住,这和天朝的GFW有关.

如果你在下载Gradle(屏幕上显示"Downloading https://services.gradle.org/distributions/gradle-2.X-bin.zip")时卡住的话,可以手动编辑gradle/wrapper/gradle-wrapper.properties文件(但不建议用记事本,随便别的什么文本编辑器都可以,哪怕写字板都行),将:

distributionUrl=https\://services.gradle.org/distributions/gradle-X-bin.zip

改为:

distributionUrl=http://forgemavenmirror.sinaapp.com/gradle/gradle-X-bin.zip

其中X为具体的Gradle版本,比如2.7.

然而在配置ForgeGradle过程也经常会出现卡死,通常是发生在从网上下载代码库的时候,这就需要考虑使用ForgeGradle on Wall.

关于如何配置FGOW来加速有有篇专门的文章,不过我想各位应该不想在这上面花太多时间,因此这里直接讲最后配置的结果,还记得之前提到的build.gradle不?用文本编辑器将它打开,然后根据你使用的版本来修改它:

1.8.0


将'version = "1.0"'的前面的所有内容替换为:

buildscript {
    repositories {
        maven {
            name = "fmm"
            url = "http://forgemavenmirror.sinaapp.com/maven"
        }
    }
    dependencies {
	classpath 'net.minecraftforge.gradle:ForgeGradle:2.0-SNAPSHOT'
	classpath 'net.hakugyokurou.fgow:fgow:1.2.0'
    }
}

ext.mcpJsonUrl = "http://forgemavenmirror.sinaapp.com/versions.json"
ext.forgeJsonUrl = "http://forgemavenmirror.sinaapp.com/maven/net/minecraftforge/forge/json"
ext.skipFGVersionCheck = true

apply plugin: 'fgow'

repos {
	mcJsonUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.json"
	mcClientUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.jar";
	mcServerUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar";;
	assestIndexUrl = "http://bmclapi2.bangbang93.com/indexes/{ASSET_INDEX}.json";
	assestUrl = "http://bmclapi2.bangbang93.com/assets"
	mcpUrl = "http://forgemavenmirror.sinaapp.com/fernflower-fix-1.0.zip"
}

repositories {
	flatDir { name "local"; dirs "/" }
	maven {
		name = "fmm"
		url = "http://forgemavenmirror.sinaapp.com/maven"
	}
}

1.8.8/1.8.9/1.9


将'version = "1.0"'的前面的所有内容替换为:

buildscript {
    repositories {
        maven {
            name = "fmm"
            url = "http://forgemavenmirror.sinaapp.com/maven"
        }
    }
    dependencies {
	classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
	classpath 'net.hakugyokurou.fgow:fgow:1.2.2'
    }
}

ext.mcpJsonUrl = "http://forgemavenmirror.sinaapp.com/versions.json"
ext.forgeJsonUrl = "http://forgemavenmirror.sinaapp.com/maven/net/minecraftforge/forge/json"
ext.skipFGVersionCheck = true

apply plugin: 'fgow'

repos {
	mcJsonUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.json"
	mcClientUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.jar";
	mcServerUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar";;
	assestIndexUrl = "http://bmclapi2.bangbang93.com/indexes/{ASSET_INDEX}.json";
	assestUrl = "http://bmclapi2.bangbang93.com/assets"
	mcpUrl = "http://forgemavenmirror.sinaapp.com/fernflower-fix-1.0.zip"
}

repositories {
	flatDir { name "local"; dirs "/" }
	maven {
		name = "fmm"
		url = "http://forgemavenmirror.sinaapp.com/maven"
	}
}

1.9.4


将'version = "1.0"'的前面的所有内容替换为:

buildscript {
    repositories {
        maven {
            name = "fmm"
            url = "http://forgemavenmirror.sinaapp.com/maven"
        }
    }
    dependencies {
	classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
	classpath 'net.hakugyokurou.fgow:fgow:1.2.2'
    }
}

ext.mcpJsonUrl = "http://forgemavenmirror.sinaapp.com/versions.json"
ext.forgeJsonUrl = "http://forgemavenmirror.sinaapp.com/maven/net/minecraftforge/forge/json"
ext.skipFGVersionCheck = true

apply plugin: 'fgow'

repos {
	mcJsonUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.json"
	mcClientUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/{MC_VERSION}.jar";
	mcServerUrl = "http://bmclapi2.bangbang93.com/versions/{MC_VERSION}/minecraft_server.{MC_VERSION}.jar";;
	assestIndexUrl = "http://bmclapi2.bangbang93.com/indexes/{ASSET_INDEX}.json";
	assestUrl = "http://bmclapi2.bangbang93.com/assets"
	mcpUrl = "http://forgemavenmirror.sinaapp.com/fernflower-fix-1.0.zip"
}

repositories {
	flatDir { name "local"; dirs "/" }
	maven {
		name = "fmm"
		url = "http://forgemavenmirror.sinaapp.com/maven"
	}
}

选读:对上述代码的解释


哇,你还真是好奇心很强的类型啊,我喜欢?
之前已经提到了build.gradle是告诉Gradle如何部署和构建一个项目的,准确来说,它的学名是构建脚本,不同的软件构建系统有不同的脚本,比如构建C/C++的CMake有CMakeList,之前提到的Maven也有pom,Gradle则采用的是build.gradle,它的一个特点是其本身其实是一段可执行的Groovy程序.Groovy是一个类Java的脚本语言,有着十分灵活的语法,Gradle便选用它作为构建脚本的语言.
由于构建脚本本身就是可编程的,理论上所有的操作都可以放在脚本中进行,但有些重复性的操作可以被提取出来做成一个公用库,于是便有了Gradle插件,Gradle插件包含了一系列预置的操作,在脚本中可以通过apply plugin来载入一个插件.
不过有时候构建脚本会依赖一些第三方库来启动,于是便有了buildscript这个"用来构建'构建脚本'的脚本",buildscript用于描述构建脚本依赖的外部库和它们的下载源,比如MDK默认的buildscript是:

buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:2.X-SNAPSHOT'
    }
}

这个buildscript表示在构建脚本的准备阶段,需要在JFrog的中央仓库和Forge的仓库下载ForgeGradle的插件和它的依赖库.而前面我们修改的buildscript是:

buildscript {
    repositories {
        maven {
            name = "fmm"
            url = "http://forgemavenmirror.sinaapp.com/maven"
        }
    }
    dependencies {
	classpath 'net.minecraftforge.gradle:ForgeGradle:2.X-SNAPSHOT'
	classpath 'net.hakugyokurou.fgow:fgow:1.2.X'
    }
}

它指定了从FMM(Forge的非官方仓库镜像)下载ForgeGradle和FGOW和它们的依赖库.

再往后的代码就是配置FGOW的各种下载源了,在FGOW的下载页有详细的介绍,这里主要说明最后一段,最后一段你会发现又来了一个"repositories",而且在其下不远处还有个自带的"dependencies",那么这里的"repositories, dependencies"和buildscript中的"repositories, dependencies"有什么关系?

它们的差别是:这里的"repositories, dependencies"描述的是该项目的下载源和依赖的库,buildscript中的"repositories, dependencies"描述的是此脚本的下载源和依赖的库.比如如果我的项目额外使用了一种编译型语言,需要在构建时编译一遍,而运行时则不需要.显然只有构建脚本在启动时需要下载并加载该语言的编译器,而我的项目发布后便不再需要它了.因此要将项目和构建脚本的dependencies分开对待,至于你问为何repositories也要分开对待...

5e419da8acb1e0b9

 

整个安装过程需要"一段时间",最长可能多达一个小时,如果你采用了上文中FGOW加速下载的话,中途应该不会有卡死的情况,但如果你发现在某一处地方真的停顿了超过10分钟的话,果断Ctrl+C中断操作然后重来 ? Gradle卡死现象防不胜防,确实神烦.

对于Forge1.7.X/1.8.X,如果你在getVersionJson阶段遇到形如"xxx.json could not be parsed","FileNotFoundException: Inherited json file (null) not found"之类的错误的话,尝试将gradle.build中的
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
改成
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-20160209.170057-21'

当你安装结束后(我忘了截图了...总之如果你稍微懂一点英语的话,就能看出控制台明显地提示已经安装成功,而不是安装未完或失败.)就可以着手开始配置IDE了.

Eclipse自动配置

Gradle支持自动生成Eclipse项目,但愿你现在还没有关掉命令窗口(如果已经关掉了的话...就再打开吧),在命令窗口中执行:

gradlew.bat eclipse

然后等待其操作完成,然后运行Eclipse,首次运行时会让你选择工作目录,直接将工作目录设为MDK目录下的eclipse目录中.如果你已经运行过Eclipse,并且已经设置过工作目录的话,打开Eclipse,点开左上角菜单File,选择Switch Workspace.

gradlew8

然后将工作目录切换到你的MDK目录下的eclipse目录中.

gradlew9

于是便完了...没错,自动配置就是这么屌炸,连配置启动方案都省去了= =

Eclipse手动配置

有时因为各种各样的原因,我们不想切换工作目录,这时就只能将项目导入然后手动配置项目,第一步还是跟自动配置相同,.

在Eclipse中打开File - Import,选择Existing Projects into Workspace.

B1-3

然后在Select root directory中将目录设为MDK目录,注意是MDK目录而不是它下面的eclipse目录.

B1-4

之后点Finish就可以导入了.现在你还需要自己配置启动方案.右键你的项目,选择Properties.

gradlew10

然后选择Run/Debug Setting,点击New添加一个启动方案.

首先我们要创建一个客户端启动方案.名字就叫做Client吧.将主类(Main Class)选为GradleStart.

A1-2

然后打开Arguments页,将Working directory选为Other,内容填上:

${workspace_loc}

如果你需要设置用户名(用来显示皮肤)的话在Program Arguments中加入:

--username [用户名]

如果你有爱的话还可以在VM arguments里加入各种虚拟机优化参数

A1-3

于是你便配置完客户端的启动方案了.如果你需要的话还可以配置服务器的启动方案,服务器的启动方案设置和客户端的相似,不同之处在于:

MainClass为:

GradleStartServer

Eclipse的收尾工作

无论你是手动配置Eclipse,还是自动配置Eclipse,都还剩下最后一步需要进行 - 更改文件编码和JDK版本

依然是在Properties页中,将Resource项中的Text file encoding设为UTF-8.否则你的Mod中的中文显示出来的都是乱码的.(如果默认是UTF-8的话那再好不过)

gradlew14

然后检查Java Compiler项,将Compiler compliance level设为1.6 (已经是1.6?那更好)

gradlew15

IDEA配置

配置IDEA首先要编辑build.gradle,在其中加入(如果不知道该加在哪的话...就加在最后吧!):

idea { 
	module { 
		inheritOutputDirs = true 
	} 
}

然后在命令窗口中执行:

gradlew.bat idea genIntellijRuns

等它执行完毕后,打开IDEA,选Open,然后目录设为MDK目录.

B1-6

之后打开就行了,按Alt-1来显示项目目录.

最后还要在项目目录中选中Forge模块,按F4(或者右键模块,点Open Module Settings),在Project Settings - Project中,将Project Language Level改为6. (已经是6了?唔...也好)

无论你用的哪种IDE哪种配置方法,至此开发环境配置便完成了(\散花/) 快点击Eclipse上方的Run按键或IDEA的Run菜单来运行一下试试吧.然而如果你发现运行不了,或者项目中少了很多东西...那很有可能是配置时哪里出了问题,可以参考这篇文章:http://blog.hakugyokurou.net/?p=1298#gradleslow.

附录 - 更换Gradle本地库位置

Win7下,Gradle的本地库位于C:\Users\[用户名]\.gradle下. 在评论中@魏澎总结了一种更换本地库位置的办法:

将.gradlew复制到新位置后,在环境变量的系统变量里加个名称为GRADLE_USER_HOME的变量,值填新的目录位置,之后在Forge目录内打开CMD,执行gradlew.bat inti修复Gradle,然后执行gradlew.bat eclipse/idea重新生成Eclipse/Idea文件,然后在Eclipse/Idea里重新导入项目.