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

使用java -jar运行JAR失败但java -cp正常的技术问题求助

解决java -jar运行JAR时找不到依赖类的问题

执行java -Djava.library.path=lib/ -jar TelegramBot-1.0-SNAPSHOT.jar时出现错误:

Error: Unable to initialize main class com.tgbot.telegrambot.Bota
Caused by: java.lang.NoClassDefFoundError: org/telegram/telegrambots/meta/exceptions/TelegramApiException

但使用java -cp TelegramBot-1.0-SNAPSHOT.jar:lib/* com.tgbot.telegrambot.Bota能正常运行,核心原因是:java -jar默认仅将当前JAR文件加入类路径,不会自动加载lib/下的依赖包,而-cp命令明确指定了所有依赖的路径。

以下是两种可行的解决方法:

方案1:修改JAR的MANIFEST.MF配置类路径

手动修改(临时调整用)

  1. 解压JAR到临时目录:
    unzip TelegramBot-1.0-SNAPSHOT.jar -d temp
    
  2. 编辑temp/META-INF/MANIFEST.MF,在Main-Class行下方添加Class-Path项,列出lib/下所有依赖的JAR文件(比如telegrambots相关依赖):
    Main-Class: com.tgbot.telegrambot.Bota
    Class-Path: lib/telegrambots-meta.jar lib/telegrambots.jar lib/slf4j-api.jar ...
    
    注意:每个JAR之间用空格分隔,路径需相对于JAR文件所在目录。
  3. 重新打包JAR:
    jar cvfm TelegramBot-1.0-SNAPSHOT.jar temp/META-INF/MANIFEST.MF -C temp/ .
    rm -rf temp
    
  4. 再次执行原命令即可正常运行。

Maven自动配置(项目构建用)

如果是Maven项目,在pom.xml中配置maven-jar-plugin,让打包时自动生成包含类路径的MANIFEST.MF:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.tgbot.telegrambot.Bota</mainClass>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

执行mvn package重新打包后,即可用java -jar命令运行。

方案2:构建包含所有依赖的Uber-JAR

将项目本身和所有依赖打包到一个JAR文件中,无需单独的lib目录,直接运行即可。

Maven使用shade插件

在pom.xml中添加maven-shade-plugin配置:

<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>com.tgbot.telegrambot.Bota</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

执行mvn package后,target目录下会生成一个包含所有依赖的JAR文件(通常文件名不带original-前缀),直接运行:

java -Djava.library.path=lib/ -jar target/TelegramBot-1.0-SNAPSHOT.jar

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:37:18