• 游客, 欢迎您来到九域资源社区,如果您是新人,请前往 论坛公告 板块查看新人引导教程 或者 点我打开
    如果您发现没有下载许可, 请先验证邮箱再进行下载;金锭可通过每日登陆或资源出售获取,目前没有其他渠道可获取。

用(1.12.2/1.16.5)Forge开发插件(实现一个文件多个版本)

FullIdle

Lv.1 泥土
高级创作者
2023-04-08
181
35
0
钻石
0.00 钻石
金锭
19,211 金锭
很多人开发过程的调用了ForgeApi的插件,1.12.2和1.16.5就算用了多模块进行开发也是每个版本各一个插件
没办法实现那种一个插件直接兼容两个版本的服务端,下面就是教大家整一个能实现一个插件多个版本的服务
端均可试用的forge插件(或许你已经有方法了,不过应该不在开发上有很多不便的地方吧~)

操作过程只需要有一个能多版本forge开发的gradle项目 -- 前往白老板的教程
理论是直接用父项目用 compileOnly project(path: '子模块名')来导入子模块做父项目依赖
不够这样构建的时候就必须给父项目配置对版本的forge依赖,由于子模块有2个不同版本的
forge依赖,所以这个方法不现实.其他的比较偏的方法虽然可以导入子模块的类做依赖,构建
也能构建可是开发过程中修改了代码后多半都需要让子模块构建一次,这样很是麻烦,而上面
说的导入依赖的方法却能实现实时更新,且构建上也会按照需要的情况下去自动构建子模块
以下主要就是解决这个问题


正式开始:
一、导入依赖
按理说按照白老板的教程的话会有v12 v16 common3个子模块,而插件主类在v12 和 v16
父项目则几乎没有什么需要的内容
而按照我的来的话则主类代码都在父项目中,v12 v16用来些对应版本的一些调用处理,common的有着所有子模块和项目能用的代码

修改父项目build.gradle:
将父项目中的dependencies{}块改成这样

代码:
dependencies {
implementation project(path: ':common') #common内不需要forge所以直接用这种导入就好
implementation project(':v1_12_2').sourceSets.main.output #导入输出的class的这个主要是在用于构建的时候所需(与下面的配置一起)
implementation project(':v1_16_5').sourceSets.main.output

compileOnly fileTree(dir: 'v1_12_2/src/main/java', include: '**/*.java') #导入子模块中的java文件做依赖(实现开发过程中修改了子模块后父项目中引用的时候实时更新\配合上面一起)
compileOnly fileTree(dir: 'v1_16_5/src/main/java', include: '**/*.java')
}
这样的写就能实现类似导入project的效果了,上部分是在构建的时候用的(因为如果只用下部分导入的话构建过程中会提示找不到类)
下部分用来实现实时更新,这样就不需要在写代码的时候给子模块内代码添加代码块后需要手动构建一次了(只写上部分的话,如果你不构建子模块就不能用)


二、控制打包结果
如果你对shadowJar更加熟悉就自己配置把
以下是直接使用jar块将需要的内容打包到jar内
给父项目的build.gradle内添加jar{}块的代码(位置随意):

代码:
jar {
    from project(':v1_12_2').sourceSets.main.output
    from project(':v1_12_2').sourceSets.main.resources
    from project(':common').sourceSets.main.output
    from project(':common').sourceSets.main.resources
    from project(':v1_16_5').sourceSets.main.output
    from project(':v1_16_5').sourceSets.main.resources
}

这段只是将子模块所有构建出来的东西一起打包了而已

三、构建顺序配置
如果父项目在子模块前构建可能会导致一些报错,不过可以确定的是绝对没办法将子模块构建出来的内容打包走
所以还需要添加一些点点内(随意加在如何位置(代码块内除外)):

代码:
project(":v1_12_2").evaluationDependsOnChildren()
project(":v1_16_5").evaluationDependsOnChildren()
compileJava.dependsOn(':v1_12_2:build', ':v1_16_5:build')
第一第二条是用来让父项目的配置被评估之前评估(简单理解就是线去处理子模块的配置(效果:你在forge开发中构建的时候就会出现对应版本的mcp什么的内容,这些内容会出现在父项目开始构建之前))
最后一条是确保父项目构建之前就构建好子模块(其实加了这条后上面两条就不需要了的)

最后你就可以愉快的在父项目中进行插件的开发了,记得导入spigot/bukkit依赖.
构建的时候直接build就完事了。注意区分代码


一个用了这种方式所插件项目:

其他:
有更好的处理可以评论分享
 
楼主帖子配色感人,阅读不多,但看了下楼主的项目 https://github.com/FullIdle/PokeHatchTip

个人拙见,子模块的是为了更方便维护、解耦和提高内聚等,而楼主的项目拆分子模块又在主项目下引用到子模块内的全限定类名,当子模块多起来时,这种方式会使维护成本提高,并且使得项目耦合更高。

1701525240595.png

个人认为可以通过反射或SPI(Service Provider Interface)去加载,经过我以往测试的经验,部分核心使用 SPI 会出现一些问题。
 
楼主帖子配色感人,阅读不多,但看了下楼主的项目 https://github.com/FullIdle/PokeHatchTip

个人拙见,子模块的是为了更方便维护、解耦和提高内聚等,而楼主的项目拆分子模块又在主项目下引用到子模块内的全限定类名,当子模块多起来时,这种方式会使维护成本提高,并且使得项目耦合更高。

浏览附件7418

个人认为可以通过反射或SPI(Service Provider Interface)去加载,经过我以往测试的经验,部分核心使用 SPI 会出现一些问题。
斯。。。
我不管,反正我主要代码放子模块,主项目就一个类.我自己问题不如,哈哈哈哈哈