Исполняемый jar не может найти или загрузить основной класс после того, как он создан с задачей gradle
Я использовал плагин gluon для создания нового проекта с одним представлением и ничего не менял в его файлах. Если я использую задание Gradle application > run
это работает отлично. Но если я использую такс build > jar
он создал банку под SingleViewProject\build\libs
и когда я запускаю его из командной строки, я получаю
Ошибка: не удалось найти или загрузить основной класс com.gluonapplication.GluonApplication
Это нетронутый build.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.1.1'
}
}
apply plugin: 'org.javafxports.jfxmobile'
repositories {
jcenter()
maven {
url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
}
}
mainClassName = 'com.gluonapplication.GluonApplication'
dependencies {
compile 'com.gluonhq:charm:4.1.0'
}
jfxmobile {
downConfig {
version = '3.0.0'
plugins 'display', 'lifecycle', 'statusbar', 'storage'
}
android {
manifest = 'src/android/AndroidManifest.xml'
}
ios {
infoPList = file('src/ios/Default-Info.plist')
forceLinkClasses = [
'com.gluonhq.**.*',
'javax.annotations.**.*',
'javax.inject.**.*',
'javax.json.**.*',
'org.glassfish.json.**.*'
]
}
}
и "основной класс":
package com.gluonapplication;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.visual.Swatch;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
public class GluonApplication extends MobileApplication {
public static final String BASIC_VIEW = HOME_VIEW;
@Override
public void init() {
addViewFactory(BASIC_VIEW, () -> new BasicView(BASIC_VIEW));
}
@Override
public void postInit(Scene scene) {
Swatch.BLUE.assignTo(scene);
((Stage) scene.getWindow()).getIcons().add(new Image(GluonApplication.class.getResourceAsStream("/icon.png")));
}
}
Это правда, что нет main
метод в классе, но он вам не нужен. И все работает нормально прямо из IDE. В чем проблема?
1 ответ
Когда вы выполняете jar
Задание для проекта Gluon, вы получите просто банку с классами и ресурсами в основном и настольном пакетах вашего проекта. В вашем случае что-то вроде этого:
Эта банка содержит основной класс, но не содержит никаких зависимостей (Gluon Charm).
Если вы хотите создать исполняемый файл jar, вам нужно создать shadowJar
или же fatJar
, который связывает все зависимости в этом банке.
Вы можете добавить этот плагин для него: com.github.johnrengelman.shadow
на основе этого проекта.
После того, как вы добавите плагин, все, что вам нужно сделать, это сообщить ему о ваших пользовательских конфигурациях, поскольку он не знает о настольных.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.1.1'
classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.4'
}
}
apply plugin: 'org.javafxports.jfxmobile'
apply plugin: 'com.github.johnrengelman.shadow'
...
// Add desktop dependencies to the task
shadowJar {
configurations = [project.configurations.desktopRuntime]
}
Перезагрузите ваш проект и выполните shadowJar
, Вы можете найти его в меню Задачи:
Вы найдете свой исполняемый файл jar в /builds/libs/yourProjectName-all.jar.