是否可以有多个 application.properties 文件? (EDIT:请注意,这个问题演变成了标题上的问题。)
我尝试有2个文件。
- 第一个位于应用程序 Jar 中的根文件夹中。
- 第二个位于类路径中指定的目录中。
2 个文件都命名为“application.properties”。
是否可以“合并”两个文件的内容? (第二个文件的属性值会覆盖第一个文件的属性值)或者,如果我有一个文件,那么另一个文件将被忽略?
UPDATE 1:可以“合并”内容。昨天好像第一个被忽略了,但似乎是因为当时有什么东西坏了。现在效果很好。
UPDATE 2: 又回来了!同样,仅应用两个文件之一。很奇怪......它是在我使用 Spring Tool Suite 构建应用程序 jar 文件后开始的。而且 Jar 版本似乎总是忽略第二个版本(在类路径中),而在 STS 上运行的扩展版本的行为有所不同。我可以从哪里开始调查呢?
UPDATE 3:
Jar 版本的行为实际上是正确的。这是java.exe的规范。
当指定 -jar 选项时,java.exe 会忽略 -classpath 选项和 CLASSPATH 环境变量,并且类路径将仅包含 jar 文件。因此,类路径上的第二个 application.properties 文件将被忽略。
现在,如何加载类路径上的第二个 application.properties ?
UPDATE 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属性启动器无法使用 https://stackoverflow.com/questions/21322673/spring-boot-properties-launcher-unable-to-use。顺便说一句,在 Spring Boot Maven 插件文档中(http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/maven-plugin/repackage-mojo.html 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(扩展)版本,可能存在类路径顺序问题。
(顺便说一句,我更改了问题的标题以更具体地解决这个问题。)