Java 如何从代码中动态查找属性文件的路径?

Java 如何从代码中动态查找属性文件的路径?,java,properties,quartz-scheduler,Java,Properties,Quartz Scheduler,我有一个Java中的maven项目,其中我在以下目录下有一个属性文件(quartz.properties): /src/main/resources 现在,我可以从该类中以两种方式使用该属性文件,如下所示: /** * Create a StdSchedulerFactory that has been initialized via * <code>{@link #initialize(Properties)}</code>. * * @see #initia

我有一个Java中的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);
}

我不确定如何使用
StdSchedulerFactory
类来提供我的
quartz.properties
文件的路径

到目前为止,我提供了这样的硬编码路径,但这不是提供路径的正确方式,因为如果其他人在他们的台式机或笔记本电脑上运行此代码,那么它将无法工作。我将在我的桌面上运行这个应用程序,同时我也将制作一个可运行的jar,因此我希望我的程序能够动态加载我的属性文件,而不需要任何硬编码路径

public class TestingQuartz {
    public static void main(String[] args) throws SchedulerException {
        SchedulerFactory factory = new StdSchedulerFactory(
                "C:\\workspace\\tester_quartz\\quartzmain\\src\\main\\resources\\quartz.properties");
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
    }
}

因为它似乎位于类路径上,所以可以执行以下操作:

getClass().getClassLoader().getResource("quartz.properties").toExternalForm()

由于您的配置文件位于mavenized项目的src/main/resources中,它将嵌入到使用maven构建的结果工件(jar、war…)中。因此,您应该像这样“从类路径”加载文件:

    StdSchedulerFactory factory = new StdSchedulerFactory();
    factory.initialize(this.getClass().getClassLoader().getResourceAsStream("quartz.properties"));

StdSchedulerFactory
不将InputStream作为输入。哦,是的,实际上我是指使用initialize(InputStream)方法;我在回答中更改了它我试着用你的方式-
SchedulerFactory=new StdSchedulerFactory();初始化(TestingQuartz.class.getClassLoader().getResourceAsStream(“quartz.properties”))
但不知怎的,它给出了编译错误,因为类型SchedulerFactory的方法initialize(InputStream)未定义。我已更新了问题中的代码,以添加有关如何使用它的更多详细信息。您使用哪一版本的quartz?至少2.2提供了这样一种方法:如果maven项目生成war或ear,然后部署在JavaEE容器(如JBoss)上,它可能无法工作,因为getResource(…)返回的URL将引用一种虚拟存储区域,该区域将无法用文件正确打开。我建议在我的答案中使用getResourceAsStream(比你的答案晚了一点;我打字速度慢:)谢谢-我在JavaFX中为桌面客户端做了很多工作,但我没有想到。。。抢手货