You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何执行简单JAR?解决Maven构建JAR依赖缺失报错问题

解决JAR运行时NoClassDefFoundError的问题

你的问题核心是:生成的JAR包没有正确关联依赖项,导致运行时找不到Akka相关的类。下面分两种方案帮你解决,你可以根据需求选择:

方案一:修复现有依赖配置(保留分离的依赖库)

1. 调整Maven依赖插件的输出路径

你当前把依赖拷贝到了src/main/java/resources/lib,这个路径既不符合Maven标准目录结构,也和JAR manifest里指定的lib/路径不匹配(manifest里的lib/是相对于JAR文件的外部目录)。修改maven-dependency-plugin的配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <outputDirectory>${project.build.directory}/lib</outputDirectory>
    <overWriteReleases>false</overWriteReleases>
    <overWriteSnapshots>false</overWriteSnapshots>
    <overWriteIfNewer>true</overWriteIfNewer>
  </configuration>
</plugin>

这样依赖会被自动拷贝到target/lib目录,和你的JAR文件(target/distributed-1.0.0.jar)处于同一层级,完美匹配manifest的类路径配置。

2. 完善编译插件配置

你的maven-compiler-plugin没有指定Java版本,可能导致编译兼容性问题,补充上版本设置(根据你的实际Java版本调整,比如1.8):

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.5.1</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
  </configuration>
</plugin>

3. 简化批处理脚本

现在不需要单独调用dependency:copy-dependencies,因为我们已经把它绑定到了package阶段,执行mvn package时会自动拷贝依赖:

call mvn clean package
call cd target
call java -jar distributed-1.0.0.jar
pause

方案二:打包成包含所有依赖的Fat Jar(更简单)

如果不想单独管理依赖库,可以使用maven-shade-plugin直接把所有依赖打包到一个可执行JAR里,这样运行时不需要额外的lib目录:

1. 添加Shade插件到POM

替换原来的maven-jar-plugin(也可以保留,Shade会生成独立的包含依赖的JAR):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.2.4</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>com.ipca.distributed.Implementations</mainClass>
          </transformer>
        </transformers>
      </configuration>
    </execution>
  </executions>
</plugin>

2. 修改批处理脚本

打包后会生成一个distributed-1.0.0-shaded.jar(你也可以在插件配置里自定义输出名称),直接运行这个JAR即可:

call mvn clean package
call cd target
call java -jar distributed-1.0.0-shaded.jar
pause

为什么原来的配置会出错?

  • 依赖被拷贝到了src/main/java/resources/lib,这个目录会被打包到JAR内部,但Java默认不会从JAR内部的lib/路径加载依赖类。
  • Manifest里的classpathPrefix是lib/,它指向的是JAR文件外部的lib目录,而你的依赖并没有放在那里,所以运行时找不到类。

内容的提问来源于stack exchange,提问作者user11341081

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:45:27