【问题标题】:How can I dynamically use externalized properties file with Spring jar?如何动态使用 Spring jar 的外部化属性文件?
【发布时间】:2018-09-25 17:45:38
【问题描述】:

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

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

现在我将我的项目打包为 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\

我在target\ 中手动复制了teste32 来测试它。但这没有用。这也不起作用(仅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 调试行。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    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 的情况下找到它(假设该目录是工作目录)(但您仍然需要提供-Dspring.config.name=teste32

    c) 当你使用-jar 并且不提供额外的类路径时,classpath: 指向 jar 内包的根目录。 Spring 在classpath:/ 找不到您的文件,因为您的文件位于classpath:/xirulei/

    【讨论】:

    • 在使用mvn clean install 构建我的jar 后,我在C:\workspace\myProject\target 手动添加了teste32.yml 文件,如果我错过了该信息,请见谅。但正如你所说,target\classes\xirulei 中确实存在一个副本。
    • 我刚刚尝试不使用spring.config.location,但它不起作用。 '鉴于此目录是工作目录'是什么意思?
    • 哦,cmets 中的格式已损坏 :( 假设有/abc/xyz/myprj.jar 我可以做cd abc; java -jar xyz/myprj.jar 在这种情况下,工作目录将是abc - 即jar目录和工作目录不同如果我这样做cd abc/xyz; java -jar myprj.jar 那么工作目录与jar dir 相同
    • 所以你应该在调用java之前cd target(或Maven放置jar文件的任何地方)
    • 另一个问题 - 您是否提供了您调用或“简化”的确切命令?
    【解决方案2】:

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

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

    而不是

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

    如问题所述,仅当使用 Eclipse -D(JVM 参数)时才需要。使用 bash/cmd 时,只需 --(program argument) 是正确的选项:

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 2012-04-25
      • 2019-06-12
      • 2020-10-15
      • 1970-01-01
      • 2017-06-04
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多