从命令提示符加载外部文件,而不是从类路径中使用

时间:2015-09-14 19:38:41

标签: java properties

我正在使用maven项目,我在quartz.properties文件夹中有一个/src/main/resources文件。

现在我可以通过这个类的两种方式使用这个属性文件,如下所示:

/**
 * Create a StdSchedulerFactory that has been initialized via
 * <code>{@link #initialize(Properties)}</code>.
 *
 * @see #initialize(Properties)
 */
public StdSchedulerFactory(Properties props) throws SchedulerException {
    initialize(props);
}

/**
 * Create a StdSchedulerFactory that has been initialized via
 * <code>{@link #initialize(String)}</code>.
 *
 * @see #initialize(String)
 */
public StdSchedulerFactory(String fileName) throws SchedulerException {
    initialize(fileName);
}

现在我使用maven-shade-plugin创建了一个可执行jar,我在我的ubuntu框中以java -jar abc.jar运行,它运行正常。它自动使用classpath中的quartz.properties文件。

public static void main(String[] args) {
    StdSchedulerFactory factory = new StdSchedulerFactory();
    try {
        factory.initialize(App.class.getClassLoader().getResourceAsStream("quartz.properties"));
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
    } catch (SchedulerException ex) {
        System.out.println("error= " + ex);
    }
}

现在,我正在尝试通过在运行上面的jar文件时从命令提示符传递quartz.properties文件来使这个程序更通用,如下所示:

java -jar abc.jar quartz.properties

如果我喜欢上面的内容,那么它应该使用quartz.properties文件传递的内容而不是类路径,但是如果没有传递参数,那么它应该使用默认的quartz.properties文件。实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以访问n中的命令行参数:

props.load( new FileInputStream("quartz.properties") );

如果没有main方法需要if(args.length > 0) { ... factory.initialize(args[0]); } else { ... factory.initialize(App.class.getClassLoader().getResourceAsStream("quartz.properties")); } ,那么您可以从参数中构造一个initialize

String

答案 1 :(得分:0)

检查API

O(2^n)

PS。使用try-with-resources,这样就不会像上面那样泄漏流,并添加错误处理