当前位置: 首页 > 知识库问答 >
问题:

如何通过Spring。配置。使用命令行Gradle(6.4)构建SpringBoot应用程序时

孟开宇
2023-03-14

我有一个SpringBoot应用程序。项目外部的属性文件(通常不在src/main/resources中)。在使用gradle clean build构建应用程序时,由于代码无法找到属性文件,因此会失败。我尝试了许多命令来传递vm参数,gradle选择了这些参数,但都不起作用。

gradle clean build -Djvmargs="-Dspring.config.location=/users/home/dev/application.properties" //not working

它在测试阶段失败,因为它创建了Spring应用程序上下文,并且无法替换属性占位符。如果我跳过测试作为gradle clean build-x测试,它就会工作。

虽然我可以用java-jar api运行这个应用程序。jar——Spring。配置。位置=文件:/users/home/dev/application。属性

请帮助我如何通过spring.config.location=/user/home/dev/application.properties在gradle构建中使用命令行,以便构建运行所有JUnit测试

共有3个答案

松铭
2023-03-14

我认为这是一个误解。

验证时:

java-jar api。jar——Spring。配置。位置=文件:/users/home/dev/application。属性

Spring配置。位置在运行时使用或需要,而不是在构建时使用或需要。

当您的Spring Boot应用程序正在构建时,需要application.properties。一种方法可以使用带有模板值的src/main/Resources/application.properties,但在运行时您将忽略它spring.config.location=file...

在这种情况下,正如@nikos-bob所说,您必须使用另一个属性,通常在您的src/test/resources中

我们不希望在主git存储库src/main/resources/application中有硬编码的值。所以第一个想法是使用外部属性。但该文件必须存储在另一个git存储库(相当于主存储库)中或手动创建。

Spring和其他框架为我们提供了另一种选择:使用环境变量。

因此,无需手动外部创建应用程序。属性或将其存储在我们的git存储库中,您的spring boot应用程序始终必须有一个应用程序。具有环境变量的属性:

spring.datasource.url=jdbc:oracle:thin:@${DATABASE_HOST}:${DATABASE_PORT}:${DATABASE_SID}
spring.datasource.username=${DATABASE_USER}
spring.datasource.password=${DATABASE_PASSWORD}
spring.mail.host = ${MAIL_HOST}
spring.mail.username =${MAIL_USERNAME}
spring.mail.password =${MAIL_PASSWORD}

优势:

  • 无需手动创建应用程序。属性使我们能够更轻松地实现devops自动化
  • 没有Spring。配置。位置=文件。。是必需的

太叔马鲁
2023-03-14

运行Gradle的系统属性不会自动传递给测试框架。我认为这是为了尽可能地隔离测试,以便环境中的差异不会导致结果的差异,除非以这种方式明确配置。

如果您查看测试任务的Gradle API,可以看到您可以通过任务(Groovy DSL)上的方法来配置系统属性:

test {
    systemProperty "spring.config.location", "/path/to/my/configuration/repository/application.properties"
}

如果还想从Gradle命令行读取系统属性,然后通过测试,则必须首先从Gradle读取该属性,例如作为项目属性,然后将该值传递给测试:

test {
    if (project.hasProperty('testconfig')) {
        systemProperty 'spring.config.location', project.getProperty('testconfig')
    }
}

使用gradle-Ptestconfig=“/path/to/my/configuration/repository/application.properties”构建运行它

但是,如果可以避免的话,我不鼓励在构建命令行上使用系统属性。至少,从长远来看,这会让你非常恼火。如果配置文件可以位于不同机器上的不同位置(取决于您签出存储库的位置,以及它与Spring Boot存储库的相对路径不同),那么您可能需要在personal gradle中指定它。改为属性文件。

金健
2023-03-14

如果我是你,我就不会涉及junit测试的实际属性。因此,我将在src/test/resources/application-test下为项目创建一个测试属性。属性,在junit测试中,我将加载测试属性。

例子:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyProperties.class)
@TestPropertySource("classpath:application-test.properties")
public class MyTestExample{

  @Test
  public void myTest() throws Exception {
  ...
  }

}
 类似资料:
  • 我有一个spring启动应用程序,我需要通过进入文件夹目录并通过命令行启动我的web应用程序来启动它。我有一门课叫应用。java及其内部代码如下所示。 我设置了类路径,然后试图运行命令"",但我得到了这个错误消息""

  • 到目前为止,我发现了两种在启动时配置spring boot应用程序的方法,一种使用< code>-D,另一种使用< code> - ,如下所示: 有时,第一个有效,有时第二个有效。正如开发人员所发现的那样,当以下示例中的 方法未给出 参数时,方法不起作用,但 起作用。 而今天,我在命令行配置日志,发现 但 工作。 以上可能有其他原因,可能< code > log back . configurat

  • 问题内容: 在集成到更大的应用程序之前,我正在尝试测试一个概念验证的命令行应用程序。我想要做的是使用此示例使用NSURLSession下载一些数据。但是,如果使用简单的OS X命令行应用程序中给出的示例,则该应用程序将在检索数据之前退出。 如何使用NSURLSession从独立的命令行应用程序下载数据?我所读的内容是使用NSRunLoop,但是我还没有在Swift中找到明确的示例,因此,如果NSR

  • 问题内容: 我正在尝试使用Gradle构建相对简单的JavaFX应用程序。但是,我不知道该怎么做。 我是Gradle的新手,对于简单的(非javafx)项目,我已经成功使用了插件,并构建和打包了库和命令行应用程序。 但是,关于JavaFX,我完全陷入困境。我已经阅读了这篇文章,该文章建议使用该插件,但是我只能找到该插件的源代码,但是没有关于如何实际使用它的文档(在文章中,他们只是从远程URL应用它

  • 我试图使用Gradle构建一个相对简单的JavaFX应用程序。但是,我完全不知道该怎么做。 我对Gradle比较陌生,对于简单的(非JavaFX)项目,我已经成功地使用了插件和来构建和打包库和命令行应用程序。 然而,当涉及到JavaFX时,我完全被卡住了。我读过这篇文章,其中建议使用插件,但是我只能找到这个插件的源代码,而没有关于如何实际获取它和使用它的文档(在文章中,他们只是从远程URL应用它,

  • 我将Spring Boot应用程序打包为可执行JAR。应用程序有一个带有main方法的实用程序类,我想通过命令行调用它,但命令似乎无法在类路径中找到该类。