首先需要强调,这个教程不是给没有任何编程基础的人准备的...你至少要懂得最基础的编程知识和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
根据自己的操作系统来选择相应的版本,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")
图:撰稿时Forge下载站1.9.4只有Latest版,当你看的时候应该已经有Recommended版了.
(提示:Forge的默认下载链接是到adfoc,它是让你先看5秒广告,然后才能点右上角的链接继续下载.如果你不喜欢看广告,或者在你那里adfoc被墙了的话,可以右键Mdk选复制链接(或者其他什么的,取决于你用的浏览器,如果是IE那就是"复制快捷方式"),然后粘贴到浏览器地址栏里,手动删掉前面的adfoc地址,只留下后半段真实下载位置)
将MDK的压缩包解压到一个文件夹,建议避免目录中带有非ASCII字符(比如汉字),也不推荐带有空格,我们先来视奸一下MDK中都有什么.
除去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就会自动下载和配置操作环境了,很方便吧...
(提示:其实我还习惯加上-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也要分开对待...
整个安装过程需要"一段时间",最长可能多达一个小时,如果你采用了上文中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.
然后将工作目录切换到你的MDK目录下的eclipse目录中.
于是便完了...没错,自动配置就是这么屌炸,连配置启动方案都省去了= =
Eclipse手动配置
有时因为各种各样的原因,我们不想切换工作目录,这时就只能将项目导入然后手动配置项目,第一步还是跟自动配置相同,.
在Eclipse中打开File - Import,选择Existing Projects into Workspace.
然后在Select root directory中将目录设为MDK目录,注意是MDK目录而不是它下面的eclipse目录.
之后点Finish就可以导入了.现在你还需要自己配置启动方案.右键你的项目,选择Properties.
然后选择Run/Debug Setting,点击New添加一个启动方案.
首先我们要创建一个客户端启动方案.名字就叫做Client吧.将主类(Main Class)选为GradleStart.
然后打开Arguments页,将Working directory选为Other,内容填上:
${workspace_loc}
如果你需要设置用户名(用来显示皮肤)的话在Program Arguments中加入:
--username [用户名]
如果你有爱的话还可以在VM arguments里加入各种虚拟机优化参数
于是你便配置完客户端的启动方案了.如果你需要的话还可以配置服务器的启动方案,服务器的启动方案设置和客户端的相似,不同之处在于:
MainClass为:
GradleStartServer
Eclipse的收尾工作
无论你是手动配置Eclipse,还是自动配置Eclipse,都还剩下最后一步需要进行 - 更改文件编码和JDK版本
依然是在Properties页中,将Resource项中的Text file encoding设为UTF-8.否则你的Mod中的中文显示出来的都是乱码的.(如果默认是UTF-8的话那再好不过)
然后检查Java Compiler项,将Compiler compliance level设为1.6 (已经是1.6?那更好)
IDEA配置
配置IDEA首先要编辑build.gradle,在其中加入(如果不知道该加在哪的话...就加在最后吧!):
idea { module { inheritOutputDirs = true } }
然后在命令窗口中执行:
gradlew.bat idea genIntellijRuns
等它执行完毕后,打开IDEA,选Open,然后目录设为MDK目录.
之后打开就行了,按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里重新导入项目.
F:\forge>gradlew.bat setupDecompWorkspace
Download http://files.minecraftforge.net/maven/net/minecraftforge/gradle/ForgeGr
adle/1.2-SNAPSHOT/ForgeGradle-1.2-20150329.235405-283.jar
****************************
Powered By MCP:
http://mcp.ocean-labs.de/
Searge, ProfMobius, Fesh0r,
R4wk, ZeuX, IngisKahn, bspkrs
MCP Data version : unknown
****************************
:extractMcpData UP-TO-DATE
:getVersionJson
Connection timed out: connect
:extractUserDev UP-TO-DATE
:genSrgs SKIPPED
:extractNatives UP-TO-DATE
:getAssetsIndex
Connection timed out: connect
:getAssetsIndex FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':getAssetsIndex'.
> java.io.FileNotFoundException: C:\Users\Administrator\.gradle\caches\minecraft
\assets\indexes\1.7.10.json (系统找不到指定的文件。)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output.
BUILD FAILED
Total time: 3 mins 51.908 secs
它说找不到指定文件,求解决
你可以试试把你的“正常游戏目录\.minecraft\versions\相对应的版本\相对应的版本.json”文件复制到找不到文件的位置,再改名成它说找不到的文件的名称。
Pingback引用通告: 第二章—配置开发环境 | KSの彼方
请问为什么我启动加载报错啊!
[14:28:37] [Client thread/INFO] [FML]: Searching G:\mcWorkspace\mods for mods
[14:28:37] [Client thread/ERROR] [FML]: Unable to construct net.minecraftforge.fml.common.Mod container
java.lang.NullPointerException
at net.minecraftforge.fml.common.FMLModContainer.shouldLoadInEnvironment(FMLModContainer.java:619) ~[FMLModContainer.class:?]
at net.minecraftforge.fml.common.ModContainerFactory.build(ModContainerFactory.java:80) [ModContainerFactory.class:?]
at net.minecraftforge.fml.common.discovery.DirectoryDiscoverer.exploreFileSystem(DirectoryDiscoverer.java:116) [DirectoryDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.DirectoryDiscoverer.exploreFileSystem(DirectoryDiscoverer.java:89) [DirectoryDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.DirectoryDiscoverer.exploreFileSystem(DirectoryDiscoverer.java:89) [DirectoryDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.DirectoryDiscoverer.exploreFileSystem(DirectoryDiscoverer.java:89) [DirectoryDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.DirectoryDiscoverer.discover(DirectoryDiscoverer.java:53) [DirectoryDiscoverer.class:?]
at net.minecraftforge.fml.common.discovery.ContainerType.findMods(ContainerType.java:42) [ContainerType.class:?]
at net.minecraftforge.fml.common.discovery.ModCandidate.explore(ModCandidate.java:71) [ModCandidate.class:?]
at net.minecraftforge.fml.common.discovery.ModDiscoverer.identifyMods(ModDiscoverer.java:131) [ModDiscoverer.class:?]
at net.minecraftforge.fml.common.Loader.identifyMods(Loader.java:348) [Loader.class:?]
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:469) [Loader.class:?]
at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:208) [FMLClientHandler.class:?]
at net.minecraft.client.Minecraft.startGame(Minecraft.java:447) [Minecraft.class:?]
at net.minecraft.client.Minecraft.run(Minecraft.java:356) [Minecraft.class:?]
at net.minecraft.client.main.Main.main(Main.java:117) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_71]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_71]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_71]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_71]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.11.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.11.jar:?]
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source) [start/:?]
at GradleStart.main(Unknown Source) [start/:?]
[14:28:38] [Client thread/INFO] [FML]: Forge Mod Loader has identified 3 mods to load
forgeSrc.jar包我看了是有的, net.minecraftforge.fml.common.Mod 这个类也存在啊!
求解!
试试下个新版的Forge? (我查了一下Github上FML的历史,你遇到的那个NPE应该在2月22号的版本就修正了...你这是多老的版本啊 233)
1.
Description Resource Path Location Type
Project 'Minecraft' is missing required library: 'C:\Users\Administrator\Desktop\forge-1.7.10-10.13.2.1291-src\unresolved dependency - forgeBin 1.7.10-10.13.2.1291' Minecraft Build path Build Path Problem
-------------------------------------------------------------------------------------------------------------------------------
2.
Description Resource Path Location Type
Unknown Unknown Java Exception Breakpoint
Unknown Unknown Java Exception Breakpoint
-------------------------------------------------------------------------------------------------------------------------------
3.
Description Resource Path Location Type
The project cannot be built until build path errors are resolved Minecraft Unknown Java Problem
求解!!!
问一下现在过期了没...
过期教程害死猫
针对1.7.2/1.7.10的,1.8的没涉及到...
教程过期了啊喂,Gradle Integration for Eclipse都没有了
还有,我的ForgeSrc安装卡在"Configuring > 0/1 projects > root project > Resolving dependencies ':classpat"这里,该怎么办啊
Eclipse那帮人新整了个什么Buildship作为糟糕的"Gradle Integration for Eclipse"的替代品,但按我说那玩意更差劲...
如何提高Gradle速度可以参考新发的那篇文章
为什么运行gradlew.bat设置工作环境后他说环境变量不可用???
环境变量已经设置好了,可以正常编译java。。。
求解!!
Project 'Minecraft' is missing required library: 'C:\Users\Administrator\.gradle\caches\minecraft\net\minecraftforge\forge\1.7.10-10.13.4.1448-1.7.10\start'
Project 'Minecraft' is missing required library: 'D:\forge-1.7.10-10.13.4.1448-1.7.10-src\unresolved dependency - forgeBin 1.7.10-10.13.4.1448-1.7.10'
The project cannot be built until build path errors are resolved
Eclipse项目minecraft缺少必须的库,求解!!!
Eclipse(版本号:MARS)里面的Properties页面和教程不一样啊……里面只有Resource、Task Tags、Validation三个,而且Resource页也没有啥编码设置,只有上面四行,求解。
看上去你只把Workspace切换到了forge\eclipse下,而没有在gradle里执行eclipse任务...没有那步的话是不会有完整的java项目的.
话说Eclipse新出的MARS版本在“更改文件编码和JDK版本”这步不能进行,Properties里面Resource项只有上面三行,也没有Java Compiler项,退回LUNA版本才行…………
可是我现在用Mars就没问题啊 ;w; 那三行是所有Eclipse项目都有的,Java Compiler只有Java项目才有,换句话说你的Eclipse没识别出那是个Java项目,也许和你用的Eclipse的发行版有关?
build.gradle要加上
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
不然会以系统默认编码编译