Maven项目Java21升级后Jar双击运行报ClassNotFoundException求助
Maven Java21项目Jar包启动问题排查与解决
核心问题分析
java .\vertragsmanager-1.0-SNAPSHOT.jar属于错误的命令语法:Java命令中,直接传入jar文件名会被当作主类全限定名去查找,而非启动jar包,因此必然抛出ClassNotFoundException。- 双击Jar报错大概率和系统默认Java版本不匹配、Jar包的MANIFEST配置异常有关。
解决方案
1. 修正Jar包启动命令
若不用java -jar,需通过类路径指定主类启动,命令格式为:
java -cp .\vertragsmanager-1.0-SNAPSHOT.jar 你的主类全限定名
例:如果GUIStarter在de.odosco包下,命令为:
java -cp .\vertragsmanager-1.0-SNAPSHOT.jar de.odosco.GUIStarter
2. 修复双击Jar的问题
检查系统默认Java版本
打开命令提示符执行:
java -version
确认输出为Java 21。若不是,需将Java 21设置为系统默认JRE:
- 调整环境变量
JAVA_HOME指向Java21安装目录 - 将
%JAVA_HOME%\bin移到系统PATH最前端
验证Jar包的MANIFEST配置
解压Jar包,打开META-INF/MANIFEST.MF,确认存在正确的Main-Class配置:
Main-Class: 主类全限定名
例:主类de.odosco.GUIStarter对应的配置应为Main-Class: de.odosco.GUIStarter,同时检查Jar包内是否存在对应路径的.class文件(如de/odosco/GUIStarter.class)。
调整Maven打包配置
确保pom.xml中maven-jar-plugin正确配置主类,添加或修改如下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- 替换为你的主类全限定名 --> <mainClass>de.odosco.GUIStarter</mainClass> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin> </plugins> </build>
若项目包含第三方依赖,需使用maven-shade-plugin将依赖打包进Jar(避免双击时缺失依赖类):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>de.odosco.GUIStarter</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
重新打包验证
执行Maven命令清理并重新打包:
mvn clean package
之后用java -jar确认Jar正常启动,再尝试双击运行。
3. 主类合法性检查
确保GUIStarter类满足:
- 拥有
public static void main(String[] args)方法 - 类本身为
public访问权限
内容的提问来源于stack exchange,提问作者Odosco
相关产品推荐
相关产品推荐

