Maven Java项目NetBeans运行正常,打包JAR后报ClassNotFoundException求助
你打包出的JAR只包含自身项目代码,Maven默认不会将runtime等scope的依赖包(比如MySQL驱动、AbsoluteLayout这类)打包进去。NetBeans运行时会自动把所有依赖加入类路径,所以能正常执行;但单独运行JAR时,JVM找不到这些依赖类,就会抛出ClassNotFoundException或“找不到JDBC驱动”的错误。
下面提供三种可行方案,任选其一即可:
方法一:用maven-assembly-plugin打包含所有依赖的胖JAR
修改你的pom.xml,在<build><plugins>节点内添加以下插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>NIS.NIS</mainClass> <!-- 与你原配置的主类保持一致 --> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
配置完成后,在NetBeans中执行clean和package命令,打包完成后,target目录会生成两个JAR文件:一个是原有的轻量JAR,另一个是带-jar-with-dependencies后缀的胖JAR,直接运行这个胖JAR即可。
方法二:用maven-shade-plugin打包(灵活性更高)
如果assembly插件无法满足需求,可改用shade插件,同样在<build><plugins>节点内添加:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>NIS.NIS</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
执行package命令后,target目录下的主JAR就是包含所有依赖的可执行JAR,直接运行即可。
方法三:手动指定类路径运行原JAR
若不想打包胖JAR,可将所有依赖包(含MySQL驱动)统一放到一个lib目录,再通过命令行指定类路径运行:
- 先执行
mvn dependency:copy-dependencies,将所有依赖复制到target/dependency目录 - 将原JAR和
dependency目录放在同一位置,执行以下命令:
java -cp "你的JAR文件名.jar:./dependency/*" NIS.NIS
注意:Windows系统需将冒号:替换为分号;
你pom.xml里的unknown-jars-temp-repo是NetBeans自动生成的临时仓库,建议将AbsoluteLayout和jcalendar-1.4替换为Maven中央仓库可找到的正式依赖,避免后续构建或打包出问题。比如jcalendar可改用中央仓库的依赖:
<dependency> <groupId>com.toedter</groupId> <artifactId>jcalendar</artifactId> <version>1.4</version> </dependency>
内容的提问来源于stack exchange,提问作者mohamed boulaoudja

