可执行 jar 在使用 gradle 任务创建后无法找到或加载 main class
Executable jar can't find or load main class after it's created with a gradle task
我使用 gluon 插件创建了一个新的单视图项目,并且没有对它的文件进行任何更改。如果我使用 gradle 任务 application > run
它工作正常。但是,如果我使用 taks build > jar
,它会在 SingleViewProject\build\libs
下创建 jar,当我从命令行 运行 它时,我会得到
Error: Could not find or load main class 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.**.*'
]
}
}
和 "main class":
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")));
}
}
确实 class 中没有 main
方法,但您不需要。从 IDE 直接 运行 就可以了。有什么问题吗?
当您在 Gluon 项目上执行 jar
任务时,您将 只是 一个包含 classes 和主要资源的 jar 和项目的桌面包。在你的情况下,是这样的:
该 jar 包含主要 class,但不包含任何依赖项 (Gluon Charm)。
如果你想创建一个可执行的 jar,你需要创建一个 shadowJar
或 fatJar
,它捆绑了那个 jar 中的所有依赖项。
您可以为其添加此插件:com.github.johnrengelman.shadow
,基于此project。
添加插件后,您需要做的就是让它知道您的自定义配置,因为它不知道桌面配置。
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
。您可以在“任务”菜单下找到它:
您将在 /builds/libs/yourProjectName-all.jar.
下找到您的可执行 jar
我使用 gluon 插件创建了一个新的单视图项目,并且没有对它的文件进行任何更改。如果我使用 gradle 任务 application > run
它工作正常。但是,如果我使用 taks build > jar
,它会在 SingleViewProject\build\libs
下创建 jar,当我从命令行 运行 它时,我会得到
Error: Could not find or load main class 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.**.*'
]
}
}
和 "main class":
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")));
}
}
确实 class 中没有 main
方法,但您不需要。从 IDE 直接 运行 就可以了。有什么问题吗?
当您在 Gluon 项目上执行 jar
任务时,您将 只是 一个包含 classes 和主要资源的 jar 和项目的桌面包。在你的情况下,是这样的:
该 jar 包含主要 class,但不包含任何依赖项 (Gluon Charm)。
如果你想创建一个可执行的 jar,你需要创建一个 shadowJar
或 fatJar
,它捆绑了那个 jar 中的所有依赖项。
您可以为其添加此插件:com.github.johnrengelman.shadow
,基于此project。
添加插件后,您需要做的就是让它知道您的自定义配置,因为它不知道桌面配置。
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
。您可以在“任务”菜单下找到它:
您将在 /builds/libs/yourProjectName-all.jar.
下找到您的可执行 jar