代码之家  ›  专栏  ›  技术社区  ›  user1950349

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

  •  1
  • user1950349  · 技术社区  · 10 年前

    我在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
    
    3 回复  |  直到 10 年前
        1
  •  3
  •   Jon Skeet    10 年前

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

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

    或者,以不同的方式创建jar文件,以便 石英性质 位于jar文件的“root”目录中。(考虑到您所描述的文件系统结构,这是我所期望的。)

        2
  •  1
  •   Dakshinamurthy Karra    10 年前

    如果您想访问 resources/build.properties 从类中,您需要使用绝对路径,如:

    TestClassName.class.getClassLoader().getResourceAsStream("/resources/quartz.properties")
    
        3
  •  0
  •   JZH    10 年前

    首先,你应该确保石英。jar文件中的属性。如果它不存在,则需要检查pom.xml中的构建设置