Flp*_*lpe 27 jar gradle java-11 javafx-11
我正在尝试将JavaFX项目从8 Java版升级到11版.当我使用"运行"Gradle任务(我遵循Openjfx教程)时,它工作,但是当我构建(使用"jar"Gradle任务)并执行(使用"java -jar")jar文件时,消息"Error :缺少JavaFX运行时组件,并且"运行此应用程序需要".
这是我的build.gradle文件:
group 'Project'
version '1.0'
apply plugin: 'java'
sourceCompatibility = 1.11
repositories {
mavenCentral()
}
def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
platform = 'win'
} else if (currentOS.isLinux()) {
platform = 'linux'
} else if (currentOS.isMacOsX()) {
platform = 'mac'
}
dependencies {
compile "org.openjfx:javafx-base:11:${platform}"
compile "org.openjfx:javafx-graphics:11:${platform}"
compile "org.openjfx:javafx-controls:11:${platform}"
compile "org.openjfx:javafx-fxml:11:${platform}"
}
task run(type: JavaExec) {
classpath sourceSets.main.runtimeClasspath
main = "project.Main"
}
jar {
manifest {
attributes 'Main-Class': 'project.Main'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
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'
]
}
}
Run Code Online (Sandbox Code Playgroud)
你知道我应该怎么做吗?
Jos*_*eda 29
使用Java/JavaFX 11,阴影/脂肪jar将无法正常工作.
你可以在这里阅读:
此错误来自
sun.launcher.LauncherHelperjava.base模块.原因是Main应用程序扩展Application并具有main方法.如果是这种情况,LauncherHelper将检查javafx.graphics模块是否作为命名模块出现:
Optional<Module> om = ModuleLayer.boot().findModule(JAVAFX_GRAPHICS_MODULE_NAME);
Run Code Online (Sandbox Code Playgroud)
如果该模块不存在,则中止启动.因此,在这种情况下,不允许在类路径上将JavaFX库作为jar.
更重要的是,每个JavaFX 11 jar module-info.class在根级别都有一个文件.
当您将所有jar内容捆绑到一个胖胖的jar中时,那些具有相同名称和相同位置的文件会发生什么?即使胖罐保留所有这些,它如何识别为单个模块?
有一个请求支持这个,但它尚未得到解决:http: //openjdk.java.net/projects/jigsaw/spec/issues/#MultiModuleExecutableJARs
提供一种方法来创建包含多个模块的可执行模块化"uber-JAR",保留模块标识和边界,以便整个应用程序可以作为单个工件发布.
影子插件仍然有意义将所有其他依赖项捆绑到一个jar中,但毕竟你必须运行类似的东西:
java --module-path <path-to>/javafx-sdk-11/lib \
--add modules=javafx.controls -jar my-project-ALL-1.0-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)
这意味着,毕竟,您必须安装JavaFX SDK(每个平台)来运行从maven central使用JavaFX依赖项的jar.
作为替代方案,您可以尝试使用jlink创建轻量级JRE,但您的应用程序需要模块化.
您还可以使用Javapackager为每个平台生成安装程序.请参阅http://openjdk.java.net/jeps/343,它将生成Java 12的打包程序.
最后,还有的是与Java 11件作品的Javapackager的实验版/ JavaFX的11:http://mail.openjdk.java.net/pipermail/openjfx-dev/2018-September/022500.html
编辑
由于Java启动检查主类扩展javafx.application.Application,而在这种情况下,它需要可作为模块(而不是作为罐子)JavaFX运行,一个可能的解决方法,使其工作时,应增加一个新的主类,将成为主要的类您的项目,该类将是调用JavaFX Application类的类.
如果您有一个javafx11包含Application类的包:
public class HelloFX extends Application {
@Override
public void start(Stage stage) {
String javaVersion = System.getProperty("java.version");
String javafxVersion = System.getProperty("javafx.version");
Label l = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + ".");
Scene scene = new Scene(new StackPane(l), 400, 300);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你必须将这个类添加到该包:
public class Main {
public static void main(String[] args) {
HelloFX.main(args);
}
}
Run Code Online (Sandbox Code Playgroud)
在您的构建文件中:
mainClassName='javafx11.Main'
jar {
manifest {
attributes 'Main-Class': 'javafx11.Main'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以运行:
./gradlew run
Run Code Online (Sandbox Code Playgroud)
要么
./gradlew jar
java -jar build/libs/javafx11-1.0-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)
最终目标是将JavaFX模块作为模块路径上的命名模块,这看起来像是一个快速/丑陋的解决方法来测试您的应用程序.对于分发,我仍然建议上面提到的解决方案.
使用最新版本的 JavaFX,您可以使用两个 Gradle 插件轻松分发您的项目(javafxplugin 和 jlink)。
使用这些插件,您可以:
如果你想要一个例子,我在 bitbucket 上做了一个例子。
[编辑:有关JavaFX的最新版本,请检查我的第二个答案]
如果有人感兴趣,我找到了一种为JavaFX11项目(带有Java 9模块)创建jar文件的方法。我仅在Windows上进行过测试(如果该应用程序也适用于Linux,我认为我们必须在Linux上执行相同的步骤才能获得适用于Linux的JavaFX jar)。
我有一个“ Project.main”模块(由我在创建Gradle项目时由IDEA创建):
src
+-- main
| +-- java
| +-- main
| +-- Main.java (from the "main" package, extends Application)
| +-- module-info.java
build.gradle
settings.gradle
...
Run Code Online (Sandbox Code Playgroud)
module-info.java文件:
module Project.main {
requires javafx.controls;
exports main;
}
Run Code Online (Sandbox Code Playgroud)
build.gradle文件:
plugins {
id 'java'
}
group 'Project'
version '1.0'
ext.moduleName = 'Project.main'
sourceCompatibility = 1.11
repositories {
mavenCentral()
}
def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
platform = 'win'
} else if (currentOS.isLinux()) {
platform = 'linux'
} else if (currentOS.isMacOsX()) {
platform = 'mac'
}
dependencies {
compile "org.openjfx:javafx-base:11:${platform}"
compile "org.openjfx:javafx-graphics:11:${platform}"
compile "org.openjfx:javafx-controls:11:${platform}"
}
task run(type: JavaExec) {
classpath sourceSets.main.runtimeClasspath
main = "main.Main"
}
jar {
inputs.property("moduleName", moduleName)
manifest {
attributes('Automatic-Module-Name': moduleName)
}
}
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls'
]
classpath = files()
}
}
task createJar(type: Copy) {
dependsOn 'jar'
into "$buildDir/libs"
from configurations.runtime
}
Run Code Online (Sandbox Code Playgroud)
settings.gradle文件:
rootProject.name = 'Project'
Run Code Online (Sandbox Code Playgroud)
和Gradle命令:
#Run the main class
gradle run
#Create the jars files (including the JavaFX jars) in the "build/libs" folder
gradle createJar
#Run the jar file
cd build/libs
java --module-path "." --module "Project.main/main.Main"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11976 次 |
| 最近记录: |