TabooLib/taboolib

Velocity平台无法启动

Closed this issue · 21 comments

latest.log

以上为错误日志
插件主类

import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.common.platform.Plugin
import taboolib.common.platform.function.releaseResourceFile
import top.frankhan.missingbyriver.fastlib.core.Core
import top.frankhan.missingbyriver.fastlib.velocity.database.RedisMessageEvent

@PlatformSide(Platform.VELOCITY)
object FastLib : Plugin() {
    override fun onLoad() {
        Core.redisDB.setCallEvent { server, value ->
            RedisMessageEvent(server, value).call()
        }
    }

    override fun onDisable() {
        Core.redisDB.disable()
        Core.mongoDB.disable()
    }

    fun reload() {
        releaseResourceFile("database.yml",false)
        Core.redisDB.reload()
        Core.mongoDB.reload()
    }
}

编译后包内并无taboolib.common.platform.Plugin
但Bukkit平台也是如此且可以运行,并且在启动过程中没有下载依赖库

latest.log

以上为错误日志 插件主类

import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.common.platform.Plugin
import taboolib.common.platform.function.releaseResourceFile
import top.frankhan.missingbyriver.fastlib.core.Core
import top.frankhan.missingbyriver.fastlib.velocity.database.RedisMessageEvent

@PlatformSide(Platform.VELOCITY)
object FastLib : Plugin() {
    override fun onLoad() {
        Core.redisDB.setCallEvent { server, value ->
            RedisMessageEvent(server, value).call()
        }
    }

    override fun onDisable() {
        Core.redisDB.disable()
        Core.mongoDB.disable()
    }

    fun reload() {
        releaseResourceFile("database.yml",false)
        Core.redisDB.reload()
        Core.mongoDB.reload()
    }
}

编译后包内并无taboolib.common.platform.Plugin 但Bukkit平台也是如此且可以运行,并且在启动过程中没有下载依赖库

发一下build.gradle.kts

用的多模块SDK
plugins-velocity(用于打包的)

@file:Suppress("PropertyName", "SpellCheckingInspection")

taboolib {
    description {
        name(rootProject.name)
    }
}
tasks {
    jar {
        // 构件名
        archiveFileName.set("${rootProject.name}-${archiveFileName.get().substringAfter('-')}")
        // 打包子项目源代码
        rootProject.subprojects.forEach {
            if(it.name.contains("core") || it.name.contains("velocity")) {
                from(it.sourceSets["main"].output)
            }
        }
    }
    sourcesJar {
        // 构件名
        archiveFileName.set("${rootProject.name}-${archiveFileName.get().substringAfter('-')}")
        // 打包子项目源代码
        rootProject.subprojects.forEach {
            if(it.name.contains("core") || it.name.contains("velocity")) {
                from(it.sourceSets["main"].allSource)
            }
        }
    }
}

project:common

dependencies {
    compileOnly("net.kyori:adventure-text-minimessage:4.15.0")
    compileOnly("com.google.code.gson:gson:2.10.1")
    compileOnly("org.mongodb:mongodb-driver-sync:4.11.1")
    compileOnly("redis.clients:jedis:5.1.0")
}

// 子模块
taboolib { subproject = true }

gradle.buildFinished {
    buildDir.deleteRecursively()
}

project:runtime-velocity

dependencies {
    compileOnly(project(":project:core"))
    compileOnly("com.velocitypowered:velocity-api:3.3.0-SNAPSHOT")
    compileOnly("net.kyori:adventure-text-minimessage:4.15.0")
    annotationProcessor("com.velocitypowered:velocity-api:3.3.0-SNAPSHOT")
}

// 子模块
taboolib { subproject = true }
gradle.buildFinished {
    buildDir.deleteRecursively()
}

root project

@file:Suppress("PropertyName", "SpellCheckingInspection")

import io.izzel.taboolib.gradle.*
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    java
    `maven-publish`
    id("io.izzel.taboolib") version "2.0.2"
    id("org.jetbrains.kotlin.jvm") version "1.8.22"
}

subprojects {
    if (this.name != "temp-velocity") {
        apply(plugin = "java-library")
        apply(plugin = "maven-publish")
        apply(plugin = "org.jetbrains.kotlin.jvm")
        if (!this.name.startsWith("api-")) {
            apply(plugin = "io.izzel.taboolib")
            taboolib {
                env {
                    repoTabooLib = "http://frankhan.top:8081/repository/maven-releases"
                    if (this@subprojects.name.endsWith("-velocity")) {
                        install(VELOCITY)
                    }else if (this@subprojects.name.endsWith("-bukkit")) {
                        install(BUKKIT_ALL, EXPANSION_PLAYER_FAKE_OP, AI, CONFIGURATION, EFFECT, KETHER, NAVIGATION, NMS, NMS_UTIL, EXPANSION_COMMAND_HELPER)
                    }else {
                        install(CONFIGURATION)
                    }
                }
                version { taboolib = project.property("taboolibVersion") as String }
            }
        }
    }

    // 全局仓库
    repositories {
        maven("http://example.com:8081/repository/maven-releases/") {
            isAllowInsecureProtocol = true
        }
        maven("http://ptms.ink:8081/repository/releases") {
            isAllowInsecureProtocol = true
        }
        mavenCentral()
        maven("https://repo.papermc.io/repository/maven-public/")
        maven("https://repo.dmulloy2.net/repository/public/")
        maven("https://repo.oraxen.com/releases")
        maven("https://repo.mineinabyss.com/releases")
        maven("https://hub.jeff-media.com/nexus/repository/jeff-media-public/")
        maven("https://repo.triumphteam.dev/snapshots")
    }
    // 全局依赖
    dependencies {
        compileOnly(kotlin("stdlib"))
    }

    // 编译配置
    java {
        withSourcesJar()
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    tasks.withType<JavaCompile> {
        options.encoding = "UTF-8"
    }
    tasks.withType<KotlinCompile> {
        kotlinOptions {
            jvmTarget = "17"
            freeCompilerArgs = listOf("-Xjvm-default=all", "-Xextended-compiler-checks")
        }
    }
}

gradle.buildFinished {
    buildDir.deleteRecursively()
}
subprojects
    .filter { it.name.startsWith("plugin") || it.name == "core" }
    .forEach { proj ->
        proj.publishing { applyToSub(proj) }
    }

fun PublishingExtension.applyToSub(subProject: Project) {
    repositories {
        maven("http://example.com:8081/repository/maven-releases/") {
            isAllowInsecureProtocol = true
            credentials {
                username = "user"
                password = "password"
            }
            authentication {
                create<BasicAuthentication>("basic")
            }
        }
    }
    publications {
        repositories {
            maven("http://example.com:8081/repository/maven-releases/") {
                isAllowInsecureProtocol = true
            }
        }
        create<MavenPublication>("maven") {
            artifactId = subProject.name
            groupId = "top.frankhan.custom.fastlib"
            version = "${project.version}"
            artifact(subProject.tasks["jar"])
            println("> Apply \"$groupId:$artifactId:$version\"")
        }
    }
}

@FrankHan052176 尝试删除Velocity服务端目录下libs文件夹内的TabooLib common模块缓存,重启服务端重新下载

@FrankHan052176 尝试删除Velocity服务端目录下libs文件夹内的TabooLib common模块缓存,重启服务端重新下载

事实上,并没有创建libs文件夹,大悲
image

@FrankHan052176

  • 刷新本地缓存:例如 SDK 的 refreshDependencies 任务
  • 刷新服务端缓存:/libraries/io/izzel/taboolib/common-env 及 /cache/taboolib

@FrankHan052176

  • 刷新本地缓存:例如 SDK 的 refreshDependencies 任务
  • 刷新服务端缓存:/libraries/io/izzel/taboolib/common-env 及 /cache/taboolib

同样的错误,我执行了refreshDependencies任务,且服务端的根目录并无libraries文件夹以及cache文件夹
且无论是我自己修改的taboolib版本还是原版taboolib,在编译完成后包内都没有common-env的文件,且服务端启动时并不会下载依赖库

@FrankHan052176

  • 刷新本地缓存:例如 SDK 的 refreshDependencies 任务
  • 刷新服务端缓存:/libraries/io/izzel/taboolib/common-env 及 /cache/taboolib

同样的错误,我执行了refreshDependencies任务,且服务端的根目录并无libraries文件夹以及cache文件夹 且无论是我自己修改的taboolib版本还是原版taboolib,在编译完成后包内都没有common-env的文件,且服务端启动时并不会下载依赖库

编译后jar包内没有common-env是正常的,因为6.1为了缩小jar包体积把common-env改成动态下载了,问题是为什么没有下载(

@FrankHan052176

  • 刷新本地缓存:例如 SDK 的 refreshDependencies 任务
  • 刷新服务端缓存:/libraries/io/izzel/taboolib/common-env 及 /cache/taboolib

同样的错误,我执行了refreshDependencies任务,且服务端的根目录并无libraries文件夹以及cache文件夹 且无论是我自己修改的taboolib版本还是原版taboolib,在编译完成后包内都没有common-env的文件,且服务端启动时并不会下载依赖库

编译后jar包内没有common-env是正常的,因为6.1为了缩小jar包体积把common-env改成动态下载了,问题是为什么没有下载(

对啊,无法理解,启动后不会自动下载

@Sunshine-wzy 使用SDK样例仅将build.gradle.kts修改为下面这样,依旧无法加载

import io.izzel.taboolib.gradle.*
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    java
    id("io.izzel.taboolib") version "2.0.2"
    id("org.jetbrains.kotlin.jvm") version "1.8.22"
}

taboolib {
    env {
        // 安装模块
        install(VELOCITY)
    }
    version { taboolib = "6.1.0" }
}

repositories {
    mavenCentral()
}

dependencies {
    compileOnly(kotlin("stdlib"))
    compileOnly(fileTree("libs"))
}

tasks.withType<JavaCompile> {
    options.encoding = "UTF-8"
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        jvmTarget = "1.8"
        freeCompilerArgs = listOf("-Xjvm-default=all")
    }
}

configure<JavaPluginConvention> {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

@FrankHan052176 理解了,因为Velocity会对插件主类进行依赖注入,用com.google.inject.Guice扫描主类的每个字段和方法,触发了taboolib.common.platform.Plugin类的加载,而这时Plugin类作为common-platform-api模块的一部分还没有被下载,导致NoClassDefFoundError,插件加载中断。但是Bukkit并不会对插件主类进行依赖注入,因此TabooLib在Bukkit下可以正常加载而Velocity不行。修复等 @Bkm016

@FrankHan052176 理解了,因为Velocity会对插件主类进行依赖注入,用com.google.inject.Guice扫描主类的每个字段和方法,触发了taboolib.common.platform.Plugin类的加载,而这时Plugin类作为common-platform-api模块的一部分还没有被下载,导致NoClassDefFoundError,插件加载中断。但是Bukkit并不会对插件主类进行依赖注入,因此TabooLib在Bukkit下可以正常加载而Velocity不行。修复等 @Bkm016

好的,感谢

(我当然知道是因为guava

at我爹就是想看看我爹有什么办法 @Sunshine-wzy

我其实不是很懂这个库,该怎么支持他呢

@Bkm016 把taboolib.common.platform.Plugin从common-platform-api模块移到common模块用java重写或者直接用kt应该也没问题,我看编译出来的字节码没有调用kt的什么东西,应该是可以直接加载的
image

偶买噶,我突然理解了,他扫了VelocityPlugin,扫到了这个:
image

我以为他是扫所有类

马上让他滚进common

马上让他滚进common

坏老,有无commit🥺

已重新发布 common 模块,刷新本地缓存重新编译