Исполняемый 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.

Другие вопросы по тегам