首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.NoClassDefFoundError: io/reactivex/Subject/Subject在Intellij中构建jar (gradle + JavaFX 11)

java.lang.NoClassDefFoundError: io/reactivex/Subject/Subject在Intellij中构建jar (gradle + JavaFX 11)
EN

Stack Overflow用户
提问于 2019-01-22 12:01:26
回答 1查看 912关注 0票数 2

我正在使用JavaFX 11 (OpenFX)运行一些应用程序。这个应用程序是用IntellijIdea编写的,是用gradle构建的。在IDE中运行时,一切都很好。当构建jar时,它成功地构建了,但是当我试图执行它时,我得到了一个错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.NoClassDefFoundError: io/reactivex/subjects/Subject

要构建一个罐子,我使用onslp.gradle-一jar插件。我的等级如下:

代码语言:javascript
复制
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任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-22 18:50:14

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

由于implementationcompile不一样,所以configurations.compile只包含项目的类,而不包含第三方依赖项(包括JavaFX)。

运行构建任务将生成一个很小的3 KB的胖罐子。显然,这个jar忽略了依赖项中的所有类。

溶液

在jar任务configurations.compile中用configurations.compileClasspath替换

代码语言:javascript
复制
jar {
    from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
    manifest {
        attributes 'Main-Class': 'jetliner.Main'
    }
}

运行./gradlew build以生成一个fat jar (具有给定依赖项的大约23 MB ),可以使用以下方式运行该jar:

代码语言:javascript
复制
java -jar build/libs/myproject.jar

或者运行./gradlew awesomeFunJar来生成类似的胖jar (21 MB),它运行于:

代码语言:javascript
复制
java -jar build/libs/myproject-standalone.jar

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

备注1:我以前没有使用过这个一级jar插件,我也没有看到使用自定义加载器的任何主要优势,我所看到的只是helloFX示例与普通的fat jar相比加载起来真的太长了。

如果您使用它是因为胖jar没有运行,那么您可能需要一个Launcher类,就像here解释的那样

代码语言:javascript
复制
public class Launcher {
    public static void main(String[] args) {
        Main.main(args);
    }
}

然后将mainClass替换为jetliner.Launcher

Note 2:JavaFX插件(最新版本0.0.7)使用implementation,它负责添加JavaFX依赖项,以便简化构建文件:

代码语言:javascript
复制
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'
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54307903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档