如何在Spring jar中动态使用外部化属性文件?

时间:2018-09-25 17:45:38

标签: java spring spring-boot

使用此设置(从Eclipse使用Windows10)

enter image description here enter image description here

我能够正确启动SpringBoot应用程序。这个也起作用(相同的目录模式):

enter image description here

现在,我将我的项目打包为JAR,并且我想使用外部属性文件。我在同一目录下JAR旁边有一个teste32.yml文件(也尝试在/config目录内使用它,如显示here所示,但它也不起作用)

我想每次都动态地使用JAR文件旁边的属性文件。不管它们在哪个目录下,我都想动态地始终指向一个属性文件,该文件始终与JAR处于同一目录。我想对我的客户说:“获取这个JAR和这个文件,将它们放在任何您想要的位置,然后运行此命令X,一切都会好起来的”。我试图发现命令X,但在添加一些动态路径之前,我尝试使用绝对路径。我正在使用这个:

java -jar myJar.jar -Dspring.config.name=teste32 -Dspring.config.location=C:\workspace\myProject\target\

我手动在teste32内复制了target\进行测试。但这没有用。这也不起作用(仅spring.config.location个变体):

-Dspring.config.location=file:C:\workspace\myProject\target\
-Dspring.config.location=classpath:/
-Dspring.config.location=file:C:/workspace/myProject/target/
I also tried with no spring.config.location, only name

所以我的问题是:

  1. classpath:file:是什么意思?到目前为止,我凭运气获得了2种正确的设置,我想了解何时使用它们。
  2. 当我的项目包为JAR时,classpath变成什么?
  3. 最后,为了始终在与JAR相同的目录中动态使用属性,必须使用哪种组合?

更新 在正确的示例上使用--debug时,我非常恳求这一行(仍然显示Spring标语):

2018-09-25 15:45:14.480 DEBUG 11360 --- [           main] o.s.b.c.c.ConfigFileApplicationListener  : Loaded config file 'file:src/main/resources/xirulei/teste32.yml' (file:src/main/resources/xirulei/teste32.yml)

但是将myJar.jarteste32.yml移动到特定目录并运行java -jar myJar.jar -Dspring.config.name=teste32 --debug之后(没有spring.config.location,因为teste32与JAR处于同一目录) ,我只是没有得到任何ConfigFileApplicationListener调试行。

2 个答案:

答案 0 :(得分:0)

a)java -jar myJar.jar -Dspring.config.name=teste32 -Dspring.config.location=C:\workspace\myProject\target

您是否检查了target目录的内容?我很确定您的cfg文件已放置到target\classes\xirulei,这就是为什么Spring在target找不到它的原因

b)当将teste32.yml与jar文件放在同一目录中时,Spring必须能够找到它(假定该目录为工作目录)而没有-Dspring.config.location(但是您仍然需要提供{ {1}})

c)当您使用-Dspring.config.name=teste32并且不提供其他类路径时,-jar指向jar内包的根目录。 Spring无法在classpath:上找到您的文件,因为您的文件位于classpath:/

答案 1 :(得分:0)

好吧,毕竟这是一个简单的错误。正如documentation says和已经指出的here一样,它应该是

java -jar myproject.jar --spring.config.name=myproject

不是

java - jar myproject.jar -Dspring.config.name=myproject

如问题所述,仅在使用Eclipse -D(JVM参数)时是必需的。使用bash / cmd时,仅--(程序参数)是正确的选项:

enter image description here