1

我想使用WinRun4J将 Spring Boot 应用程序作为 Windows 服务运行。它不起作用,因为 WinRun4J 无法找到主类。我注意到这是因为 spring-boot-maven-plugin 在 BOOT-INF 文件夹中收集了源代码,它无法访问那里的类。这是错误跟踪:

[info] Registering natives for Native class
[info] Registering natives for FFI class
 [err] Could not find service class
 [err] Failed to initialise service: 1
java.lang.NoClassDefFoundError: SpringBootLauncherService
Caused by: java.lang.ClassNotFoundException: SpringBootLauncherService
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)

有没有办法在 BOOT-INF 文件夹之外生成带有所需类的 Spring Boot 可执行 jar?或者您是否知道使用 Spring Boot 和 WinRun4J 的完整示例?

spring-boot-maven-plugin生成的jar结构如下:

myapp-0.0.1-SNAPSHOT.jar
|--- org: Spring Boot Loader classes
|--- META-INF: maven/ & MANIFEST-MF
|--- BOOT-INF: lib/ & classes/

我相信我需要这样的东西:

myapp-0.0.1-SNAPSHOT.jar
|--- org: Spring Boot Loader classes
|--- META-INF: maven/ & MANIFEST-MF
|--- BOOT-INF: lib/ & classes/
|--- SpringBootLauncherService.class

我将不胜感激任何帮助。

4

1 回答 1

3

我能够使其工作如下。

  • 我使用 bootRepackage 分类器属性强制 Spring Boot 创建 2 个 JAR:一个具有 Spring Boot 结构,另一个是可用于其他目的的普通 JAR,例如与 WinRun4J 集成。这在使用 Spring Boot 应用程序作为依赖项中得到了很好的解释
  • 我从可执行 JAR 中提取了 lib,并将该文件夹添加到 WinRun4J 的 INI 文件中的类路径中。classpath.1=the-springboot-app.jar classpath.2=./lib/*
  • 仍然在 INI 文件中,我添加了vmarg.1=-Dloader.main=the.springboot.app.Application以便SpringBootLauncherService使用 SpringBoot PropertiesLaucher 的类可以解析加载器类。
  • service.class 在 INI 中设置为service.class=the.springboot.app.SpringBootLauncherService
于 2017-02-27T20:50:17.870 回答