You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX集成Firebase打包Jar遇签名文件错误求助

解决JavaFX+Firebase打包Jar时的SignatureFileVerifier错误

问题描述

我花了两周时间尝试将集成Firebase的JavaFX项目打包为Jar文件:无Firebase及谷歌云依赖时,打包后的Jar运行正常;但添加这些依赖后,运行Jar会抛出以下错误:

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
        at java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:340)
        at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:282)
        at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:327)
        at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:239)
        at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:760)
        at java.base/java.util.jar.JarFile.ensureInitialization(JarFile.java:1058)
        at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:72)
        at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:883)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:848)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:495)
        at java.base/java.lang.Class.forName(Class.java:474)
        at java.base/sun.launcher.LauncherHelper.loadMainClass(LauncherHelper.java:790)
        at java.base/sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:685)

我已尝试使用Maven Shade插件、IntelliJ IDEA的Artifacts功能打包,但问题仍未解决。以下是我的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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>FuelStationManagementSystem</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <!-- Java and JavaFX versions -->
        <maven.compiler.source>19</maven.compiler.source>
        <maven.compiler.target>19</maven.compiler.target>
        <javafx.version>19</javafx.version>
        <firebase-admin.version>9.1.0</firebase-admin.version>
        <google-http-client.version>1.42.2</google-http-client.version>
        <grpc.version>1.49.2</grpc.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- JavaFX Dependencies -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>

        <dependency>
            <groupId>com.zenjava</groupId>
            <artifactId>javafx-deploy-lib</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- Firebase Admin SDK -->
        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>${firebase-admin.version}</version>
            <exclusions>
                <!-- Exclude duplicate Google HTTP Client and related libraries -->
                <exclusion>
                    <groupId>com.google.http-client</groupId>
                    <artifactId>google-http-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.http-client</groupId>
                    <artifactId>google-http-client-gson</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.http-client</groupId>
                    <artifactId>google-http-client-apache-v2</artifactId>
                </exclusion>
                <!-- Exclude duplicate gRPC dependencies -->
                <exclusion>
                    <groupId>io.grpc</groupId>
                    <artifactId>grpc-netty-shaded</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.grpc</groupId>
                    <artifactId>grpc-alts</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Explicitly define required dependencies to avoid conflicts -->
        <dependency>
            <groupId>com.google.http-client</groupId>
            <artifactId>google-http-client</artifactId>
            <version>${google-http-client.version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-core</artifactId>
            <version>${grpc.version}</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-api</artifactId>
            <version>${grpc.version}</version>
        </dependency>

        <!-- Test Dependencies -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Compiler Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>

            <!-- JavaFX Maven Plugin -->
            <plugin>
                <groupId>com.zenjava</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>8.8.3</version>
                <configuration>
                    <mainClass>com.example.fuelstationmanagementsystem.HelloApplication</mainClass>
                </configuration>
            </plugin>

            <!-- Shade Plugin for creating an executable JAR -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.example.fuelstationmanagementsystem.HelloApplication</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

解决方案

1. 完善Shade插件的签名文件过滤规则

当前过滤规则未覆盖所有签名文件类型,Firebase依赖的部分签名文件仍会被打包,导致JVM验证失败。更新Shade插件的filters配置:

<filters>
    <filter>
        <artifact>*:*</artifact>
        <excludes>
            <exclude>META-INF/*.SF</exclude>
            <exclude>META-INF/*.DSA</exclude>
            <exclude>META-INF/*.RSA</exclude>
            <exclude>META-INF/*.EC</exclude>
            <exclude>META-INF/SIG-*</exclude>
        </excludes>
    </filter>
</filters>

2. 替换过时的JavaFX插件

你使用的com.zenjava:javafx-maven-plugin是JavaFX 8的遗留插件,JavaFX 11+官方推荐使用org.openjfx:javafx-maven-plugin,替换后配置如下:

<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.8</version>
    <configuration>
        <mainClass>com.example.fuelstationmanagementsystem.HelloApplication</mainClass>
    </configuration>
</plugin>

3. 简化Firebase依赖排除规则

过度的依赖排除可能导致依赖缺失,直接移除Firebase依赖中的所有exclusions,让Maven自动处理依赖冲突:

<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-admin</artifactId>
    <version>${firebase-admin.version}</version>
</dependency>

4. 清理缓存并重新构建

执行以下命令彻底清理Maven缓存,重新打包:

mvn clean install shade:shade

问题根源

Firebase及其依赖的Jar包带有数字签名,打包时这些签名文件被合并到最终Jar中,导致JVM验证签名时出现冲突。通过Shade插件彻底移除所有第三方签名文件,即可解决该错误。

内容的提问来源于stack exchange,提问作者Jeffrey Bampoh Ansah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:05:54