我已经在使用 Maven 的项目构建中使用 IntelliJ、OpenJDK17、JavaFX17 完成了桌面应用程序。
该项目在 IDE 中运行良好,当我尝试在单个 jar 中部署应用程序时,问题就开始了,因为我需要一个从 exe 文件运行的独立应用程序。 我面临的问题和错误是:
ClassNotFoundException
带有包含 main 方法的启动器类,尽管我检查了 POM 和 manifest.mf,但它和我之前制作的其他应用程序一样没问题。Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
感谢我正在使用的其他应用程序,我意识到我所尝试的错误与 Apache Tika 使用的 bouncyCastle 库有关:
在将应用程序编译到单个 Jar 中后,我按照我阅读的说明解压了该 jar 并删除了文件 META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*DSA这里尝试运行 .jar 时出现“无效签名文件”之后,我运行 Jar,但没有收到 ClassNotFoundException,并且应用程序启动,但 Apache-Tika 无法解析任何类型的文档,因此我可以不能使用此选项。
按照上一个链接中的其他评论,我尝试在使用 POM 的编译过程中排除这些文件,但我使用的是 javafx-maven-plugin 和 maven-compiler-plugin 而不是 maven-shade-plugin。所以不是和选项。
我也尝试过使用 jlink 和 moditec 插件编译的其他东西,但我有很多与
相关的错误Error: automatic module cannot be used with jlink:
我无法修复它。
最后,我使用 IntellIj“库中的 Jar 文件”中的选项创建和工件 -“复制到输出目录并通过清单链接”。在这种情况下,应用程序可以运行并工作,但这只是因为我在计算机中安装了 OpenJDK 17,并从那里运行,但我需要一个自行创建的应用程序并创建 .exe 文件以在 Windows 中执行。问题是,对于 javafx 应用程序,如果我不将所有库包装在一个 jar 中,我将无法创建工作的 exe 文件。
所以,请问这里有任何天才可以帮助我解决这个问题吗?我已经尝试了一个多月,但我找不到解决方案。
FWIWI,我创建了这个包含 JavaFX 和 Tika 的 uber jar 文件,并且它运行了。我不知道它是否会帮助你实现你的目标。我根本不使用 Tika,因此没有测试 Tika 功能(其中部分功能可能会或可能不会在提供的单个 jar 配置中工作)。
使用的资源是:
代码不是模块化的。请参阅openjfx 入门部分有关非模块化应用程序和运行时映像的更多说明。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>tika</artifactId>
<version>1.0-SNAPSHOT</version>
<name>tika</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>21.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parser-html-commons</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-langdetect-optimaize</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-serialization</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-xmp</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-batch</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-emitter-fs</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-async-cli</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<artifactSet>
<excludes>
<exclude>org.apache.tika:tika-parsers-standard-package:jar:</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>module-info.class</exclude>
<exclude>META-INF/*</exclude>
<exclude>LICENSE.txt</exclude>
<exclude>NOTICE.txt</exclude>
<exclude>CHANGES</exclude>
<exclude>README</exclude>
<exclude>builddef.lst</exclude>
<!-- clutter not needed in jar -->
<exclude>resources/grib1/nasa/README*.pdf</exclude>
<exclude>resources/grib1/**/readme*.txt</exclude>
<exclude>resources/grib2/**/readme*.txt</exclude>
<!--
TIKA-763: Workaround to avoid including LGPL classes
-->
<exclude>ucar/nc2/iosp/fysat/Fysat*.class</exclude>
<exclude>ucar/nc2/dataset/transform/VOceanSG1*class</exclude>
<exclude>ucar/unidata/geoloc/vertical/OceanSG*.class</exclude>
<!-- https://issues.apache.org/jira/browse/TIKA-3650 -->
<exclude>javax/**/*</exclude>
<!-- no idea why this is packaged as a jar within a jar -->
<exclude>rome-utils-2.1.0.jar</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.example.tika.TikaMain</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer
implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/LICENSE</resource>
<file>target/classes/META-INF/LICENSE</file>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/NOTICE</resource>
<file>target/classes/META-INF/NOTICE</file>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/DEPENDENCIES</resource>
<file>target/classes/META-INF/DEPENDENCIES</file>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/cxf/bus-extensions.txt</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>
</project>