繁体   English   中英

Jar 没有加载资源文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM