你帮我看看这个文件哪里出了问题,在IJ里能运行,但打包成jar之后打开,总是报错: A JNI er...

बनाया गया: 26 फ़रवरी 2025

का उपयोग करके उत्तर दिया गया O1 Pro द्वारा Chat01

प्रश्न

你帮我看看这个文件哪里出了问题,在IJ里能运行,但打包成jar之后打开,总是报错: A JNI error has occurred, please check your installation and try again和A Java Exception has occurred.这是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>

text
<groupId>com.example</groupId> <artifactId>OFDtoPDF</artifactId> <version>1.0-SNAPSHOT</version> <name>OFDtoPDF</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>5.10.2</junit.version> </properties> <dependencies> <!-- 保留 OFD 转 PDF 相关依赖 --> <dependency> <groupId>org.ofdrw</groupId> <artifactId>ofdrw-full</artifactId> <version>2.1.0</version> <exclusions> <exclusion> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> </exclusion> </exclusions> </dependency> <!-- FontBox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.24</version> </dependency> <!-- Logback --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.14</version> </dependency> <!-- Apache PDFBox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version> </dependency> <!-- JUnit 依赖 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- Maven 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> <configuration> <source>21</source> <target>21</target> </configuration> </plugin> </plugins> </build>
</project>

विचार

Evaluating Java compatibility issues

Interestingly enough, it seems the error could be linked to Java version mismatches or a manifest problem, leading to class loading failures or unsupported version errors.

Addressing jar constraints

It seems the issue might stem from a missing main class in the manifest or absent library dependencies. Using a plugin to create an executable jar could resolve these problems.

Evaluating plugin options

I’m assessing the maven-shade-plugin to create an executable jar with dependencies, considering native libraries or version mismatches, and addressing the missing main class in the manifest.

Addressing version mismatches

If the user is on an older JRE, it’s time to compile with the same or an earlier Java version. Also, let’s ensure the main class is specified in the plugin's configuration or manifest.

Reasoned for 2m 29s

उत्तर

这类“打包后运行报 JNI error 或 Java Exception error,但在 IDE 里能正常跑”的情况,常见原因通常有以下几种,你可以逐一排查:


1. Java 版本不匹配

你的 maven-compiler-plugin 里指定了

xml
<source>21</source> <target>21</target>

这意味着编译出的 class 文件是 Java 21 的字节码。如果你在一台 JDK/运行环境低于 21 的机器上用 java -jar xxx.jar 启动,就会出现类似 “A JNI error has occurred” 或 “unsupported major.minor version 65” 之类的报错(有时会简化成 “A Java Exception has occurred”)。

解决办法

  1. 要么在目标运行环境上安装 Java 21(或至少与编译版本匹配的 JRE),并通过 java -version 确认运行环境是 21 或更高。
  2. 要么把 maven-compiler-pluginsource/target 改成你实际运行环境的版本,比如 17、11 或 8 等(前提是代码里没有用到 21 专属的新特性)。

2. 可执行 Jar 的依赖没有打进去

如果你想要一个可执行(Executable)Jar,双击或 java -jar 即可运行,单纯用 maven-compiler-plugin 编译可能不够。因为:

  • 这样打出来的 jar 不包含第三方库依赖,只包含自己项目的 class;
  • MANIFEST.MF 里通常没有配置 Main-Class 或者没有把依赖都合并打包。

因此,运行时会在找不到依赖的情况下报各种错误(有时也会显示类似 “NoClassDefFoundError”,但也可能就是 “Java Exception”)。在 IDE 里运行是因为 IDE 自动把所有依赖都加进了 classpath 里。

解决办法

  1. 使用 maven-shade-plugin,把依赖都打到一个 “fat jar” 或 “uber jar” 里,同时指定好入口 Main-Class

    xml
    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 请把你的主类全名写这里,比如 com.example.Main --> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.your.MainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>

    然后 mvn clean package,就会在 target 目录下生成一个带 “-shaded.jar” 后缀的可执行包。你可以直接 java -jar xxx-shaded.jar 运行。

  2. 使用 maven-assembly-plugin 或类似插件也可以实现同样的效果。关键点在于:

    • 让所有依赖打到同一个 jar。
    • MANIFEST.MF 里声明正确的 Main-Class

3. 没有指定 main class

即使依赖打进了 jar,如果你想 java -jar xxx.jar 直接启动,还要在打包时确保 META-INF/MANIFEST.MF 里写了 Main-Class。否则就会提示 “no main manifest attribute in xxx.jar” 或 “A Java Exception has occurred” 等。要检查你的最终 jar 包的 META-INF/MANIFEST.MF,看看是否正确:

txt
Manifest-Version: 1.0 Main-Class: com.example.your.MainClass

如果没有,就需要通过插件配置来加上(参考上面 shade 或 assembly 里对 ManifestResourceTransformer 的配置)。


4. 其他可能性(原生库或类似问题)

极少数情况下,“A JNI error has occurred” 是因为你使用的某些库需要配合原生库(如 JNI、OpenCV、ffmpeg 等),而原生库版本或路径不对。一般 PDFBox 或 OFD 相关库应该不怎么用 JNI,出问题更多是 Java 版本、依赖丢失或清单文件不对。

如果你确实有原生库依赖,就要检查是否需要放到某个指定目录,或者和你的 jar 放一起并在启动时加 -Djava.library.path=... 等,但这通常不是最常见的原因。


小结

  1. 首先检查你本地/目标机器上运行 jar 时,是否和你编译用的 Java 版本一致。
  2. 然后确认你想生成可执行 jar 的话,要用 shade 或 assembly 插件打出所有依赖,并在 MANIFEST.MF 里写明 Main-Class
  3. 如果确保依赖都打进去了、Java 版本也一致,依旧 “JNI error”,再考虑是否有 JNI 原生库冲突之类的特殊问题。

大概率就是Java 版本不一致没把依赖和 Main-Class 打包进去造成的。你可以先从这里排查起。

प्रश्न

我用了你的使用 maven-shade-plugin方法,这次倒是不报错了,但是双击test-1.0-SNAPSHOT.jar啥反应没有,只有在命令行运行可以体现出报错:D:\JavaProjects\test\target>java -jar test-1.0-SNAPSHOT.jar 错误: 找不到或无法加载主类 com.example.Main 原因: java.lang.ClassNotFoundException: com.example.Main。
而且没有后缀为-shaded的jar,只有这两个:original-test-1.0-SNAPSHOT.jar,test-1.0-SNAPSHOT.jar,我在打包时日志输出是这样的:PS D:\JavaProjects\test> mvn clean package
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for org.example:test:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-shade-plugin @ line 127, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] --------------------------< org.example:test >--------------------------
[INFO] Building test 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] 6 problems were encountered while building the effective model for org.openjfx:javafx-controls:jar:21.0.1 during dependency collection step for project (use -X to see details)
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ test ---
[INFO] Deleting D:\JavaProjects\test\target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ test ---
[INFO] Copying 1 resource from src\main\resources to target\classes
[INFO]
[INFO] --- compiler:3.13.0:compile (default-compile) @ test ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 1 source file with javac [debug target 21] to target\classes
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ test ---
[INFO] skip non existing resourceDirectory D:\JavaProjects\test\src\test\resources
[INFO]
[INFO] --- compiler:3.13.0:testCompile (default-testCompile) @ test ---
[INFO] Recompiling the module because of changed dependency.
[INFO]
[INFO] --- surefire:3.2.5:test (default-test) @ test ---
[INFO]
[INFO] --- jar:3.4.1:jar (default-jar) @ test ---
[INFO] Building jar: D:\JavaProjects\test\target\test-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- shade:3.5.3:shade (default) @ test ---
[INFO] Including org.ofdrw:ofdrw-full:jar:2.1.0 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-gv:jar:2.1.0 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-core:jar:2.1.0 in the shaded jar.
[INFO] Including org.bouncycastle:bcprov-jdk15on:jar:1.68 in the shaded jar.
[INFO] Including jaxen:jaxen:jar:1.2.0 in the shaded jar.
[INFO] Including org.dom4j:dom4j:jar:2.1.4 in the shaded jar.
[INFO] Including org.jetbrains:annotations:jar:21.0.1 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-layout:jar:2.1.0 in the shaded jar.
[INFO] Including com.twelvemonkeys.imageio:imageio-tiff:jar:3.5 in the shaded jar.
[INFO] Including com.twelvemonkeys.imageio:imageio-core:jar:3.5 in the shaded jar.
[INFO] Including com.twelvemonkeys.imageio:imageio-metadata:jar:3.5 in the shaded jar.
[INFO] Including com.twelvemonkeys.common:common-lang:jar:3.5 in the shaded jar.
[INFO] Including com.twelvemonkeys.common:common-io:jar:3.5 in the shaded jar.
[INFO] Including com.twelvemonkeys.common:common-image:jar:3.5 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-pkg:jar:2.1.0 in the shaded jar.
[INFO] Including net.lingala.zip4j:zip4j:jar:2.11.3 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-font:jar:2.1.0 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-reader:jar:2.1.0 in the shaded jar.
[INFO] Including org.apache.commons:commons-compress:jar:1.21 in the shaded jar.
[INFO] Including org.apache.pdfbox:jbig2-imageio:jar:3.0.3 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-gm:jar:2.1.0 in the shaded jar.
[INFO] Including org.bouncycastle:bcpkix-jdk15on:jar:1.68 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-sign:jar:2.1.0 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-converter:jar:2.1.0 in the shaded jar.
[INFO] Including org.ujmp:ujmp-core:jar:0.3.0 in the shaded jar.
[INFO] Including org.json:json:jar:20141113 in the shaded jar.
[INFO] Including com.itextpdf:kernel:jar:7.1.13 in the shaded jar.
[INFO] Including com.itextpdf:io:jar:7.1.13 in the shaded jar.
[INFO] Including com.itextpdf:layout:jar:7.1.13 in the shaded jar.
[INFO] Including com.itextpdf:font-asian:jar:7.1.13 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-transcoder:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-anim:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-css:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-ext:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-parser:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-svg-dom:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-awt-util:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:xmlgraphics-commons:jar:2.9 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-bridge:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-script:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-dom:jar:1.17 in the shaded jar.
[INFO] Including xml-apis:xml-apis:jar:1.4.01 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-gvt:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-shared-resources:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-svggen:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-util:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-constants:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-i18n:jar:1.17 in the shaded jar.
[INFO] Including org.apache.xmlgraphics:batik-xml:jar:1.17 in the shaded jar.
[INFO] Including xml-apis:xml-apis-ext:jar:1.3.04 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-tool:jar:2.1.0 in the shaded jar.
[INFO] Including org.ofdrw:ofdrw-graphics2d:jar:2.1.0 in the shaded jar.
[INFO] Including commons-io:commons-io:jar:2.8.0 in the shaded jar.
[INFO] Including ch.qos.logback:logback-classic:jar:1.4.14 in the shaded jar.
[INFO] Including ch.qos.logback:logback-core:jar:1.4.14 in the shaded jar.
[INFO] Including org.slf4j:slf4j-api:jar:2.0.7 in the shaded jar.
[INFO] Including org.openjfx:javafx-controls:jar:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-controls:jar:win:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-graphics:jar:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-graphics:jar:win:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-base:jar:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-base:jar:win:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-fxml:jar:21.0.1 in the shaded jar.
[INFO] Including org.openjfx:javafx-fxml:jar:win:21.0.1 in the shaded jar.
[INFO] Including org.apache.pdfbox:pdfbox:jar:2.0.24 in the shaded jar.
[INFO] Including commons-logging:commons-logging:jar:1.2 in the shaded jar.
[INFO] Including org.apache.pdfbox:fontbox:jar:2.0.24 in the shaded jar.
[INFO] Dependency-reduced POM written at: D:\JavaProjects\test\dependency-reduced-pom.xml
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.
[WARNING] batik-svggen-1.17.jar, ofdrw-converter-2.1.0.jar define 1 overlapping classes:
[WARNING] - org.apache.batik.svggen.SVGAlphaComposite
[WARNING] batik-awt-util-1.17.jar, ofdrw-converter-2.1.0.jar define 1 overlapping classes:
[WARNING] - org.apache.batik.ext.awt.image.spi.ImageWriterRegistry
[WARNING] javafx-base-21.0.1-win.jar, javafx-controls-21.0.1-win.jar, javafx-fxml-21.0.1-win.jar, javafx-graphics-21.0.1-win.jar define 1 overlapping resource:
[WARNING] - META-INF/substrate/config/reflectionconfig.json
[WARNING] commons-compress-1.21.jar, commons-io-2.8.0.jar, commons-logging-1.2.jar, jaxen-1.2.0.jar, slf4j-api-2.0.7.jar define 1 overlapping resource:
[WARNING] - META-INF/LICENSE.txt
[WARNING] annotations-21.0.1.jar, bcpkix-jdk15on-1.68.jar, bcprov-jdk15on-1.68.jar, slf4j-api-2.0.7.jar define 1 overlapping classes:
[WARNING] - META-INF.versions.9.module-info
[WARNING] fontbox-2.0.24.jar, jbig2-imageio-3.0.3.jar, pdfbox-2.0.24.jar define 1 overlapping resource:
[WARNING] - META-INF/DEPENDENCIES
[WARNING] javafx-controls-21.0.1-win.jar, javafx-graphics-21.0.1-win.jar define 4 overlapping resources:
[WARNING] - META-INF/substrate/config/reflectionconfig-aarch64-android.json
[WARNING] - META-INF/substrate/config/reflectionconfig-arm64-ios.json
[WARNING] - META-INF/substrate/config/reflectionconfig-x86_64-ios.json
[WARNING] - META-INF/substrate/config/resourcebundles
[WARNING] batik-anim-1.17.jar, batik-awt-util-1.17.jar, batik-bridge-1.17.jar, batik-constants-1.17.jar, batik-css-1.17.jar, batik-dom-1.17.jar, batik-ext-1.17.jar, batik-gvt-1.17.jar, batik-i18n-1.17.
jar, batik-parser-1.17.jar, batik-script-1.17.jar, batik-shared-resources-1.17.jar, batik-svg-dom-1.17.jar, batik-svggen-1.17.jar, batik-transcoder-1.17.jar, batik-util-1.17.jar, batik-xml-1.17.jar, fontbox-2.0.24.jar, jbig2-imageio-3.0.3.jar, pdfbox-2.0.24.jar, xmlgraphics-commons-2.9.jar define 2 overlapping resources:
[WARNING] - META-INF/LICENSE
[WARNING] - META-INF/NOTICE
[WARNING] annotations-21.0.1.jar, batik-anim-1.17.jar, batik-awt-util-1.17.jar, batik-bridge-1.17.jar, batik-constants-1.17.jar, batik-css-1.17.jar, batik-dom-1.17.jar, batik-ext-1.17.jar, batik-gvt-1.
17.jar, batik-i18n-1.17.jar, batik-parser-1.17.jar, batik-script-1.17.jar, batik-shared-resources-1.17.jar, batik-svg-dom-1.17.jar, batik-svggen-1.17.jar, batik-transcoder-1.17.jar, batik-util-1.17.jar
, batik-xml-1.17.jar, bcpkix-jdk15on-1.68.jar, bcprov-jdk15on-1.68.jar, common-image-3.5.jar, common-io-3.5.jar, common-lang-3.5.jar, commons-compress-1.21.jar, commons-io-2.8.0.jar, commons-logging-1.
2.jar, dom4j-2.1.4.jar, font-asian-7.1.13.jar, fontbox-2.0.24.jar, imageio-core-3.5.jar, imageio-metadata-3.5.jar, imageio-tiff-3.5.jar, io-7.1.13.jar, javafx-base-21.0.1-win.jar, javafx-base-21.0.1.ja
r, javafx-controls-21.0.1-win.jar, javafx-controls-21.0.1.jar, javafx-fxml-21.0.1-win.jar, javafx-fxml-21.0.1.jar, javafx-graphics-21.0.1-win.jar, javafx-graphics-21.0.1.jar, jaxen-1.2.0.jar, jbig2-ima
geio-3.0.3.jar, json-20141113.jar, kernel-7.1.13.jar, layout-7.1.13.jar, logback-classic-1.4.14.jar, logback-core-1.4.14.jar, ofdrw-converter-2.1.0.jar, ofdrw-core-2.1.0.jar, ofdrw-font-2.1.0.jar, ofdr
w-full-2.1.0.jar, ofdrw-gm-2.1.0.jar, ofdrw-graphics2d-2.1.0.jar, ofdrw-gv-2.1.0.jar, ofdrw-layout-2.1.0.jar, ofdrw-pkg-2.1.0.jar, ofdrw-reader-2.1.0.jar, ofdrw-sign-2.1.0.jar, ofdrw-tool-2.1.0.jar, pd
fbox-2.0.24.jar, slf4j-api-2.0.7.jar, test-1.0-SNAPSHOT.jar, ujmp-core-0.3.0.jar, xml-apis-1.4.01.jar, xml-apis-ext-1.3.04.jar, xmlgraphics-commons-2.9.jar, zip4j-2.11.3.jar define 1 overlapping resource:
[WARNING] - META-INF/MANIFEST.MF
[WARNING] ofdrw-converter-2.1.0.jar, xmlgraphics-commons-2.9.jar define 1 overlapping classes:
[WARNING] - org.apache.xmlgraphics.image.writer.ImageWriter
[WARNING] imageio-tiff-3.5.jar, jbig2-imageio-3.0.3.jar define 1 overlapping resource:
[WARNING] - META-INF/services/javax.imageio.spi.ImageReaderSpi
[WARNING] commons-compress-1.21.jar, commons-io-2.8.0.jar, commons-logging-1.2.jar define 1 overlapping resource:
[WARNING] - META-INF/NOTICE.txt
[WARNING] bcpkix-jdk15on-1.68.jar, bcprov-jdk15on-1.68.jar define 4 overlapping resources:
[WARNING] - META-INF/BC1024KE.DSA
[WARNING] - META-INF/BC1024KE.SF
[WARNING] - META-INF/BC2048KE.DSA
[WARNING] - META-INF/BC2048KE.SF
[WARNING] xml-apis-1.4.01.jar, xml-apis-ext-1.3.04.jar define 5 overlapping resources:
[WARNING] - license/LICENSE
[WARNING] - license/LICENSE.dom-documentation.txt
[WARNING] - license/LICENSE.dom-software.txt
[WARNING] - license/NOTICE
[WARNING] - license/README.dom.txt
[WARNING] maven-shade-plugin has detected that some files are
[WARNING] present in two or more JARs. When this happens, only one
[WARNING] single version of the file is copied to the uber jar.
[WARNING] Usually this is not harmful and you can skip these warnings,
[WARNING] otherwise try to manually exclude artifacts based on
[WARNING] mvn dependency:tree -Ddetail=true and the above output.
[WARNING] See https://maven.apache.org/plugins/maven-shade-plugin/
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\JavaProjects\test\target\test-1.0-SNAPSHOT.jar with D:\JavaProjects\test\target\test-1.0-SNAPSHOT-shaded.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.450 s
[INFO] Finished at: 2025-02-26T10:27:46+08:00
[INFO] ------------------------------------------------------------------------
PS D:\JavaProjects\test>

विचार

Investigating jar output

The user built an Uber jar with the Shade plugin, which called the main class. However, the class was missing, likely due to an incorrect fully qualified name.

Addressing jar issues

The user should confirm the main class's package matching the groupId. Investigate duplicate Shade plugin configurations and ensure the "Main-Class" entry is correctly specified in the manifest.

Refining JavaFX integration

I’m verifying that the main class is correctly specified and ensuring there are no duplicate Shade plugin configurations. Revisiting the handling of 'module-info.class' is crucial.

Pinpointing the issue

The user should ensure 'com.example.Main' is in the final jar, check for 'module-info.class' breakage, and confirm the correct packaging of the main class.

Reasoned for 3m 49s

उत्तर

从你贴出来的日志和现象来看,核心问题有两点

  1. 没有在最终的可执行 Jar 里找到 com.example.Main 这个主类(也就是 Manifest 里没有写上它,或者确实不存在该类);
  2. Shade 插件配置里出现了“重复定义”,导致打包过程有些混乱。

结合日志分析,你最终得到的 test-1.0-SNAPSHOT.jar 是 Shade 插件“替换”后的产物(它把 -shaded.jar 覆盖成原 jar 名),但 Manifest 里还没正确写上你要的 Main-Class


1. 检查你的主类名称及包路径是否正确

你在报错时看到:

text
找不到或无法加载主类 com.example.Main 原因: java.lang.ClassNotFoundException: com.example.Main

这表示 Java 在打包后的 Jar 里找不到 com.example.Main。可能原因:

  • 你的实际主类在 org.example 包下,而不是 com.example;或者包名写错、大小写不一致;
  • 你的 com.example.Main 文件确实存在,但写成 package org.example; 或其它包名;
  • 根本没有带有 public static void main(String[] args) 方法的类,或者类名拼写有误。

先去你项目里确认主类的全路径(注意 package),比如看你的 Main.java 文件最上面声明的 package,是否真的叫 com.example; 然后再看类名、main() 方法都是否符合规范。


2. 让 Shade 插件在 Jar 的 META-INF/MANIFEST.MF 中写入 Main-Class

要想 java -jar xxx.jar 能直接执行,必须在打包时加上 Main-Class 属性。最常见做法就是在 maven-shade-plugin<configuration> 下添加:

xml
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 这里写你真正的主类全路径 --> <mainClass>com.example.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>

请注意把上面的 com.example.Main 改成你实际的完整包名 + 类名。

注意“重复定义”警告

日志里提到:

[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate ...

说明你可能在 pom.xml 不同位置重复写了 <plugin> 配置。要么把多余的 maven-shade-plugin 插件声明删除,要么合并到同一个 <plugin> 里,保证只有一处定义,否则打包过程可能混乱。


3. 确认最终打包好的 Jar 里有没有 Main-Class 属性

把上面 shade 插件配置好后,再执行:

bash
mvn clean package

成功后,在 target 里一般会看到:

  • original-test-1.0-SNAPSHOT.jar(没打依赖、没改 manifest 的原始 jar)
  • test-1.0-SNAPSHOT.jar(shade 之后被“覆盖”成最终 jar)

你可以用以下命令检查是否有 Main-Class

bash
jar -xf test-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF type META-INF\MANIFEST.MF

(或在任意压缩软件里打开 jar,查看 META-INF/MANIFEST.MF

如果里面有类似:

text
Manifest-Version: 1.0 Main-Class: com.example.Main

那就说明配置成功了。


4. 如果还不行,可能是 JavaFX 的特性

你这里依赖了 javafx-controls 等 JavaFX 包,如果你写的是 JavaFX 应用,有时候直接双击 jar在某些 Windows 环境下偶尔会出现不响应(尤其是 JDK path、JavaFX 模块未在 classpath 中或需要模块化配置时)。但是你已经把 JavaFX 打到 uber jar 里了,理论上 java -jar xxx.jar 可以跑起来。如果纯双击没反应,可以先看一下系统关联或者尝试安装某个 Java 版本(如 Azul ZuluFX)来支持 JavaFX GUI 双击启动。

不过最常见的情况,还是你先确认模块路径、Java 版本一致,然后在命令行跑:

java -jar test-1.0-SNAPSHOT.jar

如果能跑起一个 JavaFX 窗口就说明 OK 了。
如果是报类似“无法识别 JavaFX”之类的错误,就要再考虑 <module> 模块化配置等问题。


总结一下你的现状

  1. Shade 生成的 jar 名就是 test-1.0-SNAPSHOT.jar(会覆盖原 jar),所以没有 “shaded.jar” 也没问题,日志里已经写了 “Replacing ... with test-1.0-SNAPSHOT-shaded.jar”。
  2. 之所以报“找不到主类”错误,多半是因为主类名不对或你没在 <mainClass> 里填对。
  3. 确认主类真正的包名,再把 Shade 插件配置写正确,去掉重复的 <plugin> 配置,重新 mvn clean package,看看 MANIFEST.MF 是否包含了 Main-Class 属性。
  4. 最后再在命令行里用 java -jar test-1.0-SNAPSHOT.jar 测试,确保没问题之后再试双击。

इस प्रश्नोत्तर को साझा करें