我想从我的jar中读取一个资源,如下所示:
File file;
file = new File(getClass().getResource("/file.txt").toURI());
BufferedReader reader = new BufferedReader(new FileReader(file));
//Read the file
在eclipse中运行它时,它工作得很好,但是如果我将它导出到一个jar中运行它,就会出现一个illegalargumentexception:
Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical
我真的不知道为什么但是通过测试我发现如果我改变了
file = new File(getClass().getResource("/file.txt").toURI());
到
file = new File(getClass().getResource("/folder/file.txt").toURI());
然后它的工作方式正好相反(它在jar中工作,但在eclipse中不工作)。
我使用的是eclipse,文件所在的文件夹位于类文件夹中。
15条答案
按热度按时间xt0899hw1#
这段代码可以在eclipse和导出的runnable jar中使用
hivapdat2#
问题是某些第三方库需要文件路径名而不是输入流。大多数答案都没有涉及这个问题。
在这种情况下,一种解决方法是将资源内容复制到临时文件中。下面的示例使用junit的
TemporaryFolder
.gmxoilav3#
我找到了解决办法
将“main”替换为编码它的java类。用jar文件中的路径替换“path”。
例如,如果将state1.txt放在包com.issac.state中,那么如果运行linux或mac,则键入路径为“/com/issac/state/state1”。如果运行windows,请键入路径“\com\issac\state\state1”。除非发生“找不到文件”异常,否则不要向文件中添加.txt扩展名。
63lcw9qa4#
因为某种原因
classLoader.getResource()
当我将web应用程序部署到wildfly 14时,总是返回null。正在从获取classloadergetClass().getClassLoader()
或者Thread.currentThread().getContextClassLoader()
返回null。getClass().getClassLoader()
api医生说,“返回类的类加载器。一些实现可能使用null来表示引导类加载器。如果这个类是由引导类装入器装入的,那么在这种实现中,这个方法将返回null。“
如果您使用的是wildfly和您的web应用程序,请尝试以下操作
request.getServletContext().getResource()
返回了资源url。这里request是servletrequest的一个对象。csbfibhn5#
要访问jar中的文件,有两个选项:
将文件放在与包名匹配的目录结构中(提取.jar文件后,它应该与.class文件位于同一目录中),然后使用
getClass().getResourceAsStream("file.txt")
将文件放在根目录下(提取.jar文件后,它应该在根目录下),然后使用Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")
当jar用作插件时,第一个选项可能不起作用。taor4pac6#
如果您使用的是spring,则可以使用以下方法从src/main/resources读取文件:
v7pvogib7#
您可以使用类加载器,它将从类路径读取根路径(开头不带“/”)
flseospp8#
以下代码适用于spring boot(kotlin):
xam8gpfp9#
确保使用正确的分隔符。我把所有的都换了
/
在相对路径中File.separator
. 这在ide中运行良好,但是在构建jar中不起作用。hof1towb10#
到目前为止(2017年12月),这是我发现的唯一一个在ide内外都有效的解决方案。
使用pathmatchingresourcepatternresolver
注意:它也适用于Spring Boot
在本例中,我正在读取src/main/resources/my\u文件夹中的一些文件:
gajydyqb11#
与其尝试将资源作为文件寻址,不如让类加载器返回资源的inputstream,而不是通过getresourceasstream:
只要
file.txt
资源在类路径上可用,那么不管file.txt
资源处于classes/
目录或内部jar
.这个
URI is not hierarchical
发生的原因是jar文件中资源的uri如下所示:file:/example.jar!/file.txt
. 不能读取jar
(一)zip
文件)就像是一个普通的旧文件。下面的答案很好地解释了这一点:
如何从javajar文件中读取资源文件?
java jar文件:使用资源错误:uri不是层次结构
bgtovc5b12#
就我而言,我终于成功了
jei2mxaa13#
如果你想以文件的形式阅读,我相信还有一个类似的解决方案:
jei2mxaa14#
我认为这应该在java中也可以使用。我使用的以下代码正在使用kotlin。
2ul0zpep15#
我以前遇到过这个问题,我为加载做了退步。基本上第一种方法在.jar文件中工作,第二种方法在eclipse或其他ide中工作。