带有Spring Boot 2(并运行WAR存档)的PropertiesLauncher

时间:2018-09-07 08:48:46

标签: java spring-boot classloader 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提供的,WEB-INF / lib,WEB-INF / classes -jar myapplication-4.0.0.war

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

我的应用程序加载正常。

现在,我想在我的第3方jars所在的位置添加一个“本地”路径。我以为我可以做到:

java -Dloader.path = WEB-INF / lib提供的,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文件夹。

有人可以告诉我如何定义扫描Jars的相对本地文件夹吗?

我希望我可以帮助其他在使用PropertiesLauncher时遇到问题并与可运行的WAR文件结合在一起的人,因为它并不是真正的简单易懂,并且除了本文之外没有太多的文档资料 https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html

1 个答案:

答案 0 :(得分:0)

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

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

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

如果要包括一个有多个罐子的整个导演,可以执行以下操作:

-Dloader.path=file:/myfolder/

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

其他变量,例如从JAR内部读取,可以通过在以下位置读取代码来获得 https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-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中添加自己的路径,而无需添加文件夹。