[英]Jar is not loading resources file
我有一个项目,其中有一个文件夹“src/main/resources”,其中有休眠配置文件,我使用这行代码加载它
HibernateUtil.class.getResource("/hibernate.cgf.xml").getPath()
从 IDE 内部它运行良好,但是当我创建 jar 时它不会归档文件。
我怎样才能在jar文件中正确加载它?
谢谢
你能试试这个:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("fileName").getFile());
在不知道您如何准确使用通过以下方式提取的路径的情况下,我不能说这是问题所在:
HibernateUtil.class.getResource("/hibernate.cgf.xml").getPath()
但我可以告诉你:
从 IDE 运行,上面的代码行将返回:
/path/to/project/src/main/resources/hibernate.cgf.xml
这是一个有效的文件系统路径。 例如,您可以使用此路径创建File
类的实例,然后使用该实例读取文件内容。
但是,从 jar 文件内部运行的同一行代码将返回:
file:/path/to/jar/jar_name.jar!/hibernate.cgf.xml
这不是有效的文件系统路径。 如果您使用此路径创建File
类的实例,然后尝试读取文件的内容,您将得到一个异常: java.io.FileNotFoundExeption
要从 jar 中读取文件的内容,您应该使用方法Class.getResourceAsStream(String)
,它将返回类sun.net.www.protocol.jar.JarURLConnection.JarURLInputStream
的实例(或非 Oracle 中的等价物或非 OpenJDK Java)。 然后,您可以使用此对象来读取文件的内容。 例如:
InputStream inputStream = HibernateUtil.class.getResourceAsStream("/hibernate.cgf.xml");
Scanner scanner = new Scanner(inputStream).useDelimiter("\\A");
String fileContents = scanner.hasNext() ? sscanner.next() : "";
最有可能的是,您创建的 jar 中不存在该文件。 您的问题中的信息太少,但我会尝试猜测:
您的 hibernate.cgf.xml 与 Java 源文件位于同一目录中,并且您正在使用期望资源存储在单独目录中的构建工具(无论是 IDE、maven、gradle 还是 ant 脚本)。
很容易检查:尝试解压缩您的 jar 并查看文件是否存在(使用任何工具,您可以将扩展名从 .jar 更改为 .zip)。 我想你会看到文件不存在。
然后回到一个问题:“如何使用 XXX 将我的非 Java 资源打包到 jar 中”,其中 XXX 将是您用于构建 jar 的技术的名称。
如果hibernate.cgf.xml
与 HibernateUtil 类在同一个包中,则很可能不需要"/hibernate.cgf.xml"
中的斜线。
您实际上也可以使用完整路径通过类加载器访问该文件。 但是,您永远不会添加第一个斜线。
下面是一些代码,演示了如何使用不同的方法访问文件:
public static void main(String[] args) {
// Accessing via class
System.out.println(SimpleTests.class.getResource("hibernate.cgf.xml").getPath());
// Accessing via classloader from the current thread
String path = Thread.currentThread().getContextClassLoader()
.getResource("simple/hibernate.cgf.xml").getPath();
System.out.println(path);
// Accessing via classloader used by the current class
System.out.println(SimpleTests.class.getClassLoader().getResource("simple/hibernate.cgf.xml").getPath());
}
在上面的示例中,“simple”包应该替换为hibernate.cgf.xml
所在的包。 但是你不应该在包声明的开头有斜线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.