随着 JDA 4.2.0 的新更新,VPS 上新构建的 JAR 文件返回 NoClassDefFoundError

Posted

技术标签:

【中文标题】随着 JDA 4.2.0 的新更新,VPS 上新构建的 JAR 文件返回 NoClassDefFoundError【英文标题】:With the new update of JDA 4.2.0 the new built JAR file on the VPS returns NoClassDefFoundError 【发布时间】:2020-12-05 03:32:40 【问题描述】:

随着JDA 4.2.0 的新更新,尝试在 VPS 上运行 jar 文件失败。 我尝试了各种选择,例如

creating a fat jar 搜索其他类似问题 source 1 source 2

但这些选项似乎都不起作用,因为 VPS 控制台输出保持不变:

Error: Could not find or load main class ...
Caused by: java.lang.NoClassDefFoundError: net/dv8tion/jda/api/hooks/ListenerAdapter

所以我现在的问题是,我的gradle.build 应该是什么样子,或者这是 VPS 没有正确刷新的问题?或者可能是另一个我不知道的问题。

至于我的gradle.build长什么样子:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'
    


apply plugin: 'java'
apply plugin: 'com.github.johnrengelman.shadow'

group '...'
version '2.0-SNAPSHOT'

repositories 
    mavenCentral()
    jcenter(
    )


dependencies 
    testCompile group: 'junit', name: 'junit', version: '4.+'
    compile 'net.dv8tion:JDA:4.2.0_168'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.20'
    compile group: 'javax.persistence', name: 'persistence-api', version: '1.0'
    compile 'com.vdurmont:emoji-java:5.1.1'


jar 
    manifest 
        attributes(
                'Main-Class': '...'
        )
    

注意:在1.0-SNAPSHOT 的上一个快照中,以下gradle.build 工作于启动项目:

plugins 
    id 'java'
    id 'application'


group '...'
version '1.0-SNAPSHOT'

repositories 
    mavenCentral()
    jcenter()


dependencies 
    testCompile group: 'junit', name: 'junit', version: '4.+'
    compile 'net.dv8tion:JDA:3.5.0_329'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.20'
    compile group: 'javax.persistence', name: 'persistence-api', version: '1.0'
    compile 'com.vdurmont:emoji-java:5.1.1'

【问题讨论】:

【参考方案1】:

您可以使用这个build.gradle 来构建一个工作影子罐子:

plugins 
  id 'application' // this allows you to set a mainClassName
  id 'com.github.johnrengelman.shadow' version '6.0.0' // this adds the shadowJar task


group '...'
version '2.0-SNAPSHOT'
mainClassName = 'your main class goes here' // this sets the main class property in your manifest automatically

repositories 
    jcenter() // jcenter is a superset of mavenCentral


dependencies 
    testCompile group: 'junit', name: 'junit', version: '4.+'
    compile 'net.dv8tion:JDA:4.2.0_191'
    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.20'
    compile group: 'javax.persistence', name: 'persistence-api', version: '1.0'
    compile 'com.vdurmont:emoji-java:5.1.1'

运行shadowJar gradle 任务来编译你的jar 文件。然后它将被放置在build/libs 中,格式为[name]-all.jar。不要忘记将 mainClassName 替换为您的主类的完全限定名称。

【讨论】:

您好 Minn,我尝试了您的方法,但我不完全理解“运行 shadowJar gradle 任务以编译您的 jar 文件”的意思。因为我不熟悉 shadowJar。 想通了,就像一个魅力! :D 感谢您的帮助!

以上是关于随着 JDA 4.2.0 的新更新,VPS 上新构建的 JAR 文件返回 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

敲黑板 | 云API网关3大功能上新啦!

苹果iOS上新!结果网友说:活成了安卓和WP的模样

薇美姿欲赴港敲钟,口腔护理上新战事即将开局

用户使用JDA进入公会时如何更新语音通道

如何修复此 JDA discord bot 错误?

将 Cyber​​Panel 的所有内容迁移到不同 VPS 上的新 Cyber​​Panel