ClassLoader.getResource保持为现有资源返回null

时间:2014-01-21 09:47:13

标签: java database file url path

我正在尝试在Runnable Jar中包含一个本地数据库文件。该应用程序基于一个现有的开源项目,他们将该文件与Class一起放在包中。现在我将数据库文件移动到我在根项目文件夹中创建的“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)

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

1 个答案:

答案 0 :(得分:0)

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