【发布时间】: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