【问题标题】:ClassLoader.getResource keeps returning null for existing resourceClassLoader.getResource 不断为现有资源返回 null
【发布时间】:2014-02-10 19:56:19
【问题描述】:

我试图在我的 Runnable Jar 中包含一个本地数据库文件。该应用程序基于现有的开源项目,其中他们将文件与类一起放在包中。现在我将数据库文件移动到我在根项目文件夹中创建的“res”映射。编辑代码以查找数据库文件的新路径不起作用。这是一段代码:

 private static String defaultDBFileLocation() {
        final URL geoDBFileURL = ClassLoader.getSystemClassLoader().getResource("res/GeoIP.dat");
//        final URL geoDBFileURL = GeoIPServiceImpl.class.getResource("GeoIP.dat");
        if (geoDBFileURL == null) {
            return null;
        }

        try {
            final URI geoDBFileURI = geoDBFileURL.toURI();
            if (!geoDBFileURI.getScheme().equals("file")) {
                // class file loaded not from plain directory on filesystem, e.g. from jar, network, etc.
                return null;
            }
            final File geoDBFile = new File(geoDBFileURI);
            return geoDBFile.getPath();
        } catch (URISyntaxException e) {
            return null;
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

注释行是原始创建者用来获取文件的方式。它上面的线是我的新方法。此方法在这一行一直返回 null:

if (geoDBFileURL == null)

有谁知道我在这里做错了什么?谢谢

【问题讨论】:

  • 你的类被系统类加载器加载了吗?
  • 我怎么知道是不是?
  • System.out.println(YourClass.class.getClassLoader() == ClassLoader.getSystemClassLoader() ? "Loaded by system classloader" : "Loaded by another classloader");,但如果是这样,为什么不直接使用 YourClass.class.getClassLoader() 开始呢?
  • 由系统类加载器加载。但是这个建议不会要求我把文件放在班级旁边吗?因为由于某种原因,文件不会以这种方式包含在 jar 中
  • YourClass.class.getClassLoader().getResource("res/GeoIP.dat")(对于 ClassLoader.getResource,路径相对于 jar)或 YourClass.class.getResource("/res/GeoIP.dat")(对于 Class.getResource,路径相对于类,除非它以 / 开头)应该可以工作。但是,如果这不是导致问题的原因,那么这当然无法解决问题。

标签: java database file url path


【解决方案1】:

您应该使用Thread.currentThread().getContextClassLoader() (javadoc) 而不是系统类加载器,它是“新 ClassLoader 实例的默认委托父级,通常是用于启动应用程序的类加载器” (reference) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多