Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 属性文件的Spring引导外部配置_Java_Spring Boot - Fatal编程技术网

Java 属性文件的Spring引导外部配置

Java 属性文件的Spring引导外部配置,java,spring-boot,Java,Spring Boot,我有一个spring boot应用程序,我可以将它打包到一个我想要部署到不同环境的war中。要自动化此部署,将配置文件外部化会更容易 目前,一切都可以与src/main/resources中的application.properties文件配合使用。然后我使用“mvn安装”来构建一个可部署到tomcat的war。 但是我想使用一个.yml文件,它不需要出现在mvn安装中,但在war部署期间可以从中读取,并且位于与我的war相同或相对的目录中 显示了SpringBoot将在何处查找文件,并提供了有

我有一个spring boot应用程序,我可以将它打包到一个我想要部署到不同环境的war中。要自动化此部署,将配置文件外部化会更容易

目前,一切都可以与src/main/resources中的application.properties文件配合使用。然后我使用“mvn安装”来构建一个可部署到tomcat的war。 但是我想使用一个.yml文件,它不需要出现在mvn安装中,但在war部署期间可以从中读取,并且位于与我的war相同或相对的目录中

显示了SpringBoot将在何处查找文件,并提供了有关如何配置此文件的更多详细信息,但我不知道如何将其转换为代码

我的应用程序类如下所示: 包be.ugent.lca

Updated below
是否需要将@PropertySource添加到此文件?我将如何引用某个相对路径

我觉得它可能像大多数spring引导文档一样被记录在那里,但我不明白他们是如何让我这么做的

编辑

不确定这是否应该是一个单独的问题,但我认为它仍然是相关的。
设置os变量后,yaml file not found的错误消失了。然而,我仍然会再次遇到与没有application.properties或.yml文件时相同的错误。 应用程序现在如下所示:

@Configuration
**@PropertySource("file:${application_home}/application.yml")**
@ComponentScan({"be.ugent.lca","be.ugent.sherpa.configuration"})
@EnableAutoConfiguration
@EnableSpringDataWebSupport
public class Application extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }
home OS变量的应用程序

$ echo $application_home  
C:\Masterproef\clones\la15-lca-web\rest-service\target
My application.yml文件(它抱怨的部分):

java-jar*.war时出错 以下各项的所有变更:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'sherpa.package.base' in string value "${sherpa.package.base}"
    at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
    at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
    at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
    at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
    at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172)
    at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:808)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1027)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
    ... 142 more

是的,您需要使用
@PropertySource
,如下所示

这里重要的一点是,您需要提供
application\u home
属性(或选择任何其他名称)作为OS环境变量或系统属性,或者您可以在启动Spring boot时作为命令行参数传递。此属性说明配置文件(
.properties
.yaml
)的确切位置(例如:
/usr/local/my_project/
等)


使用外部属性文件

答案就在Spring Boot文档中,我将尝试为您细分它

首先,不,在使用Yaml配置时,您不应该使用
@PropertySource
,如下所述:

无法通过@PropertySource注释加载YAML文件。因此,如果需要以这种方式加载值,则需要使用属性文件

那么,如何加载属性文件呢?这里已经解释过了

已为您加载一个:
application.yml
,请将其放置在上面链接中提到的一个目录中。这对于您的一般配置非常有用

现在,对于要使用外部属性文件的特定于环境的配置(以及密码之类的配置),该部分还介绍了如何使用外部属性文件:

如果不喜欢application.properties作为配置文件名,可以通过指定spring.config.name环境属性切换到另一个。您还可以使用spring.config.location环境属性(以逗号分隔的目录位置或文件路径列表)引用显式位置

因此您使用
spring.config.location
environment属性。 假设您在主目录下的conf/dir中有一个外部配置文件:
application external.yml
,只需这样添加它:
-Dspring.config.location=file:${home}/conf/application external.yml
作为JVM的启动参数。 如果有多个文件,只需用逗号分隔。请注意,您可以轻松地使用这样的外部属性来覆盖属性,而不仅仅是添加属性

我建议通过让您的应用程序只使用内部application.yml文件来测试这一点,然后覆盖外部属性文件中的(测试)属性,并将其值记录在某处

将Yaml属性绑定到对象

在处理Yaml属性时,我通常使用
@ConfigurationProperties
加载它们,这在处理示例列表或更复杂的属性结构时非常有用。(这就是为什么应该使用Yaml属性,对于简单的属性,使用常规属性文件可能更好)。有关更多信息,请阅读以下内容:

额外:在IntelliJ、Maven和JUnit测试中加载这些属性

有时,您希望在maven构建或执行测试时加载这些属性。或者只是为了使用IDE进行本地开发

如果您使用IntelliJ进行开发,您可以通过将其添加到Tomcat运行配置中来轻松地添加它:“运行”->“编辑配置”,在“Tomcat服务器”下选择您的运行配置,检查服务器选项卡并将其添加到“VM选项”下

要在Maven build中使用外部配置文件,请在pom.xml中按如下方式配置Maven surefire插件:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
     <argLine>-Dspring.config.location=file:${home}/conf/application-external.yml
   </configuration>
</plugin>    

org.apache.maven.plugins
maven surefire插件
-Dspring.config.location=文件:${home}/conf/application-external.yml
在IntelliJ中运行JUnit测试时:

  • 跑→ 编辑配置
  • 默认值→ 朱尼特
  • 添加VM选项->
    -ea-Dspring.config.location=文件:${home}/conf/application external.yml

在引导类中使用以下代码:

@PropertySource({"classpath:omnicell-health.properties"})
在控制器中使用以下代码:

@Autowired
    private Environment env;

使用系统环境变量使用外部化属性文件的最简单方法之一是,在application.properties文件中,可以使用以下语法:

spring.datasource.url = ${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/"nameofDB"
spring.datasource.username = ${OPENSHIFT_MYSQL_DB_USERNAME}
spring.datasource.password = ${OPENSHIFT_MYSQL_DB_PORT}
现在,声明上面使用的环境变量

export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd" 

这样,您可以在不同的环境中对同一变量使用不同的值。

您的属性/yml文件在哪里?你想从中读到什么道具?这个问题对我来说似乎不清楚我的编辑是否清理了位置?属性是mos
spring.datasource.url = ${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/"nameofDB"
spring.datasource.username = ${OPENSHIFT_MYSQL_DB_USERNAME}
spring.datasource.password = ${OPENSHIFT_MYSQL_DB_PORT}
export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd"