你帮我看看这个文件哪里出了问题,在IJ里能运行,但打包成jar之后打开,总是报错: A JNI er...
作成日: 2025年2月26日
作成日: 2025年2月26日
你帮我看看这个文件哪里出了问题,在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>
</project>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>
这类“打包后运行报 JNI error 或 Java Exception error,但在 IDE 里能正常跑”的情况,常见原因通常有以下几种,你可以逐一排查:
你的 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”)。
解决办法:
java -version
确认运行环境是 21 或更高。maven-compiler-plugin
的 source
/target
改成你实际运行环境的版本,比如 17、11 或 8 等(前提是代码里没有用到 21 专属的新特性)。如果你想要一个可执行(Executable)Jar,双击或 java -jar
即可运行,单纯用 maven-compiler-plugin
编译可能不够。因为:
MANIFEST.MF
里通常没有配置 Main-Class
或者没有把依赖都合并打包。因此,运行时会在找不到依赖的情况下报各种错误(有时也会显示类似 “NoClassDefFoundError”,但也可能就是 “Java Exception”)。在 IDE 里运行是因为 IDE 自动把所有依赖都加进了 classpath 里。
解决办法:
使用 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
运行。
使用 maven-assembly-plugin 或类似插件也可以实现同样的效果。关键点在于:
MANIFEST.MF
里声明正确的 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
,看看是否正确:
txtManifest-Version: 1.0 Main-Class: com.example.your.MainClass
如果没有,就需要通过插件配置来加上(参考上面 shade 或 assembly 里对 ManifestResourceTransformer
的配置)。
极少数情况下,“A JNI error has occurred” 是因为你使用的某些库需要配合原生库(如 JNI、OpenCV、ffmpeg 等),而原生库版本或路径不对。一般 PDFBox 或 OFD 相关库应该不怎么用 JNI,出问题更多是 Java 版本、依赖丢失或清单文件不对。
如果你确实有原生库依赖,就要检查是否需要放到某个指定目录,或者和你的 jar 放一起并在启动时加 -Djava.library.path=...
等,但这通常不是最常见的原因。
MANIFEST.MF
里写明 Main-Class
。大概率就是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>
从你贴出来的日志和现象来看,核心问题有两点:
com.example.Main
这个主类(也就是 Manifest 里没有写上它,或者确实不存在该类);结合日志分析,你最终得到的 test-1.0-SNAPSHOT.jar
是 Shade 插件“替换”后的产物(它把 -shaded.jar
覆盖成原 jar 名),但 Manifest 里还没正确写上你要的 Main-Class
。
你在报错时看到:
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()
方法都是否符合规范。
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>
里,保证只有一处定义,否则打包过程可能混乱。
Main-Class
属性把上面 shade
插件配置好后,再执行:
bashmvn clean package
成功后,在 target
里一般会看到:
original-test-1.0-SNAPSHOT.jar
(没打依赖、没改 manifest 的原始 jar)test-1.0-SNAPSHOT.jar
(shade 之后被“覆盖”成最终 jar)你可以用以下命令检查是否有 Main-Class
:
bashjar -xf test-1.0-SNAPSHOT.jar META-INF/MANIFEST.MF type META-INF\MANIFEST.MF
(或在任意压缩软件里打开 jar,查看 META-INF/MANIFEST.MF
)
如果里面有类似:
textManifest-Version: 1.0 Main-Class: com.example.Main
那就说明配置成功了。
你这里依赖了 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>
模块化配置等问题。
test-1.0-SNAPSHOT.jar
(会覆盖原 jar),所以没有 “shaded.jar” 也没问题,日志里已经写了 “Replacing ... with test-1.0-SNAPSHOT-shaded.jar”。<mainClass>
里填对。<plugin>
配置,重新 mvn clean package
,看看 MANIFEST.MF
是否包含了 Main-Class
属性。java -jar test-1.0-SNAPSHOT.jar
测试,确保没问题之后再试双击。