【发布时间】:2021-08-02 20:40:02
【问题描述】:
我有一个简单的 maven 项目,它在 target 目录中创建一个名为 test.jar 的可执行 jar 文件。
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<main.class>com.me.Main</main.class>
</properties>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>${main.class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
当我使用java -jar target\test.jar 运行时,一切运行正常,但是当我尝试使用-cp 运行没有-jar 的jar 时,我可以将内容添加到类路径中,例如(Windows)java -cp target\test.jar com.me.Main 我明白了。 ..
Error: Could not find or load main class com.me.Main
Caused by: java.lang.ClassNotFoundException: com.me.Main
我也尝试了其他版本,例如java -cp "target\test.jar" com.me.Main,但无论如何它似乎都不起作用。我错过了什么?
更新
MANIFEST.mf 看起来像这样
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.me.Main
Spring-Boot-Version: 2.2.12.RELEASE
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
这似乎表明 spring-boot 正在覆盖 Main-Class KV。
【问题讨论】:
-
我无法重现该问题,只是创建了一个可执行 jar,我可以以两种方式运行它(Java 11)。
-
我认为 Spring Boot 插件使用了启动器,即它没有构建传统的可执行 jar,而是进行了奇怪的 jar-files-inside-other-jar-files 捆绑。这意味着将在那里注册的主类将有一个特定于 Spring 的类,它只调用您的真正主类(检查生成的 jar 的清单以了解详细信息)。
-
慷慨的獾在这里是正确的,你必须使用的主要类是
org.springframework.boot.loader.Launcher。查看文档以获取更多信息:docs.spring.io/spring-boot/docs/current/reference/html/… -
@GenerousBadger 看起来是这样。将 spring boot maven 插件换成程序集插件似乎有助于解决这种情况。让我确认一些事情。
-
@GenerousBadger 我会提出一个答案,你可以改进它,我会接受你的,好吗?这样你就可以获得信用
标签: java spring-boot jar executable-jar spring-boot-maven-plugin