NetBeans中使用Gradle导出包含指定依赖的Jar文件配置方法
将指定依赖打包进Gradle构建Jar的操作方法
你当前的配置默认只会在编译阶段引用依赖,不会把implementation声明的依赖打入最终生成的Jar,按照以下步骤修改配置即可,适配NetBeans+Gradle的Spigot插件开发场景:
推荐方案:使用Shadow插件打包(稳定无冲突,MC插件开发通用方案)
Shadow是Gradle生态最常用的胖包打包插件,会自动处理依赖类文件、配置文件的合并,不会出现默认打包方式的资源冲突问题。
- 在
plugins块中添加Shadow插件声明:
plugins { id 'java' // 新增Shadow插件,7.1.2版本兼容Gradle 7.x环境,NetBeans可正常识别 id 'com.github.johnrengelman.shadow' version '7.1.2' }
- 在配置文件末尾添加Shadow任务配置,直接将包含依赖的包作为默认输出Jar,不需要额外识别带特殊后缀的包:
shadowJar { // 清空分类器,直接替换原普通Jar作为构建输出 archiveClassifier.set('') // 自动排除所有compileOnly声明的依赖(本地的spigot、ProtocolLib等服务端已提供的包都不会被打入,避免类冲突) configurations = [project.configurations.runtimeClasspath] } // 配置build任务自动执行shadowJar,点击NetBeans的构建按钮即可直接生成含依赖的Jar build.dependsOn shadowJar
- 完整修改后的
build.gradle参考:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' } group 'main.test' version '1.0.7' repositories { mavenCentral() maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } maven { url = 'https://repo.codemc.io/repository/maven-public/' } maven { url = 'https://mvnrepository.com/artifact/it.unimi.dsi/fastutil' } maven { url = "https://repo.dmulloy2.net/repository/public/" } maven { url = "https://hub.spigotmc.org/nexus/content/groups/public/" } } dependencies { implementation("org.spongepowered:configurate-hocon:4.1.2") compileOnly 'org.jetbrains:annotations:23.0.0' compileOnly 'me.clip:placeholderapi:2.11.1' compileOnly 'fr.xephi:authme:5.6.0-SNAPSHOT' compileOnly 'it.unimi.dsi:fastutil:8.5.8' compileOnly "com.comphenix.protocol:ProtocolLib:4.7.0"; compileOnly fileTree(dir: 'lib', include: 'spigot-1.8.8.jar') compileOnly fileTree(dir: 'lib', include: 'spigot-1.12.2.jar') compileOnly fileTree(dir: 'lib', include: 'spigot-1.16.5.jar') compileOnly fileTree(dir: 'lib', include: 'spigot-1.18.2-R0.1-SNAPSHOT.jar') } shadowJar { archiveClassifier.set('') configurations = [project.configurations.runtimeClasspath] } build.dependsOn shadowJar
- 在NetBeans中右键项目选择「重新加载Gradle项目」,之后正常执行构建操作,生成的Jar存放在
build/libs目录下,已经包含configurate-hocon及其关联的传递依赖,所有compileOnly声明的服务端依赖不会被打入,不会出现类冲突问题。
备选方案:不安装插件用原生Jar任务打包(不推荐,容易出现资源冲突)
如果不想额外安装插件,可以直接修改默认的jar任务,把依赖类拷贝进Jar,在配置末尾添加以下内容即可:
jar { from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // 处理重复文件,遇到重复直接覆盖,部分SPI配置文件可能丢失导致依赖运行报错 duplicatesStrategy = DuplicatesStrategy.INCLUDE }
注意:这种方式不会自动合并META-INF下的服务声明、配置文件,如果你引入的依赖有SPI加载逻辑,大概率会运行报错,优先选择Shadow方案。
内容的提问来源于stack exchange,提问作者Daniel Blasco
相关产品推荐
相关产品推荐

