当前位置: 首页 > 面试题库 >

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

罗安宁
2023-03-14
问题内容

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

我试图有2个文件。

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

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

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

更新1 :可以“合并”内容。昨天似乎第一个被忽略了,但这似乎是因为那时有些问题。现在它运作良好。

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

更新3

Jar版本的行为实际上是正确的。这是java.exe的规范。当指定-jar选项时,java.exe将同时忽略-
classpath选项和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>

构建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文件。

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

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

(顺便说一句,我更改了该问题的标题,使其更加针对此问题。)


问题答案:

使用-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>

构建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文件。

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

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



 类似资料:
  • 我试着有两个文件。 第一个在应用程序JAR的根文件夹上。 第二个在类路径中指定的目录上。 2个文件都名为“Application.Properties”。 事实上,Jar版本的行为是正确的。这是java.exe的规范。当指定-jar选项时,java.exe同时忽略-CLASSPATH选项和CLASSPATH环境变量,并且类路径将只包含jar文件。因此,类路径上的第二个application.pro

  • 问题内容: 我尝试有2个文件。 第一个位于应用程序Jar的根文件夹中。 第二个在类路径中指定的目录上。 2个文件都命名为“ application.properties”。 是否可以“合并”两个文件的内容?(第二个属性的值会覆盖第一个属性的值)或者,如果我有一个文件,则另一个文件会被忽略? 更新1:可以“合并”内容。昨天似乎第一个被忽略了,但这似乎是因为那时有些问题。现在它运作良好。 更新2:又回

  • 有一个选项可以忽略Spring Bootjar包application.properties文件,并从服务器上的目录中搜索application.properties的属性值。 在使用spring boot运行jar应用程序的服务器上,我需要应用程序在服务器上的另一个目录中查找application.properties文件的属性值,而不考虑jar中现有的boot-inf\classes\appl

  • 是否可以用交易发送任意文本? 是的。文本应该是ASCII编码的,并在交易的数据中以十六进制字符串的形式提供。示例如下: RawTransaction.createTransaction( <nonce>, GAS_PRICE, GAS_LIMIT, "0x<address>", <amount>, "0x<hex encoded text>"); byte[] signedMes

  • 我想检查一个现有的文件是否在一个特定的目录或子目录中。

  • Java中的jlink功能允许您为应用程序创建单独的运行时环境。通常,此应用程序所需的所有模块都由jlink压缩成一个大的“模块”文件。 我很感兴趣的是,是否有办法去掉一些模块,使它们成为单独的jar文件,但让jlink能够找到它们并仍然运行应用程序。有没有办法做到这一点? 例如,如果您正在处理一个LGPL库,那么就是这种情况的一个用例。您可能希望将LGPL库从庞大的模块“blob”中删除,并将其

  • 问题内容: 使用ES6,我可以从这样的文件导入多个导出: 但是,我喜欢每个文件有一个模块的组织。我最终得到这样的进口: 我希望能够做到这一点: 或类似的名称,并且每个文件都包含一个默认导出,并且每个模块的名称与其文件相同。 这可能吗? 问题答案: 我认为这不可能,但是模块名称的解析取决于模块加载器,因此可能有支持此功能的加载器实现。 在此之前,您可以使用仅包含以下内容的中间“模块文件” 它会让你做