首页 > 解决方案 > 带有 Spring Boot 2 的 PropertiesLauncher(并运行 WAR 存档)

问题描述

我正在创建一个基于 tomcat/jsp 的 WAR spring boot 2.0.4 可执行文件,它在仅使用 bootWar gradle 目标时运行良好。但是现在我想加载本地外部 JAR 并且 WarLauncher 不支持这个(有没有理由?)。所以我通过以下方式切换到 PropertiesLauncher:

bootWar {
    enabled = true
    manifest {
        attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
    }
}

现在查看生成的战争文件,清单中的一切看起来都很好,例如:

Start-Class: com.mypackage.Application
Main-Class: org.springframework.boot.loader.PropertiesLauncher

现在我试图找出正确的命令行参数来启动这件事,这有点反复试验,但这让我几乎走到了终点:

java -Dloader.path=WEB-INF/lib-provided,WEB-INF/lib,WEB-INF/classes -jar myapplication-4.0.0.war

所以我基本上查看了 WarLauncher 并尝试通过 loader.path 值重新创建类路径,而不添加 3rd 方 jar,因为首先我只想启动我的应用程序。

我的应用程序的加载看起来不错。

现在我想在我的 3rd 方 jar 所在的位置添加一个“本地”路径。我以为我可以这样做:

java -Dloader.path=WEB-INF/lib-provided,WEB-INF/lib,WEB-INF/classes,jar:file:lib -jar myapplication-4.0.0.war

所以添加一个jar:file:lib这应该意味着我的可运行 WAR 旁边的“lib”文件夹。但这不起作用。也只是将“,lib”添加到 loader.path 不起作用。

唯一有效的是添加完整路径,如“jar:file:/foo/bar/lib”,但我真的希望它相对于当前可运行的 WAR 文件夹。

有人能告诉我如何定义扫描罐子的相对本地文件夹吗?

我希望我能帮助其他人与可运行的 WAR 文件结合使用 PropertiesLauncher,因为它并不是很简单,除了 https://docs.spring.io/spring-boot/docs/current/reference/html/之外没有太多文档可执行jar.html

标签: javaspring-bootclassloaderwar

解决方案


回答我自己的问题,但这可能会有所帮助,因为官方文档不是很好。

如果要包含已定义的 JAR 文件,可以使用:

-Dloader.path=file:/myfolder/my.jar

如果你想包含一个带有多个 jar 的整个导演,你可以这样做:

-Dloader.path=file:/myfolder/

(您可以简单地使用 file:myfolder 使文件夹相对于 WAR)

可以通过阅读 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-上的代码来获得其他变体,例如从 JAR 内部读取boot-loader/src/main/java/org/springframework/boot/loader/PropertiesLauncher.java

真正有帮助的是调试标志:

-Dloader.path=file:/myfolder/ -Dloader.debug=true

您将获得关于 PropertiesLauncher 的类加载问题的 system.outs。

我真的很想看到一个-Dloader.schema=war假设 WAR 布局而不是 JAR 布局的标志。这样一来,只需要在 WAR 中添加自己的路径而不是所需的文件夹。


推荐阅读