使用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配置类路径
手动修改(临时调整用)
- 解压JAR到临时目录:
unzip TelegramBot-1.0-SNAPSHOT.jar -d temp - 编辑
temp/META-INF/MANIFEST.MF,在Main-Class行下方添加Class-Path项,列出lib/下所有依赖的JAR文件(比如telegrambots相关依赖):
注意:每个JAR之间用空格分隔,路径需相对于JAR文件所在目录。Main-Class: com.tgbot.telegrambot.Bota Class-Path: lib/telegrambots-meta.jar lib/telegrambots.jar lib/slf4j-api.jar ... - 重新打包JAR:
jar cvfm TelegramBot-1.0-SNAPSHOT.jar temp/META-INF/MANIFEST.MF -C temp/ . rm -rf temp - 再次执行原命令即可正常运行。
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
相关产品推荐
相关产品推荐

