我正在使用Spring(没有spring-boot)。我想构建可以使用默认配置(资源文件夹中的logback.xml
和application.properties
)或-Dconfig.folder=/path/to/custom/external/directory
运行的独立应用程序
({path / to / custom / external / directory中的logback.xml
和application.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 与问题无关
答案 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