【问题标题】:Springboot mvn clean install not defining property holders?Springboot mvn clean install 没有定义属性持有者?
【发布时间】:2021-07-19 20:37:09
【问题描述】:

我有一个非常简单的 Springboot 项目,如果运行 JUnit,它会使用本地内存 H2 数据库接入 DAO。我有 2 个配置文件,application-local.propertiesapplication-TEST.properties。有一个 DataSourceProvider 类具有属性持有者,例如:

@Value("${spring.datasource.schema}")
String dbSchema;

@Value("${spring.datasource.url}")
String dbUrl;

...

在运行 SpringBoot 主类并命中端点以及运行 DAO 层 JUnit 测试时,这些属性可以很好地加载,但是当我执行 mvn clean install 时,它告诉我:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.datasource.schema' in value "${spring.datasource.schema}"

我现在已经花了一段时间,但我无法弄清楚为什么会发生这种情况?

【问题讨论】:

  • 很难说没有全貌。但是您可能需要将您的配置文件(本地、测试)绑定到 pom.xml 中的构建配置。
  • 您在运行 mvn 命令时是否指定了所需的配置文件?类似mvn .... -Dspring-boot.run.jvmArguments="-Dspring.profiles.active=local"
  • 您也可以一起删除配置文件,并将 application-TEST.properties 更改为 application.properties 并将其放在 src/test/resources... 或像 @AbdelghaniRoussi 一样在构建时调用您的配置文件。
  • @AbdelghaniRoussi 我工作的另一个仓库有两个不同的属性文件名,就像上面提到的一样,我不需要为弹簧配置文件传递任何参数。

标签: java spring spring-boot maven


【解决方案1】:

通常人们为不同的配置文件创建类似application-{profile}.properties 的属性文件,然后他们将配置文件(本地,测试)绑定到 pom.xml 中的构建配置,正如@AlgorithmFromHell 所说。 您仍然可以在 Spring Boot 中拥有不同的属性文件,但您必须手动加载它们才能像这样使用它们:

@PropertySource({
        "classpath:application-TEST.properties", 
        "classpath:application-local.properties",
        "classpath:application.properties"
})

更新

因为评论区,我添加了这部分

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Dvar1=value1 -Dvar2=value2</argLine>
    </configuration>
</plugin>

【讨论】:

  • 所以这在大多数情况下都有效,但是有一个名为 dbPass 的值,在我的应用程序本地文件中,我将其设置为 dbPass=${oraclePass},我在其中定义了 oraclePass在我的运行配置中的环境选项卡中。我计划将此通行证作为配置映射中的一个键以供部署使用,无论如何我可以考虑使用 mvn clean install 吗?
  • @stackerstack 如果您将oraclePass 定义为像-DoraclePass=mypassword 这样的vm 选项,您可以在application-local.properties 中访问它的值,例如dbpass=${oraclePass},然后注入dbpass value(=我的密码)像往常一样。我认为这个链接对你有用maven.apache.org/configure.html
  • 是的,所以我在 runco​​nfigs 的“环境”选项卡中定义了 oraclePass,我认为这与手动将其作为 vm 选项传入是一样的。然后我的应用程序属性文件中有一个dbPass=${oraclePass},然后通过@Value 注入它。但是,运行 mvn clean install 会在此密码上捕获错误:``` 无法解析值“${oraclePassword}”中的占位符“oraclePassword”```
  • @stackerstack 我认为您正在使用 Eclipse 进行开发。我不知道环境在 Eclipse 中的含义采取 a look at this 。对于部署,您只有 Maven,并且有几种方法可以让您为 Maven 设置 vm 选项,我们通常使用的一种是设置/导出 MAVEN_OPTS 变量
  • @stackerstack do mvn clean install 像往常一样,如果你想从命令行运行你的 Spring Boot,这样做 mvn -Dspring-boot.run.jvmArguments="-Ddbpass=password -Dvar1=value1 -Dvar2=value2" spring-boot:run
猜你喜欢
  • 2018-10-08
  • 2011-08-26
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多