[英]'maven package' command not picking up externalized .properties file
我正在使用 spring 引导构建后端服务。 包装类型是战争。 我将主应用程序配置外部化,包括位于项目根文件夹(pom.xml 旁边)的名为env.properties
的文件中的 RSA 私钥。 在主application.properties
文件中,我拥有引用env.properties
文件中字段的所有相同字段。 我将application.properties
放在版本控制中,而不是env.properties
。
我这样做的目的是使真正的生产配置远离版本控制,并使每个部署在配置方面具有灵活性。
在开发过程中,设置工作正常,但是当我尝试部署应用程序时出现问题。 运行 mvn clean build 后,我得到一个 .war 文件,当我在 tomcat9 上部署它时,它不会启动 (404)。 如果我尝试使用 java -jar xxx.war 运行.war 文件,则 output 是
$ java -jar xxx.war
23:04:12.260 [main] DEBUG org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception
org.springframework.boot.context.config.ConfigDataResourceNotFoundException: Config data resource 'file [env.properties]' via location 'file:env.properties' cannot be found
at org.springframework.boot.context.config.ConfigDataResourceNotFoundException.withLocation(ConfigDataResourceNotFoundException.java:97)
at org.springframework.boot.context.config.ConfigDataImporter.handle(ConfigDataImporter.java:145)
at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:136)
at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:86)
at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:339)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:297)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
at com.jnairport.yqpay.YqpayApplication.main(YqpayApplication.java:10)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59)
23:04:12.267 [main] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter -
***************************
APPLICATION FAILED TO START
***************************
Description:
Config data resource 'file [env.properties]' via location 'file:env.properties' does not exist
Action:
Check that the value 'file:env.properties' at class path resource [application.properties] - 1:22 is correct, or prefix it with 'optional:'
似乎当我 package 部署应用程序时, maven 没有拿起env.properties
文件。 整个应用程序根本不会运行。
我试图寻找解决方案,但没有任何线索。 请帮忙,谢谢。
我感觉到两个问题(写作意义,因为没有可重复的例子很难确定):
file:env.properties
引用文件很容易出错,因为每个系统上的路径都不同env.properties
文件,因此它不包含在 package 中让我们一一解决
您的参考file:env.properties
不明确。 当您使用file
定义资源位置时,它使用下面的FileSystemResource
。 请参阅有关FileSystemResource
警告的 spring 文档。
因此,当您编写测试时,您的 IDE 会查找项目根路径。 但是当您运行 jar 文件时 - 路径可能不同。 这可能是应用程序无法找到属性文件的原因。
可能最好的方法是在构建过程中将env.properties
打包到 war 文件中,或者(甚至更好)将属性文件中的值设置为环境变量
您可以在应用程序类路径中包含您的env.properties
,而无需对其进行版本控制。 这样,您可以在应用程序代码库中使用classpath:env.properties
引用文件
您需要使用额外的资源位置扩展您的 Maven 构建文件
感谢Jakub Marchwicki 的回复,写的很详细。 我相信它会帮助很多可能在未来寻找类似问题的人。
我通过放弃使用 env.properties 文件进行外部化配置的整个想法解决了这个问题。 经过一番研究,我发现了一种使用 spring 配置文件的更好方法,我在其中保留不同配置文件的配置文件,并在 application.properties 文件中引用所需的配置文件。
例如,我可以有一个application-development.properties
文件和一个application-production.properties
文件。 在开发中,第一个配置文件在主application.properties
文件中被引用,而在生产中,第二个被引用。 用于生产的配置文件当然不受版本控制。
您可能会发现这篇文章很有用: https://springframework.guru/spring-profiles/
希望有帮助,加油!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.