我没有使用任何建议的答案来解决这个问题。最后,我有一些文件夹和文件可以压缩并发送,不需要java安装,可以通过双击. bat文件来运行。以下过程对我有用:
> < li>
从头开始创建新的gradle项目
将所有模块/代码添加到 src/主/java 文件夹中
创建一个调用main-方法的AppLauncher.java
将所有 fxml/css 从其中一个 Java 文件夹移动到资源文件夹
确保对fxml-/css-files的调用没有被错误重构,并使用以下代码:
//Main start method
Parent root = FXMLLoader.load(new File("fxml/main.fxml").toURI().toURL());
//Other FXML loading operations
FXMLLoader loader = null;
try { loader = new FXMLLoader(new File("fxml/GRAPHISO_proof.fxml").toURI().toURL()); }
...
对于样式表:
scene.getStylesheets().add("file:///" + new File("css/text-field-red-border.css").getAbsolutePath().replace('\\', '/'));
module-info.java
,结构如下:module XYZ {
requires javafx.controls;
requires javafx.graphics;
requires java.desktop;
requires javafx.fxml;
requires javafx.base;
opens main.controller to javafx.fxml;
//Open ALL controller-modules (all of my modules have a controller-submodule, e.g. main/controller, dlog/controller, graphiso/controller, ...) to javafx.fxml
//...
exports main;
}
>
确保gradle/包装器/gradle-wrapper.properties设置为一个不那么旧的gradle版本(分发URL=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
)
使用这个作为你的构建.
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'org.openjfx:javafx-plugin:0.0.8'
classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
}
}
plugins {
id 'java'
id 'org.beryx.jlink' version '2.19.0'
}
apply plugin: 'org.openjfx.javafxplugin'
apply plugin: 'com.github.johnrengelman.shadow'
group 'org.example.abc'
version '1.0'
sourceCompatibility = 1.14
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
javafx {
sdk = 'C:\\Program Files\\Java\\javafx-sdk-14.0.1'
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.base' ]
}
jlink {
mainClassName = 'main.AppLauncher'
launcher {
name = 'Whatever you want as name'
}
}
tasks.jlink.doLast {
copy {
from('src/main/resources')
into("$buildDir/image/bin")
}
copy {
from 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\glass.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\javafx_font.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_d3d.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_sw.dll'
into("$buildDir/image/bin")
}
}
请注意我是如何在任务中包含一些 dll 文件的。没有它们,程序会不断崩溃,并引用量子控制器。
我试图通过使用IntelliJ中的“运行配置”功能,从我在JavaFX11中实现的项目创建一个运行时映像。在我看来,这里的一个大问题是,我对maven/gradle的知识几乎不存在,而这些构建工具对于这一步至关重要。
在我安装的< code > C:\ Program Files \ Java 中:
11.0.2
和jdk-13.0.2
我把IntellJ的“运行配置”里面的VM选项配置为< code >-module-path“C:\ Program Files \ Java \ Java FX-SDK-11 . 0 . 2 \ lib”-add-modules Java FX . controls,javafx.fxml并将主类设置为“Main。主”。
我的项目结构看起来像这样:项目文件夹结构
突出显示的Main.java是一个普通的主文件(扩展应用程序,在Main内部调用launch(args))。它可以加载位于其他包中的其他窗口。它不是一个不扩展应用程序的启动文件,而是调用实际的主文件(正如一些用于梯度构建的解决方案所建议的)。
最初,我试图获得一个. jar文件,它可以在Windows和Linux上运行,不需要任何其他参数。经过一些阅读,我认为这不是一个干净的解决方案,许多资料表明,在现代解决方案中。jar文件将被放在一起,并以. bat/的形式发布。包含所有必要参数的sh文件。
我的问题是:如何才能最好地将这个“ide内点击运行”项目转换成一个可以通过电子邮件或类似方式共享的“独立应用程序”,我需要哪些配置/附加文件?
我试着通过IntelliJ创建了一个新的gradle项目(遵循https://openjfx.io/openjfx-docs ),并将源文件复制粘贴到src/main/java中。然后我试了试提供的build.gradle文件——之后没有用——根据各种博客/论坛等的建议做了一些修改。它们都不允许我通过IntelliJ或从命令行运行这个项目。
这些方法中的大多数都允许我构建项目,但是当尝试使用"gradlew run"或调用"java-jarfile.jar"运行时,由于类异常,我收到了错误消息,或者说我仍然缺少javafx模块。我还尝试了一种方法将我当前的项目转换为gradle-project,但这甚至不允许我之后构建项目。
我已经查看了JPackageScriptFX链接。现在我得到了一个在我的机器上运行的安装程序(使用mvn净安装
),但是在运行生成的可执行文件时,我收到一条错误消息,上面写着“启动JVM失败”。
到目前为止,我所做的是:
> < li>
已安装jdk-14.0.1并设置JAVA_HOME,已安装wix311
创建了一个名为“bachelor_maven”的新IntelliJ maven项目
已删除初始src文件夹
在生成的src/main/java文件夹中添加了新的模块“ZKP_Inspector”和我的旧模块
添加并编辑了JPackageScriptFX中的src/main/logo/windows/duke.ico、两个pom.xml文件和build_app.bat
实现了AppLauncher。调用Main.java的java
我的配置文件:
>
新项目结构:Imgur
pom公司。xml(项目级,bachelor_maven):Pastebin
pom.xml(模块级,ZKP_Inspector):Pastebin
build_app.bat: Pastebin
我尝试从build_app.bat文件的jpackage参数中删除< code >-runtime-image target/Java-runtime ^,以便让jpackage决定包含什么。这增加了安装程序的文件大小(如预期的那样),但在尝试执行生成的程序时会导致相同的错误。
我还下载了JMOD文件,并在build_app的jlink任务中使用它们。这里暗示的蝙蝠。
这产生了另一个运行良好的安装程序,其结果程序抛出了相同的错误。
我现在已经用一个几乎是自建的解决方案解决了这个问题。最后,我有一些文件夹和文件可以压缩和发送,它们不需要java安装,可以通过双击.bat文件来运行。以下程序对我有效:
>
从头开始创建新的渐变项目
将所有模块/代码添加到 src/主/java 文件夹中
创建一个调用main-方法的AppLauncher.java
将所有 fxml/css 从其中一个 Java 文件夹移动到资源文件夹
确保对fxml-/css-files的调用没有被错误重构,并使用以下代码:
//Main start method
Parent root = FXMLLoader.load(new File("fxml/main.fxml").toURI().toURL());
//Other FXML loading operations
FXMLLoader loader = null;
try { loader = new FXMLLoader(new File("fxml/GRAPHISO_proof.fxml").toURI().toURL()); }
...
对于样式表:
scene.getStylesheets().add("file:///" + new File("css/text-field-red-border.css").getAbsolutePath().replace('\\', '/'));
module XYZ {
requires javafx.controls;
requires javafx.graphics;
requires java.desktop;
requires javafx.fxml;
requires javafx.base;
opens main.controller to javafx.fxml;
//Open ALL controller-modules (all of my modules have a controller-submodule, e.g. main/controller, dlog/controller, graphiso/controller, ...) to javafx.fxml
//...
exports main;
}
>
确保分级/包装器/分级包装的属性设置为不太旧的分级版本(分布网址 services.gradle.org/distributions/gradle-6.3-bin.zip=
使用这个作为你的构建.
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath 'org.openjfx:javafx-plugin:0.0.8'
classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
}
}
plugins {
id 'java'
id 'org.beryx.jlink' version '2.19.0'
}
apply plugin: 'org.openjfx.javafxplugin'
apply plugin: 'com.github.johnrengelman.shadow'
group 'org.example.abc'
version '1.0'
sourceCompatibility = 1.14
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
javafx {
sdk = 'C:\\Program Files\\Java\\javafx-sdk-14.0.1'
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.base' ]
}
jlink {
mainClassName = 'main.AppLauncher'
launcher {
name = 'Whatever you want as name'
}
}
tasks.jlink.doLast {
copy {
from('src/main/resources')
into("$buildDir/image/bin")
}
copy {
from 'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\glass.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\javafx_font.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_d3d.dll',
'C:\\Program Files\\Java\\javafx-sdk-14.0.1\\bin\\prism_sw.dll'
into("$buildDir/image/bin")
}
}
请注意我是如何在任务中包含一些 dll 文件的。没有它们,程序会不断崩溃,并引用量子控制器。
我遇到同样的问题已经有一段时间了;IntelliJ无法自行部署FX应用程序,这是一个相当大的问题。
如果您还没有这样做的话,我建议您首先创建一个标准的Jar文件,并从命令行运行它以及您需要的附加参数:
java --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules javafx.controls,javafx.fxml -jar your-jar.jar
这只是为了验证它是否启动和运行。我了解到,仅仅因为它在IDE中运行,并不意味着运行JAR时不会弹出错误——最好先验证一下。
然后,有许多方法可以实现你想要的,所有这些方法都有不同程度的简单和整洁。
首先,正常编译JavaFX jar,以下称为fx.jar。然后,创建一个非JavaFX项目,以下称为nonfx.jar。将fx.jar放在< code>nonfx的< code>src文件夹中。当nonfx运行时,它应该从自己的归档文件中提取fx.jar,然后运行一个命令,用必要的VM参数打开fx.jar。本质上,nonfx是fx.jar的容器。为了在fx.jar关闭时删除它,我建议创建一个Windows任务,从fx.jar中删除它。
这种方法相当烦人且容易出错,但它确实有效。可能有更好的方法来与格拉德做到这一点。在 fx:deploy 再次包含在 IntelliJ 中之前,解决方法是我们拥有的最好的方法。
好的,我将尝试演示如何仅使用jlink实现这一点。假设我们在目录“C:\Users\Alexiy\IdeaProjects\AnotherBuildTool\rundir”中有一个示例项目。其结构为:
/rundir
--classes [compilation output]
--source [source code]
--images [runtime image output]
我有一个类“source \ io \ github \ alexiyorlov \ calculator \ program . Java”:
package io.github.alexiyorlov.calculator;
import javafx.application.Application;
import javafx.stage.Stage;
import java.nio.file.Path;
public class Program extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
System.out.println("I'm a simple application");
primaryStage.show();
}
}
以及适当的“source\module info.java”:
module io.github.alexiyorlov{
requires javafx.controls;
requires javafx.graphics;
exports io.github.alexiyorlov.calculator;
}
如果我想用这个做一个运行时图像,jlink命令的语法将是这样的:
jlink--Launcher[启动脚本的名称]=[对主类的引用]--module-path'[项目依赖项jars编译输出目录的分离列表]'--add-dule[我的模块参考]--compress=2--输出[生成的运行时映像的目录]
因此,对于我的示例项目,它解析为以下命令:
jlink
--launcher launch=io.github.alexiyorlov/io.github.alexiyorlov.calculator.Program
--module-path 'C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-controls\11.0.2\javafx-controls-11.0.2-win.jar;C:\Users\Alexiy\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.0-M1\junit-jupiter-engine-5.7.0-M1.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-base\11.0.2\javafx-base-11.0.2.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-base\11.0.2\javafx-base-11.0.2-win.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-graphics\11.0.2\javafx-graphics-11.0.2.jar;C:\Users\Alexiy\.m2\repository\dev\buildtool\json-tools\0.1.0\json-tools-0.1.0.jar;C:\Users\Alexiy\IdeaProjects\AnotherBuildTool\rundir\org\openjfx\javafx\11.0.2\javafx-11.0.2/.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-controls\11.0.2\javafx-controls-11.0.2.jar;C:\Users\Alexiy\.m2\repository\org\openjfx\javafx-graphics\11.0.2\javafx-graphics-11.0.2-win.jar;C:\Users\Alexiy\IdeaProjects\AnotherBuildTool\rundir/classes'
--add-modules io.github.alexiyorlov
--compress=2
--output .\images\0.0.1
它将在目录“image\0.0.1”中创建一个图像,启动脚本为“0.0.1\bin\Laun”。
注意,我使用了一种自动化的方法来获取--module-path的正确参数;确保在其中包含类输出目录。
--addmodules指定要包含应用程序的哪些模块。
- output指定一个目录来存放图像的所有文件。
- launcher在“=”后指定启动脚本的名称和对主类的正确引用。
- compress=2表示对图像应用ZIP压缩。
请随时向我索取更多信息。
我有一个Java项目已经准备就绪,但我在最后一个障碍上绊倒了。该程序在IDE中运行良好,但在我运行mvn clean install并成功创建目标jar后,应用程序在命令行和IDE中都会失败。我可以通过在IDE中进行重建,使其在IDE中再次运行。 还有其他人经历过类似的事情吗? mvn清洁安装后的错误是 它发生故障的线路如下所示: 如果我从IDE中重建,那么变量到达这里时不是null,但在mvn命
目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个
我使用netbans 10.0创建了一个新的CodeNameOne项目,但我无法运行它 输出: /home/autonome/NetBeansProjects/javaWorkSpace/CodenameOne7/build。xml:17:taskdef类com所需的类。代号1。建筑客户找不到GenerateGuiSources:javax/xml/bind/JAXBException,使用类加载
我希望能够运行SpringBoot:build映像,并让它从本地Artifactory服务器而不是docker中提取paketobuildpack。木卫一。我希望插件使用docker配置文件作为我的凭证,而不是在pom文件中硬编码。 这个作品: 当我在没有上面的docker块的情况下运行时,我得到以下错误: 我的docker/config。json具有以下配置: 我可以成功地运行docker bu
问题内容: 我尝试在构建映像的同时使用Docker安装软件,然后得到了。 我使用的Dockerfile 有没有一种方法可以在Dockerfile中运行docker命令来创建映像? 问题答案: 您的问题不在于Docker命令,因为它在错误消息中表示您的Docker守护程序未运行,或者由于某些配置问题而无法连接到它。 您刚刚安装了Docker吗?您是否完成了《安装指南》中的所有步骤? 您可以使用或来测
我制作了一个应用程序,它将获取数据库的列名,并在运行时基于数据库的列名创建一个jlabel和jtextfield。 下面是代码片段:我在这里使用Netbeans。。。 这将是示例输出。 引用JTextFields的行。。 但是,我无法获取在jtextfields中输入的值。我试过使用下面的代码。但运气不好。感谢您的帮助。