Jar未加载资源文件

时间:2018-07-09 09:47:12

标签: java

我有一个文件夹为“ src / main / resources”的项目,其中有一个休眠配置文件,我使用这一行代码加载它

HibernateUtil.class.getResource("/hibernate.cgf.xml").getPath()

在IDE内部,它运行良好,但是当我创建jar时,它不会归档文件。

如何也将其正确加载到jar文件中?

谢谢

4 个答案:

答案 0 :(得分:2)

您可以尝试一下吗?

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("fileName").getFile());

答案 1 :(得分:0)

您创建的jar文件中很可能没有该文件。您的问题信息太少,但我会尝试猜测:

您的hibernate.cgf.xml与Java sourcefles驻留在同一目录中,并且您正在使用构建工具(它是IDE,maven,gradle或ant脚本),该工具希望将资源存储在单独的目录中。

很容易检查:尝试解压缩jar文件,看看文件是否在那里(使用任何工具,您都可以将扩展名从.jar更改为.zip)。我想您会看到该文件不存在。

然后返回一个问题:“如何使用XXX将我的非Java资源打包到jar中”,其中XXX将是您用于构建jar的技术名称。

答案 2 :(得分:0)

如果"/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());
}

在上面的示例中,“简单”包应替换为hibernate.cgf.xml所在的包。但是,绝对不要在包声明的开头加斜杠。

答案 3 :(得分:0)

我不能肯定地说,这是问题所在,不知道您使用的提取路径到底有多精确

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() : "";