gpt4 book ai didi

java - java.lang.NoClassDefFoundError:在Intellij Idea中构建jar时,io/reactivex/subjects/Subject(gradle + JavaFX 11)

转载 作者:行者123 更新时间:2023-12-03 03:11:52 26 4
gpt4 key购买 nike

我正在使用JavaFX 11(OpenFX)运行一些应用程序。该应用程序是用IntellijIdea编写的,并使用gradle构建。在IDE中运行时,一切正常。构建jar时,它构建成功,但是当我尝试执行它时,出现错误:

Exception in thread "main" java.lang.NoClassDefFoundError: io/reactivex/subjects/Subject

要构建一个jar,我使用onslip.gradle-one-jar插件。我的成绩如下:
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.5'
id 'com.github.onslip.gradle-one-jar' version '1.0.5'
}

repositories {
mavenCentral()
}

dependencies {
implementation "org.openjfx:javafx-base:11:win"
implementation "org.openjfx:javafx-graphics:11:win"
implementation "org.openjfx:javafx-controls:11:win"
implementation "org.openjfx:javafx-fxml:11:win"
implementation 'com.jfoenix:jfoenix:9.0.8'
implementation group: 'commons-validator', name: 'commons-validator', version: '1.6'
implementation group: 'commons-io', name: 'commons-io', version: '2.6'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
implementation group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2'
implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.5'
testImplementation group: 'junit', name: 'junit', version: '4.12'
}

javafx {
modules = [ 'javafx.controls', 'javafx.fxml' ]
}

mainClassName = 'jetliner.Main'

jar {
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
manifest {
attributes 'Main-Class': 'jetliner.Main'
}
}

task awesomeFunJar(type: OneJar) {
mainClass = 'jetliner.Main'
}

对于 jar 构建,我运行awesomeFunJar任务。

最佳答案

您构建中的主要问题与如何使用implementation定义依赖关系(不再是compile)有关,而另一方面,您是基于configurations.compile来构建jar的。

由于implementationcompile不相同,因此configurations.compile仅包含项目的类,而不包含第三方依赖项(包括JavaFX)。

运行构建任务将生成一个非常小的3 KB的胖子。显然,此jar会丢失依赖项中的所有类。

解决方案

将jar任务configurations.compile替换为configurations.compileClasspath:

jar {
from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
manifest {
attributes 'Main-Class': 'jetliner.Main'
}
}

运行 ./gradlew build生成一个胖子jar(具有给定的依赖项,大约23 MB),可以通过以下方式运行:
java -jar build/libs/myproject.jar

或运行 ./gradlew awesomeFunJar生成类似的胖 jar (21 MB),该胖 jar 运行:
java -jar build/libs/myproject-standalone.jar

在这两种情况下,都包括 io.reactivex.rxjava2依赖性。

注1 :我以前没有使用过gradle-one-jar插件,并且在使用自定义加载程序时没有看到任何主要优势,我所看到的是,对于helloFX示例而言,加载它的时间确实太长了与普通的脂肪 jar 比较。

如果您因为胖子jar无法运行而使用它,则可能需要 Launcher类,如 here所述:
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}

然后用 jetliner.Launcher替换mainClass。

注2 :JavaFX插件(最新版本0.0.7)使用 implementation,它负责添加JavaFX依赖项,因此您可以简化构建文件:
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.7'
id 'com.github.onslip.gradle-one-jar' version '1.0.5'
}

repositories {
jcenter()
}

dependencies {
implementation 'com.jfoenix:jfoenix:9.0.8'
implementation group: 'commons-validator', name: 'commons-validator', version: '1.6'
implementation group: 'commons-io', name: 'commons-io', version: '2.6'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
implementation group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2'
implementation group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.2.5'
testImplementation group: 'junit', name: 'junit', version: '4.12'
}

javafx {
modules = [ 'javafx.controls', 'javafx.fxml' ]
}

mainClassName = 'jetliner.Launcher'

jar {
manifest {
attributes 'Main-Class': 'jetliner.Launcher'
}
from {
configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}

task awesomeFunJar(type: OneJar) {
mainClass = 'jetliner.Main'
}

关于java - java.lang.NoClassDefFoundError:在Intellij Idea中构建jar时,io/reactivex/subjects/Subject(gradle + JavaFX 11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com