У меня есть проект Java 8 с Java FX. Я недавно переключился на Java11 и OpenJFX11.
Все отлично работает с Gradle Run или с аргументами JVM. Но как только я создаю jar, исполняемый jar не будет выполняться из-за этой ошибки:
Ошибка: не удалось найти или загрузить основной класс sample.application.main.SampleAppLauncher
Причина: java.lang.NoClassDefFoundError: javafx / application / Application
buildscript {
dependencies {
classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.7.0'
classpath 'org.openjfx:javafx:11'
}
repositories {
mavenLocal()
mavenCentral()
}
}
plugins {
id 'java'
id 'java-library'
id 'maven-publish'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
sourceCompatibility = 11
targetCompatibility = 11
repositories {
jcenter()
mavenCentral()
}
task sourcesJar(type: Jar) {
from sourceSets.main.allJava
archiveClassifier.set("sources")
}
task javadocJar(type: Jar, dependsOn: javadoc) {
archiveClassifier.set("javadoc")
from javadoc.destinationDir
}
mainClassName="sample.application.main.Launcher"
publishing {
publications {
mavenAar(MavenPublication) {
from components.java
afterEvaluate {
artifact javadocJar
artifact sourcesJar
}
}
}
}
javafx {
version = "11"
modules = [ 'javafx.controls', 'javafx.fxml','javafx.graphics']
}
sourceSets {
main.java.srcDir "src/main/java"
main.resources.srcDir "src/main/resources"
}
dependencies {
api 'org.apache.commons:commons-math3:3.6.1'
implementation 'com.google.guava:guava:27.0.1-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.openjfx:javafx:11'
compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.28.0'
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
compile group: 'org.reflections', name: 'reflections', version: '0.9.11'
compile group: 'org.openjfx', name: 'javafx', version: '11'
}
jar {
manifest {
attributes(
'Main-Class': 'sample.application.main.Launcher'
)
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Нужно ли мне определять что-то еще для обычной Jar Build? Единственный способ, который я знаю сейчас, - это запустить приложение с аргументами JVM, указав путь к моему openjfx-11. Но это не будет работать на любой другой системе, которая не имеет JavaFX11.
Я думал, что он будет скомпилирован gradle, как любая другая зависимость в банку.
Есть ли что-то другое в JFX11?
РЕДАКТИРОВАТЬ:
Класс приложения:
public class SampleAppLauncher extends Application {
@Override
public void start(Stage stage) throws Exception {
\\... startup
}
}
Launcher:
public class Launcher {
public static void main(String[] args) {
SampleAppLauncher.launch(args);
}
}
Информация о модуле
module FXproject {
requires javafx.controls;
requires javafx.fxml;
requires transitive javafx.graphics;
opens sample.application.main to javafx.fxml;
exports sample.application.main;
}