外化属性和logback Spring

时间:2017-08-25 22:09:56

标签: java spring spring-boot

我正在使用Spring(没有spring-boot)。我想构建可以使用默认配置(资源文件夹中的logback.xmlapplication.properties)或-Dconfig.folder=/path/to/custom/external/directory运行的独立应用程序 ({path / to / custom / external / directory中的logback.xmlapplication.properties。当应用程序将使用-Dconfig.folder运行时,param AppConfig应该从外部目录加载logback和属性。

有没有让外部文件夹像资源文件夹一样?

如果没有,这是什么常见的解决方案?

我当前的实现(仅使用默认资源文件夹):

App.java

public class App {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        SampleAction p = context.getBean(SampleAction.class);
        p.performTask();
    }
}

AppConfig.java

@ComponentScan
@PropertySource("classpath:application.properties")
class AppConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

SampleAction.java

@Component
public class SampleAction {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${sample.prop}")
    private String sampleProp;

    public void performTask(){
        logger.debug(sampleProp);
    }
}

logback.xml application.properties 与问题无关

2 个答案:

答案 0 :(得分:1)

与其他答案建议不同,如果您在file中使用@PropertySource前缀,则会因为无法从jar中加载默认application.properties而搞砸了。你应该做的是以下几点:

@PropertySource("${config.folder:'classpath:'}/application.properties")
public class AppConfig

logback.xml

@Value("${config.folder}:")
private String configFolder;

InputStream = Optional.of(new ClassPathResource(configFolder + "/logback.xml"))
    .filter(r -> r.exists())
    .orElse(new ClassPathResource("classpath:/logback.xml"))
    .getInputStream();

在这两种情况下,我优先考虑默认打包文件的命令行参数。当然,我没有编译上面的内容,所以可能存在拼写错误或小错误,但你明白了。

修改

由于OP声称无法理解上述代码的运行位置 -

public class AppConfig {
    @PostConstruct
    void init() {
        // init logback here
    }
}

答案 1 :(得分:0)

对于log4j.xml

-Dlog4j.configuration=C:\neon\log4j.xml作为VM参数

在main()方法中:

String filename = System.getProperty("log4j.configuration");
DOMConfigurator.configure(filename);

对于外部属性文件:

-Dext.prop.dir=C:\neon作为VM参数

AppConfig类的更改将类似于

@PropertySource("file:///${ext.prop.dir}/application.properties")
public class AppConfig{
}

使用如下所示的VM参数运行App类,并且将从外部位置使用这两个文件

-Dlog4j.configuration=C:\neon\log4j.xml -Dext.prop.dir=C:\neon