JavaFX17+JakartaEE10打包后无法登录,请求排查POM配置问题
针对你遇到的shaded.jar运行时loginAPI无响应的问题,从你的POM配置中可以看到几个关键问题,以下是具体修复点:
1. 错误地将Maven Shade插件作为依赖引入
你在<dependencies>中添加了maven-shade-plugin的依赖,这是完全错误的。插件应该仅在<build><plugins>中配置,不需要作为依赖引入。直接删除这个依赖项:
<!-- 移除这个错误的依赖 --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <exclusions> <exclusion> <groupId>org.sonatype.sisu</groupId> <artifactId>sisu-inject-bean</artifactId> </exclusion> </exclusions> </dependency>
2. Shade插件缺少Services资源合并转换器
Jersey客户端依赖SPI服务(如消息转换器、客户端提供者),这些服务定义在META-INF/services目录下的文件中。Shade打包时如果不合并这些文件,会导致运行时无法找到必要的服务实现,从而使API调用无响应。需要在Shade插件的transformers中添加ServicesResourceTransformer:
<transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.company.package.MainApp</mainClass> <!-- 统一启动类 --> </transformer> <!-- 添加这个转换器合并SPI服务文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers>
3. JavaFX版本不一致
你的javafx-swing依赖版本是17.0.11,其他JavaFX依赖是17.0.1,版本不一致可能导致类加载冲突。统一所有JavaFX依赖的版本为17.0.11:
<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-media</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-swing</artifactId> <version>17.0.11</version> </dependency>
4. 重复且不必要的JakartaEE依赖
作为桌面客户端应用,你不需要引入jakarta.jakartaee-api和jakarta.jakartaee-web-api这类服务器端API依赖,而且这两个依赖本身存在重复。保留仅客户端需要的Jersey和JAXB相关依赖即可,删除以下重复依赖:
<!-- 移除这些服务器端API依赖 --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>10.0.0</version> </dependency> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-web-api</artifactId> <version>10.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.faces</groupId> <artifactId>jakarta.faces-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.el</groupId> <artifactId>jakarta.el-api</artifactId> <version>5.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency>
5. JAXB API缺少运行时实现
你只引入了jakarta.xml.bind-api,但没有对应的运行时实现,这会导致Jersey无法处理XML/JSON的序列化/反序列化(即使使用Gson,Jersey内部可能仍依赖JAXB)。添加GlassFish的JAXB运行时依赖:
<dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.4</version> </dependency>
6. 统一启动类配置
javafx-maven-plugin和shade插件中的mainClass不一致,统一设置为实际的启动类(比如com.company.package.MainApp):
<!-- javafx-maven-plugin中的配置 --> <configuration> <mainClass>com.company.package.MainApp</mainClass> </configuration> <!-- shade插件中的配置 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.company.package.MainApp</mainClass> </transformer>
修改后的完整POM示例
<dependencies> <!-- 统一版本的JavaFX依赖 --> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-graphics</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-media</artifactId> <version>17.0.11</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-swing</artifactId> <version>17.0.11</version> </dependency> <!-- Jersey客户端依赖 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>3.1.6</version> </dependency> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> </dependency> <!-- JAXB API + 运行时实现 --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.2</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.4</version> </dependency> <!-- Gson依赖 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <!-- 明确插件版本,替换原来的变量 --> <configuration> <mainClass>com.company.package.MainApp</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>module-info.class</exclude> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <shadedArtifactAttached>true</shadedArtifactAttached> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.company.package.MainApp</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> </plugins> </build>
额外建议
- 运行shaded.jar时,建议通过命令行启动并查看输出:
java -jar your-shaded.jar,这样能捕获到控制台的隐性异常信息,帮助进一步排查。 - 如果JavaFX的native库仍有问题,可以考虑使用
javafx-maven-plugin的jlink目标构建模块化的运行时镜像,这是JavaFX官方推荐的打包方式,比shade更稳定。
内容的提问来源于stack exchange,提问作者A.P.

