【问题标题】:Setting Spring applicationContext properties from POM file从 POM 文件设置 Spring applicationContext 属性
【发布时间】:2017-03-09 14:02:37
【问题描述】:

我的 applicationContext.xml 文件中有以下配置:

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:application.properties</value>             
                <value>classpath:database.properties</value>
            </list>
        </property>
    </bean>

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${smtp.host}" />
    </bean>

在我的 POM 文件中设置 smtp.host,如下所示:

<build>
    <defaultGoal>install</defaultGoal>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    ...
</build>

<profile>
    <id>local</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <application.env>local</application.env>
        <profile.scope>compile</profile.scope>
        <skip.test>true</skip.test>
        <smtp.host>my.smtp.server</smtp.host>
    </properties>
</profile>

在部署我的应用程序时,我遇到了一条错误消息,指出 Spring 无法解析 smtp.host。我在 application.properties 文件中添加了以下映射:

smtp.host=${smtp.host}

但是 Spring 开始抱怨我在属性上有一个循环占位符引用。我有什么遗漏吗?

谢谢!

【问题讨论】:

    标签: spring maven


    【解决方案1】:

    你在这里把两件事混为一谈。 pom.xml 用于构建应用程序。您在那里定义的属性通常与您的应用程序属性无关。而 Maven 配置文件与 Spring 配置文件无关。它们的名字是一样的。

    您应该像阅读here 一样配置您的Spring 应用程序。你可以——我不建议这样做——使用你的 pom 作为属性源。

    通常的方法是从外部配置中读取它。由于我不知道你是否使用Spring Boot,如果你使用不带Boot的Spring,你可以看看Spring Boot Way并进行调整。

    所以在 src/mein/resources 中添加一个apllication.properties 文件,比如

    smtp.host=my.smtp.server
    

    如果你使用boot,你就完成了,否则你必须添加一个

    @PropertySource("classpath:/application.properties")
    

    致您的@Configuration

    【讨论】:

      【解决方案2】:

      在这里,您将相互排斥的应用程序的构建阶段和运行时阶段混合在一起。

      一旦构建完成,Maven 的角色就会结束,因此使用的任何属性都会随之消失。此外,应用程序启动与用于构建它的工具/过程无关,因此它们之间没有共享任何信息。因此,使用pom.xml 中指定的属性的想法是不可行的。

      关于循环引用,声明 smtp.host=${smtp.host} 与 java 代码 int i = i; 大致相似,这基本上没有任何效果,因为 i 已定义并分配给自身。

      【讨论】:

      • 谢谢。我正在处理的应用程序实际上已经以类似的方式设置了一些其他属性。据我了解,代码试图做的是让 Maven 将一些属性设置为 application.properties 并让 Spring 从生成的属性文件中读取。我试图提取在最终 EAR 文件中生成的文件,似乎有些属性设置正确,但有些没有(主要是新属性)。
      • 在这种情况下,您需要手动扫描pom.xml中正在执行的所有maven目标。似乎在自定义目标之一中,application.properties 是从某个位置写入/复制的,然后打包到 EAR 中。
      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 2012-08-18
      • 2018-09-02
      • 2017-10-26
      • 2017-02-15
      • 1970-01-01
      • 2011-10-31
      • 2011-09-16
      相关资源
      最近更新 更多