我正在使用JavaFX 11 (OpenFX)运行一些应用程序。这个应用程序是用IntellijIdea编写的,是用gradle构建的。在IDE中运行时,一切都很好。当构建jar时,它成功地构建了,但是当我试图执行它时,我得到了一个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: io/reactivex/subjects/Subject要构建一个罐子,我使用onslp.gradle-一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任务。
发布于 2019-01-22 18:50:14
您在构建中遇到的主要问题是如何使用implementation (不再是compile )定义依赖项,而另一方面,您是基于configurations.compile构建jar的。
由于implementation和compile不一样,所以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以生成一个fat jar (具有给定依赖项的大约23 MB ),可以使用以下方式运行该jar:
java -jar build/libs/myproject.jar或者运行./gradlew awesomeFunJar来生成类似的胖jar (21 MB),它运行于:
java -jar build/libs/myproject-standalone.jar在这两种情况下,都包括io.reactivex.rxjava2依赖项。
备注1:我以前没有使用过这个一级jar插件,我也没有看到使用自定义加载器的任何主要优势,我所看到的只是helloFX示例与普通的fat jar相比加载起来真的太长了。
如果您使用它是因为胖jar没有运行,那么您可能需要一个Launcher类,就像here解释的那样
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}然后将mainClass替换为jetliner.Launcher。
Note 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'
}https://stackoverflow.com/questions/54307903
复制相似问题