【发布时间】:2019-01-17 00:15:00
【问题描述】:
我将尝试将我的问题归结为一个基本的外部 JAR 链接问题,但我无法找到示例/答案。我在同一个目录中有 2 个 JAR,a.jar 和 b.jar。 a.jar 的MANIFEST.MF 包含:Class-Path: b.jar。
基本上,我想运行包含最少应用程序级类的 a.jar,但链接到带有所有其他必要类的大型外部 b.jar。但是运行命令java -jar a.jar 会导致:Exception in thread "main" java.lang.NoClassDefFoundError: com/example/MainApp。
不确定它是否相关,但 b.jar 实际上是一个 Spring Boot JAR,其中包含 BOOT-INF/classes 中的预期类(例如 com/example/MainApp.class)。 b.jar 的MANIFEST.MF 包含:Spring-Boot-Classes: BOOT-INF/classes/。
我想知道是否有一种简单的方法可以实现这一点?如果需要更多详细信息来诊断问题,请告诉我。
更新:
我把com/example/MainApp.class文件复制到b.jar的base目录下,类就找到了!但我想保留原始文件。所以我想这改写了这个问题:你如何指定类在 JAR 中的位置?
【问题讨论】:
-
这个链接应该很有用[baeldung.com/executable-jar-with-maven]
-
好吧,我并没有尝试构建单个胖 JAR,而且我很确定其他步骤只是创建清单文件,因为我已经拥有它,指向
libs/中的外部 JAR。除了我的基本 Class-Path 清单条目之外,Maven 还做了什么? -
我使用maven插件进行spring boot应用程序。该插件在构建目录中创建具有正确配置的jar,您可以毫无问题地运行这个jar文件。
-
是的,但我认为您误解了我的问题。我的 b.jar 作为 Spring Boot 应用程序运行,没有任何问题...但我的 a.jar 无法链接到 b.jar 中的类,因为它们位于
BOOT-INF/classes/com/etc而不是com/etc
标签: java spring-boot jar manifest noclassdeffounderror