Spring 4 - 在jar> war中加载属性文件

时间:2014-08-12 07:23:35

标签: java spring spring-mvc spring-4

我无法加载位于jar(project.service.jar)内的db.properties,它由war文件(project-web.war)引用。输出war在WEB-INF / lib / project.service.jar中有jar。服务jar具有Web应用程序使用的服务和dao类。休息战也使用了jar,它使用jar中的一些服务。战争开始时,我无法加载位于服务的jar文件中的db.properties。 prop文件具有要在jndi中查找的数据源名称。

war config

AppConfig.java

@Bean
public static PropertyPlaceholderConfigurer propertyConfigurer()
        throws IOException {
    PropertyPlaceholderConfigurer props = new PropertyPlaceholderConfigurer();
    props.setLocations(new Resource[] { new ClassPathResource(
            "application.properties") });
    return props;
}

service.jar中

@Component
@Configuration
//@ComponentScan(basePackages={ "com.mgage.mvoice" })
@PropertySource(value = { "classpath:db.properties" })
public class DatabaseConfig {
    @Autowired
    Environment environment;

    private @Value(value = "${voice.datasource}") String dataSourceString;

    @Bean
public DataSource getDataSource() {
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    try {
        DataSource dataSource = lookup.getDataSource(dataSourceString); //this always is null
        return dataSource;
    } catch (DataSourceLookupFailureException e) {
        return null;
    }
}

    @Bean
    public PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

应该AppConfig.java导入DataSourceConfig.java,我试过但我仍然得到了Environment null。我错过了什么吗?将服务分隔为jar文件以使它们可用于REST,Web应用程序和报告应用程序是否正确?或者建议与所有服务,休息,报告类进行单一战争?

2 个答案:

答案 0 :(得分:0)

AFAIK,一个spring应用程序上下文只使用一个PropertySourcesPlaceholderConfigurer。因为,@PropertySource(value = { "classpath:db.properties" })似乎没有填充环境,我只能看到另一个解决方案:明确地将其添加到AppConfig.java中的位置列表中:

    props.setLocations(new Resource[] { new ClassPathResource(
        "application.properties"), new ClassPathResource("db.properties")});

但我必须承认,这不仅仅是一个干净利落的解决方案。

编辑:

但通常情况下,DataSourceConfig.java是由弹簧配置机制扫描的,@PropertySource(value = { "classpath:db.properties" })应填充环境。

答案 1 :(得分:0)

你需要在任何jar中指定classpath, 试试这个: @PropertySource(value = {“classpath *:db.properties”})