Проблема может быть легко воспроизведена с кодом, который вы отправили.
Я могу подтвердить, что это связано с плагином javafx-gradle-plugin, который, в свою очередь, использует плагин java9-modularity. Проблема уже была подана здесь некоторое время назад, и, вероятно, она связана.
В основном проблема заключается в том, что с этим плагином все зависимости добавляются в путь модуля, и ни одна из них не добавляется в путь к классам.
Почему работает IDE?
Когда вы «запускаете из IDE», я предполагаю, что вы запускаете задачу run
:
./gradle run
И это прекрасно работает. Если вы делаете:
./gradle --info run
напечатает командную строку. Что-то вроде:
/Users/<user>/Downloads/jdk-11.0.1.jdk/Contents/Home/bin/java \
--add-modules javafx.controls,javafx.fxml \
--module-path /path/to/your-project/build/classes/java/main: \
/path/to/your-project/build/resources/main: \
/Users/<user>/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core/5.4.0.Final/70...2b/hibernate-core-5.4.0.Final.jar: \
...
/Users/<user>/.gradle/caches/modules-2/files-2.1/com.sun.xml.fastinfoset/FastInfoset/1.2.15/bb..e8/FastInfoset-1.2.15.jar \
-Dfile.encoding=UTF-8 -Duser.variant \
-cp /path/to/your-project/build/classes/java/main: \
/path/to/your-project/build/resources/main: \
/Users/<user>/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core/5.4.0.Final/70...2b/hibernate-core-5.4.0.Final.jar: \
...
/Users/<user>/.gradle/caches/modules-2/files-2.1/com.sun.xml.fastinfoset/FastInfoset/1.2.15/bb..e8/FastInfoset-1.2.15.jar \
de.testing.Main
Запуск с build/install/your-project/lib
Таким образом, вы можете попытаться запустить вручную из папки lib, полученной из задачи installDist
, со всеми банками. С терминала:
./gradlew installDist
cd build/install/your-project/lib
/Users/<user>/Downloads/jdk-11.0.1.jdk/Contents/Home/bin/java \
--add-modules javafx.controls,javafx.fxml \
--module-path . \
-cp '*' \
de.testing.Main
Это должно сработать.
Проблема
Так почему запуск сценария не удался?
Если вы редактируете скрипт:
cd build/install/your-project/bin
nano your-project
Вы можете проверить, что строка:
...
esac
CLASSPATH=
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
...
содержит пустой путь к классам. И если вы видите окончательные варианты:
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $YOUR-PROJECT_OPTS -classpath "\"$CLASSPATH\"" de.testing.Main "$APP_ARGS"
это означает, что окончательная командная строка будет выглядеть примерно так:
/Users/<user>/Downloads/jdk-11.0.1.jdk/Contents/Home/bin/java \
--add-modules javafx.controls,javafx.fxml \
--module-path . \
-classpath \ // <--- Nothing is added here!
de.testing.Main
Это на самом деле начинается, потому что все jar-файлы были добавлены в путь к модулю. Но происходит сбой с опубликованным исключением, поскольку путь к классу пуст.
Возможные исправления
Ручное исправление
Одним из возможных исправлений является редактирование скрипта после запуска задачи installDist
и добавления пути к классам, например:
CLASSPATH="../lib/*"
Сохраните скрипт и запустите:
cd build/install/your-project/bin
./your-project
Это должно сработать.
Изменить installDist
Задание
Очевидно, что вы не будете делать это вручную, поэтому вот исправление для задачи startScripts
, которое вы можете добавить в свой файл build.gradle:
tasks.startScripts {
doLast {
def scriptFile = file "$ {outputDir} / $ {applicationName}"
scriptFile.text = scriptFile.text.replace ('CLASSPATH =', 'CLASSPATH = \' $ APP_HOME / lib / * \ '')
}
}
Удалить плагин
Другое возможное решение - удалить плагин и использовать старый подход:
dependencies {
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.0.Final'
compile group: 'com.h2database', name: 'h2', version: '1.4.197'
compile "org.openjfx:javafx-base:11.0.1:mac"
compile "org.openjfx:javafx-controls:11.0.1:mac"
compile "org.openjfx:javafx-graphics:11.0.1:mac"
compile "org.openjfx:javafx-fxml:11.0.1:mac"
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
После запуска задачи installDist
вы можете убедиться, что скрипт содержит полный путь к классу:
CLASSPATH=$APP_HOME/lib/your-project.jar:$APP_HOME/lib/hibernate-core-5.4.0.Final.jar:...:$APP_HOME/lib/FastInfoset-1.2.15.jar
Shadow Jar
Другое решение, сохраняющее плагин, но создающее теневую банку:
jar {
manifest {
attributes 'Main-Class': 'de.testing.Launcher'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
где Launcher
- класс, который не расширяется Application
:
public class Launcher {
public static void main(String[] args) {
Main.main(args);
}
}
Теперь вы можете запустить задачу jar
, и она создаст теневую флягу со всеми зависимостями, включая зависимости JavaFX. Тогда вы можете запустить:
./gradlew jar
cd build/libs
java -jar your-project.jar
Подать вопрос
Наконец, я бы предложил вам подать проблему здесь , связав этот вопрос.