【问题标题】:Run a non main class from Spring Boot jar file从 Spring Boot jar 文件运行非主类
【发布时间】:2021-05-27 17:53:35
【问题描述】:

我有一个 spring boot jar 文件,里面有一个清单文件,如下所示

Manifest-Version: 1.0
Implementation-Title: myApp
Implementation-Version: 0.1
Built-By: me
Implementation-Vendor-Id: com.myApp
Spring-Boot-Version: 2.0.0.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.myApp.smartlight.BootMongoDBApp
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_151

其中有一个名为com.myApp.initiate.Initiator的类文件(打包在jar内的BOOT-INF/classes文件夹下)。我正在尝试从 Windows 机器上的命令行运行 Initiator 类,如下所示

java -cp myApp.jar com.myApp.initiate.Initiator

但没有运气。我还尝试在上述命令中提及类路径为

java -cp "myApp.jar;BOOT-INF/*" com.myApp.initiate.Initiator

但还是不行。

我做错了什么?

Initiator.java

package com.myApp.initiate.Initiator;

public class Initiator {

    public static void main(String... args) {

        System.out.print("hello");
    }
}

更新:

Initiator 类被打包在 BOOT-INF/classes 文件夹下。当我在 jar 根目录复制它并尝试下面的命令时,它起作用了

myApp.jar
|
|--org
|--BOOT-INF
|--META-INF
|--Initiator.class
java -cp myApp.jar Initiator
hello

【问题讨论】:

  • 您能否添加一些代码,以便我们查看您的应用程序的功能?
  • 为什么你认为那还是不行?顺便说一句,包名中只使用小写字符
  • @Jens 这只是一个常规的 Spring Boot 应用程序,可以通过命令行正常运行。 Ans Initiator 类现在只打印“hello”。我从与 jar 文件相同的目录运行上述命令。
  • spring-boot 应用在哪里。 @SpringBootApplication 注解在哪里?

标签: java spring-boot jar classpath


【解决方案1】:

运行 Spring Boot 应用程序 jar 的标准方法是使用

java -jar myApp.jar

要运行不同的类,您需要切换到使用org.springframework.boot.loader.PropertiesLauncher 并将loader.main 属性添加到命令行以选择不同的类。

所以你的清单必须包含:

Main-Class: org.springframework.boot.loader.PropertiesLauncher

然后在命令行上:

java -jar myApp.jar -Dloader.main=com.myApp.initiate.Initiator

请查看文档以获取更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-property-launcher-features

【讨论】:

  • jar 通过上述命令运行良好。我想在运行 Spring Boot 应用程序之前运行不同的类文件(Initiator)。您可以检查 OP 中提到的清单条目,因为我要运行的不是主类/启动类。
  • @qwerty 看看我更新的答案。我错过了这样一个事实,即您的 Start-Class 在清单中是不同的。
  • 感谢您的更新。 java -jar 将运行 Spring Boot jar ......在我的情况下我不想要。我只是想运行一个类文件,它位于上述文件夹的那个 jar 中。
  • 仔细阅读。您需要切换到 PropertiesLauncher 并使用 -Dloader.main 指定一个替代类
  • 我设法让它通过:java -cp myApp.jar -Dloader.main=com.myApp.initiate.Initiator org.springframework.boot.loader.PropertiesLauncher
猜你喜欢
  • 2021-10-13
  • 2018-09-26
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2017-06-30
相关资源
最近更新 更多