【问题标题】:Can't load Properties from JAR无法从 JAR 加载属性
【发布时间】:2011-08-02 20:03:59
【问题描述】:

几天来,我一直在尝试让我的 Java 项目从位于其 JAR 文件中的文件中加载一些属性。但是,在尝试加载文件时,我不断得到一个空指针。

文件夹层次结构在 /data 中有属性文件,在 /emp/**/** 中有所有源文件 ...

代码

Properties defaultProps = new Properties();
    try {
        InputStream in = getClass().getClassLoader().getResourceAsStream("data/build_info.properties");
        //InputStream in = new URL("file:data/build_info.properties").openStream();

        defaultProps.load(in);
        in.close();
    } catch (FileNotFoundException e) {
        //e.printStackTrace();
    } catch (IOException e) {
        //e.printStackTrace();
    } catch (NullPointerException e){
        Log.E("NPE- Properties not loaded", "properties");
        revision = "Properties file not found";
    }

    if (defaultProps.getProperty("build.major.number") == null) {
        Log.W("Properties not loaded", "properties");
        revision = "Properties file not found";
    } else {
        Log.V("Properties Loaded Successfully", "properties");
        
        revision = "Version: " + defaultProps.getProperty("build.major.number")
            + "." + defaultProps.getProperty("build.minor.number") + "    "
            + "Revision: "
            + defaultProps.getProperty("build.revision.number");
    }

【问题讨论】:

    标签: java properties jar


    【解决方案1】:

    如果data 在您的jar 的根目录中,并且如果build_info.properties 在jar 的数据目录中,并且如果jar 在类路径中,那么getClass().getClassLoader().getResourceAsStream("data/build_info.properties"); 将找到该属性文件。你也可以使用getClass().getResourceAsStream("/data/build_info.properties");

    如果getClass() 返回的类加载器加载的类不同于类路径中包含您的 jar 的类,则可能会出现特殊情况。

    【讨论】:

    • 我相信所有这些都是真的。我如何确保 JAR 在我的类路径中?
    • 喂?我真的可以使用帮助
    • 您可以在程序中做的一件事是尝试使用该 jar 中的类。如果您收到 NoClassDefFoundError 或 ClassNotFoundException (具体取决于您所做的事情),那么它看不到那个 jar 中的东西。这是安卓源吗?我对安卓了解不多。如果是这样,您应该在您的问题中添加一个 android 标签。
    【解决方案2】:

    你也可以试试 --

    Thread.currentThread().getContextClassLoader().getResourceAsStream("data/build_info.properties");
    

    【讨论】:

      【解决方案3】:

      我在一个非常简单的控制台应用程序中遇到了同样的问题。最终我在https://stackoverflow.com/a/1464541/1792291 找到了一个提示,我将我的控制台应用程序变成了一个摇摆应用程序,突然一切都正常了。

      上面链接中的解释确实有些道理:因为控制台应用程序在创建 shell 时获取其属性(包括 CLASSPATH),所以它不会知道在 JVM 期间/为/由 JVM 定义的类路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-05
        • 2015-08-20
        • 2021-12-29
        • 2014-12-30
        • 2014-11-17
        • 2013-01-11
        • 1970-01-01
        相关资源
        最近更新 更多