Как создать jar JavaFX11 + с Gradle, без аргументов JVM? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть проект 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;
}

...