Spring Boot,无法从依赖项 jar 中读取 application.properties

Posted

技术标签:

【中文标题】Spring Boot,无法从依赖项 jar 中读取 application.properties【英文标题】:Spring Boot, cannot read application.properties from a dependency jar 【发布时间】:2020-07-08 13:46:19 【问题描述】:

我有这种情况。我正在使用 Spring Boot 开发 REST 服务,并且我有一个依赖项 jar,这是我使用此方法作为依赖项包含的另一个 Spring Boot 项目:

https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/maven-plugin/examples/repackage-classifier.html

一切都完美编译,我可以从依赖 jar 中调用类。在依赖项 jar 中的代码中,我使用 @Value 注释从“父”项目的 application.properties 中读取值,但它始终返回 null。

如果我尝试从父项目中读取相同的值,它会起作用。

为了避免奇怪的双重属性文件,我删除了依赖jar中的原始application.properties文件,但没有任何变化。

关于如何解决这个问题的任何想法?

提前致谢。

【问题讨论】:

【参考方案1】:

我能想到两个你可以尝试的选择。

#1

尝试将父 application.properties 包含在 @PropertySources 注释中。您可能必须确保两个应用程序之间的属性文件不同。在this answer中有更多描述。

#2

将父项目设置为具有可以在应用程序中注入的配置属性类,并检索必要的属性。

父项目可能有这样的类:

@Data // Part of the Lombok project, creates the getters/setters automatically
@ConfigurationProperties(prefix = "application.specific.prefix")
public class ApplicationConfig 
    private String someValue;
    private Integer importantNumber;

您的application.properties 如下所示:

application.specific.prefix.some-value=Spring Boot is great!
application.specific.prefix.important-number=42

在您的 Spring 控制类中,您可以包含以下资源:

@Autowired
private ApplicationConfig applicationConfig;

然后你可以调用你需要的属性:

applicationConfig.getSomeValue();

Baeldung has a helpful guide to @ConfigurationProperties

【讨论】:

【参考方案2】:

解决了。谢谢你的回复!

我解决了问题并在这里写下解决方案,也许它对其他人有用。

首先,我犯了一个愚蠢的错误,我忘了把bean放在@Autowired下! :-D

但是还有一件事要做,为了让父项目自动装配依赖bean,我们必须在父项目的Config类中使用@ComponentScan添加它的包。

在此之后,父项目中的所有属性都正确注入到依赖bean中。

谢谢。

最好的问候。

【讨论】:

【参考方案3】:

此问题已在 this 帖子中解决。如果您正在使用 Maven,请尝试从您的主 pom.xml 中删除 <package> 标记以使用默认值(jar),并告诉 Spring-Boot 加载和读取资源。

更多关于 Maven 生命周期的信息参考here

【讨论】:

以上是关于Spring Boot,无法从依赖项 jar 中读取 application.properties的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring boot 插件 2.0.x 从一个具有不同依赖项的 gradle 项目生成 2 个 jars

如何使用spring boot plugin 2.0.x从一个具有不同依赖项的gradle项目生成2个jar

Spring Boot 无法从 Spring Cloud AWS Core 依赖项启动

Spring Boot scanBasePackages无法从依赖项中找到bean

Spring Boot 完全可执行的 jar,内部没有依赖项

Gradle:使用 Spring Boot 依赖项构建“fat jar”