java - 无法使用可运行的 jar 加载属性文件

标签 java maven properties classloader quartz-scheduler

我在 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);
}

所以我开始这样使用:

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

这在我的 windows 笔记本电脑上工作正常,没有任何问题,但是当我制作一个可运行的 jar(导出 --> 可运行的 jar --> 将所需的库打包到生成的 JAR 中)然后如果我在我的其他 ubuntu 机器上这样运行:

java -jar abc.jar

我遇到了这个异常:

error= org.quartz.SchedulerException: Error loading property data from InputStream - InputStream is null.
        at org.quartz.impl.StdSchedulerFactory.initialize(StdSchedulerFactory.java:576)
        at com.example.quartz.TestClassName.main(TestClassName.java:17)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)

我做错了什么?

更新:- jar tvf abc.jar 的输出。我只是展示相关的东西,而不是全部。

    13 Thu Sep 10 18:16:30 GMT-07:00 2015 resources/build.properties
   594 Thu Sep 10 18:16:30 GMT-07:00 2015 resources/quartz.properties
  1254 Thu Sep 10 18:16:30 GMT-07:00 2015 resources/quartz_config.xml

最佳答案

您的文件在 jar 文件中作为 resources/quartz.properties,而不仅仅是 quartz.properties - 所以这就是您需要加载它的方式:

factory.initialize(
  TestClassName.class.getClassLoader().getResourceAsStream("resources/quartz.properties"));

或者,以不同的方式创建 jar 文件,使 quartz.properties 位于 jar 文件的“根”目录中。 (鉴于您所描述的文件系统结构,这正是我所期望的。)

关于java - 无法使用可运行的 jar 加载属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32558063/

相关文章:

java - EHCache 禁用/关闭

maven - Docker 开发版本/快照

maven - Junit- 如何将测试附加到现有流程

java - 公共(public)存储库(如 maven.org)的 Artifact 的详细(下载)统计信息

java - Arraylist 泛型父类(super class)化 Object 类

c# - 是否可以在 C# 的构造函数中调用属性,这样我就不必两次编写值的验证检查?

objective-c - 从 Objective-C 中的图像读取非标准属性

java - 在运行时更新 JList

java - 访问 "Memory"中的字节元素

javascript - 为什么通过Web套接字客户端上传时文件大小总是为零?