我已创建了一个JavaFX应用程序。它在我的Intellij IDE中完美运行。现在我想分发这个应用程序 - 也就是说,我想获取一个安装程序,用户可以下载,然后它会为他们安装应用程序。
我找到了一篇非常有趣的文章here。这篇博客文章基本上描述了我想要实现的内容。不过有两个区别:
我需要的是一个解释(逐步)如何将ModiTect(如果必要,还包括jpackage)集成到我的pom.xml中,以便为使用自动模块的JavaFX应用程序获取安装程序(以及sqlite数据库,虽然这不应该是问题)。有人能提供这个说明或者给我推荐一个教程吗?
我在这个问题的结尾提供了一个MWE。这个MWE是一个TestApp。为了说明问题,请运行应用程序并按“Print PDF”按钮。pdf文件会被创建在资源-> pdf中。
当执行javafx:run时,MWE将会编译和运行。当执行javafx:jlink时,会出现与使用自动模块相关的错误。
我不知道该怎么解决这个问题。ModiTect似乎是一个很有前途的插件。另一种可能的方法可以在this GitHub存储库中找到。但正如我之前所说:我的Maven知识不足以真正掌握这里发生了什么。任何帮助都对我意义重大!
MWE:
我找到了一篇非常有趣的文章here。这篇博客文章基本上描述了我想要实现的内容。不过有两个区别:
- 我正在使用Maven而不是Gradle
- 我有使用iText7和apache.commons.lang3等自动模块的依赖项
我需要的是一个解释(逐步)如何将ModiTect(如果必要,还包括jpackage)集成到我的pom.xml中,以便为使用自动模块的JavaFX应用程序获取安装程序(以及sqlite数据库,虽然这不应该是问题)。有人能提供这个说明或者给我推荐一个教程吗?
我在这个问题的结尾提供了一个MWE。这个MWE是一个TestApp。为了说明问题,请运行应用程序并按“Print PDF”按钮。pdf文件会被创建在资源-> pdf中。
当执行javafx:run时,MWE将会编译和运行。当执行javafx:jlink时,会出现与使用自动模块相关的错误。
我不知道该怎么解决这个问题。ModiTect似乎是一个很有前途的插件。另一种可能的方法可以在this GitHub存储库中找到。但正如我之前所说:我的Maven知识不足以真正掌握这里发生了什么。任何帮助都对我意义重大!
MWE:
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>TestApp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>15.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>15.0.1</version>
</dependency>
<dependency>
<groupId>de.jensd</groupId>
<artifactId>fontawesomefx-fontawesome</artifactId>
<version>4.7.0-9.1.2</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.34.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.1.14</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>15</release>
<source>15</source>
<target>15</target>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.5</version>
<configuration>
<mainClass>com.company.TestApp</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
module-info.java:
module com.company {
requires javafx.controls;
requires javafx.fxml;
requires java.sql;
requires org.apache.commons.lang3;
requires kernel;
requires layout;
requires io;
requires sqlite.jdbc;
requires javafx.graphics;
opens com.company to javafx.fxml;
opens com.company.controllers to javafx.fxml;
exports com.company;
exports com.company.controllers;
}
TestAppController.java:
package com.company.controllers;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import org.apache.commons.lang3.StringUtils;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.Document;
import java.io.FileNotFoundException;
public class TestAppController {
@FXML
private TextArea taText;
@FXML
private Button btnPrint;
public void handleButtonAction(ActionEvent event) {
if (event.getSource() == btnPrint) {
setTaText();
printPdf();
}
}
public void setTaText() {
taText.setText(StringUtils.leftPad("Random Text left padded by 50", 50));
}
public void printPdf() {
String directoryString = "src/main/resources/com/company/pdf";
try {
String filepath = directoryString + "/" + "pdf_1" + ".pdf";
PdfWriter writer = new PdfWriter(filepath);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
document.add(new Paragraph(taText.getText()));
document.close();
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
return;
}
}
}
TestApp.java:
package com.company;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TestApp extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("testApp.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("Test");
primaryStage.show();
}
}
testApp.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.text.Font?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.company.controllers.TestAppController">
<top>
<AnchorPane prefHeight="60.0" prefWidth="600.0" style="-fx-background-color: #337DFF;" BorderPane.alignment="CENTER" />
</top>
<center>
<AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<children>
<Button fx:id="btnPrint" layoutX="240.0" layoutY="155.0" mnemonicParsing="false" onAction="#handleButtonAction" prefHeight="25.0" prefWidth="120.0" style="-fx-background-color: #337DFF;" text="Print PDF" textFill="WHITE">
<font>
<Font name="System Bold" size="15.0" />
</font>
</Button>
<TextArea fx:id="taText" layoutX="125.0" layoutY="44.0" prefHeight="82.0" prefWidth="350.0" />
</children>
</AnchorPane>
</center>
</BorderPane>