【问题标题】:Reading From Dynamically Updated Application.properties从动态更新的 Application.properties 中读取
【发布时间】:2019-02-03 02:06:56
【问题描述】:

我有使用 maven 构建步骤动态更新的应用程序属性文件。

mvn clean -Dusername=user1 -Durl=xxxx -Dpassword=xxxx -DskipTests 安装

jdbc.url=${url}
jdbc.username=${username}
jdbc.password=${password}

我在配置类中读取这些属性

@Configuration 
@ImportResource("classpath:/spring-beans.xml")
@PropertySource("classpath:/application.properties")
public class ApplicationConfiguration {

  @Value("${jdbc.url}")
  private String url;

 @Value("${jdbc.username}")
  private String username;

 @Value("${jdbc.password}")
 private String password;

@Bean(name = "c3p0DataSource")
public ComboPooledDataSource dataSource() throws PropertyVetoException, 
IOException {

logger.info("Creating Datasource for {}",System.getenv("SPRING_DATASOURCE_URL"));
// logger.info("Creating Datasource for username {}", 
prop.getProperty("username"));
logger.info("Creating Datasource for {}", System.getenv("username"));
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");

logger.info("User Name :" + username);//returning $username instead of user1

logger.info("password :" + password);

System.out.println("User name : " + username);

dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;  }   }

我没有得到更新的值,而是得到了 $username, $password 作为值,谁能帮助我这里缺少什么?

我修改后的属性文件如下所示

jdbc.url=xxxx
jdbc.username=user1
jdbc.password=xxxx

【问题讨论】:

    标签: java spring


    【解决方案1】:

    我尝试过手动初始化数据,效果很好。你也可以试一试。

    你可以试试下面的代码:

    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Configuration;
    
    
    @Configuration
    @PropertySource("classpath:application.properties")
    public class ApplicationConfiguration {
    
        private Properties properties = new Properties();
        public static String driverClass;
        public static String dataSourceUrl;
        public static String dataSourceUser;
        public static String dataSourcePassword;
    
        public ApplicationConfiguration() throws IOException {
            properties.load(new InputStreamReader(ApplicationConfiguration.class.getResourceAsStream("/application.properties")));    
            driverClass = properties.getProperty("spring.datasource.driver-class-name");
            dataSourceUrl = properties.getProperty("spring.datasource.url");
            dataSourceUser = properties.getProperty("spring.datasource.username");
            dataSourcePassword = properties.getProperty("spring.datasource.password");
      }
    
      // Other Code Details
    
    }
    

    现在我可以轻松地使用它:ApplicationConfiguration.driverClassApplicationConfiguration.dataSourceUser

    我在 application.properties 中也使用了很少的其他资源,我没有手动初始化,building jar 时也不需要这些资源。所以只有我使用@PropertySource("classpath:application.properties") 来使用其他资源而不需要手动初始化。

    尝试一次,它可能会帮助你:)

    【讨论】:

      【解决方案2】:

      你应该跑

      mvn clean -Djdbc.username=user1 -Djdbc.url=xxxx -Djdbc.password=xxxx -DskipTests install
      

      【讨论】:

      • 如果您能解释一下为什么这样可以解决问题,将会有所帮助。
      【解决方案3】:

      当您说“动态更新”时,在我看来您只是指在构建时更新,而不是在运行时更新。如果是,那么 you need to use the maven resources plugin, define the maven variables and use a different syntax in the properties file. 这是 spring boot 文档的 covered in the properties and configuration section

      【讨论】:

      • 我只是在构建时使用资源,因为你说更新的 jar 包含修改后的属性文件,但仍然无法读取
      • 您能否更新问题或提供要点或代码链接,因为问题当前与文档中的示例不匹配?
      • 更新问题希望对您有所帮助
      • 你能从你的 pom 中添加配置 Maven 资源插件的部分吗? Pom的属性部分中的属性定义?你也没有像文档那样使用@语法吗?
      【解决方案4】:

      我建议你使用另一个属性文件,而不是使用 Spring 的应用程序属性,将其存储在文件系统中并使用 org.apache.commons.configuration.PropertiesConfiguration 类从该文件中加载值。

      org.apache.commons.configuration.PropertiesConfiguration 能够在更改时重新加载属性文件。

      https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html

      如果您使用的是 maven,请添加以下依赖项。

      <dependency>
          <groupId>commons-configuration</groupId>
          <artifactId>commons-configuration</artifactId>
          <version>1.10</version>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 2018-05-18
        • 1970-01-01
        • 2018-01-07
        • 2018-09-15
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 2020-03-26
        相关资源
        最近更新 更多