2017-08-25 75 views
0

我使用Spring(没有弹簧启动)。我想构建可使用默认配置(资源文件夹中的logback.xmlapplication.properties)或-Dconfig.folder=/path/to/custom/external/directorylogback.xmlapplication.properties in/path/to/custom/external/directory)运行的独立应用程序。当使用-Dconfig.folder参数运行应用程序参数AppConfig应该从外部目录加载logback和属性。外部化属性和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.xmlapplication.properties是不相关的问题

+0

难道我满意的回答你的问题?如果是,请随时接受。如果不是,请解释为什么不能让我改进答案。 –

+0

我在一天前添加了一条评论,关于我缺少的内容:)基本上,我不知道在哪里放置该Java代码的InputStream配置,以便让我的logback配置可用asap – ilovkatie

+0

请参阅我的编辑。如果你对Spring一无所知,你需要先做好功课。当你遇到特殊问题时,我们会尽力帮助你,我们不会做你的工作。 –

回答

1

与其他答案建议不同,如果在中使用file前缀,因为它无法从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 
    } 
} 
+0

我想知道我应该把这个logback配置放在哪里:1.使用正确的日志记录选项asap 2.保持我的应用程序在拆分逻辑和配置方面的清洁。任何建议? – ilovkatie

+0

@ilovkatie'src/main/resources' –

+0

我的意思是InputStream的登录配置:> – ilovkatie

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