我有一个文件夹为“ src / main / resources”的项目,其中有一个休眠配置文件,我使用这一行代码加载它
HibernateUtil.class.getResource("/hibernate.cgf.xml").getPath()
在IDE内部,它运行良好,但是当我创建jar时,它不会归档文件。
如何也将其正确加载到jar文件中?
谢谢
答案 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() : "";