Spring Boot:是否可以在带有胖 jar 的任意目录中使用外部 application.properties 文件?

新手上路,请多包涵

是否可以有多个 application.properties 文件? ( 编辑:请注意,这个问题演变为标题上的问题。)

我试图有2个文件。

  • 第一个位于应用程序 Jar 的根文件夹中。
  • 第二个在类路径中指定的目录上。

2 个文件都被命名为“application.properties”。

是否可以“合并”两个文件的内容? (并且第二个的属性值覆盖第一个的)或者,如果我有一个文件,那么另一个文件被忽略?

更新 1 :可以“合并”内容。昨天好像第一个被忽略了,但似乎是因为当时有什么东西坏了。现在它运作良好。

更新2 :又回来了!同样,仅应用了两个文件中的一个。这很奇怪……它是在我使用 Spring Tool Suite 构建应用程序 jar 文件之后开始的。而且似乎 Jar 版本总是忽略第二个(在类路径中),而在 STS 上运行的扩展版本的行为各不相同。我可以从哪里开始调查?

更新 3

Jar 版本的行为实际上是正确的。这是java.exe的规范。当指定 -jar 选项时,java.exe 将忽略 -classpath 选项和 CLASSPATH 环境变量,并且类路径将仅包含 jar 文件。因此,类路径上的第二个 application.properties 文件将被忽略。

现在,如何让类路径上的第二个 application.properties 被加载?

更新 4

在使用 -jar 选项时,我设法在外部路径中加载了 application.properties 文件。

关键是PropertiesLauncher。

要使用 PropertiesLauncher,必须像这样更改 pom.xml 文件:

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>  <!-- added -->
                <layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
            </configuration>
        </plugin>
    </plugins>
</build>

为此,我引用了以下 StackOverflow 问题: spring boot properties launcher cannot use .顺便说一句,在 Spring Boot Maven 插件文档( http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html )中,没有提到指定 ZIP 触发器使用 PropertiesLauncher。 (也许在另一个文件中?)

构建 jar 文件后,我可以通过检查 jar 中 META-INF/MENIFEST.MF 中的 Main-Class 属性看到使用了 PropertiesLauncher。

现在,我可以按如下方式运行 jar(在 Windows 中):

 java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar

请注意,应用程序 jar 文件包含在 loader.path 中。

现在 C:\My\External\Dir\config 中的 application.properties 文件已加载。

作为奖励,该目录中的任何文件(例如,静态 html 文件)也可以被 jar 访问,因为它位于加载程序路径中。

至于 UPDATE 2 中提到的非 jar(扩展)版本,可能存在类路径顺序问题。

(顺便说一句,我更改了问题的标题以更具体地针对这个问题。)

原文由 zeodtr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 650
2 个回答

在使用 -jar 选项时,我设法在外部路径中加载了 application.properties 文件。

关键是PropertiesLauncher。

要使用 PropertiesLauncher,必须像这样更改 pom.xml 文件:

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>  <!-- added -->
                <layout>ZIP</layout> <!-- to use PropertiesLaunchar -->
            </configuration>
        </plugin>
    </plugins>
</build>

为此,我引用了以下 StackOverflow 问题: spring boot properties launcher cannot use .顺便说一句,在 Spring Boot Maven 插件文档( http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html )中,没有提到指定 ZIP 触发器使用 PropertiesLauncher。 (也许在另一个文件中?)

构建 jar 文件后,我可以通过检查 jar 中 META-INF/MENIFEST.MF 中的 Main-Class 属性看到使用了 PropertiesLauncher。

现在,我可以按如下方式运行 jar(在 Windows 中):

 java -Dloader.path=file:///C:/My/External/Dir,MyApp-0.0.1-SNAPSHOT.jar -jar MyApp-0.0.1-SNAPSHOT.jar

请注意,应用程序 jar 文件包含在 loader.path 中。

现在 C:\My\External\Dir\config 中的 application.properties 文件已加载。

作为奖励,该目录中的任何文件(例如,静态 html 文件)也可以被 jar 访问,因为它位于加载程序路径中。

至于 UPDATE 2 中提到的非 jar(扩展)版本,可能存在类路径顺序问题。

原文由 zeodtr 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您没有更改 Spring Boot 的默认值(意味着您正在使用 @EnableAutoConfiguration@SpringBootApplication 并且没有更改任何属性源处理),那么它将按照以下顺序查找属性(最高覆盖最低):

  1. A /config 当前目录的子目录
  2. 当前目录
  3. 一个 类路径 /config
  4. 类路径根

上面的列表在 部分文档中提到

这意味着如果在 application.properties src/resources 属性,将被在 application.properties 中找到的具有相同名称的属性覆盖 /config 打包 jar 的“下一个”目录。

Spring Boot 使用的这种默认顺序允许非常简单的配置外部化,从而使应用程序易于在多个环境(开发、登台、生产、云等)中配置

要查看 Spring Boot 提供的用于属性读取的整套功能(提示:比从 application.properties 读取更多可用功能)请查看文档的 这一 部分。

从我上面的简短描述或完整文档中可以看出,Spring Boot 应用程序对 DevOps 非常友好!

原文由 geoand 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题