我遇到了类加载器的问题。每时每刻。
有时它有效,有时它不起作用。
当我开始时,我已经测试过这个有效但不是来自* .jar:
网址url = AcAnalyzer.class.getResource(“../ stuff / resource”);
//这甚至可以从jar文件中运行:
网址url = Acnalyzer.class.getResource(“/ stuff / resource”);
URL url = AcAnalyzer.class.getClassLoader()。getResource(“stuff / resource”);
//但是我遇到了tomcat的问题..当我需要将它部署到tomcat时我必须这样做:
URL url = Thread.currentThread()。getContextClassLoader()。getResource(“something.xml”);
其中something.xml必须位于WEB-INF / classes /
中... url.getFile();
//问题是大部分时间它必须在jar内工作而不是同时在jar中工作。现在我测试了我的类获取资源的位置,并且在tomcat下部署的某个项目中使用了jar文件......不知何故它不再需要工作了:
我对类加载器有点疑惑:) ..如何获取此资源?并且同时进行了工作测试。
URL url = Thread.currentThread()。getContextClassLoader()。getResource(“com / st / resource”);
FileInputStream inputStream = new FileInputStream(url.getFile());
java.io.FileNotFoundException:file:/home/aaa/.m2/repository/com/st/module-1.1-SNAPSHOT.jar!/ com / st / resource(没有这样的文件或目录)
谢谢你的帮助
答案 0 :(得分:3)
我不确定第一部分到底是什么问题,尽管我建议不要在资源路径中使用“../”。
对于第二部分,如果要加载资源,则不应使用FileInputStream - 您应该使用getResourceAsStream()
而不是getResource().getFile()
。只需从InputStream
加载 - 不会总是存在您可以加载FileInputStream
的单个文件。
编辑:引用资源的两种方式是ClassLoader.getResource
和Class.getResource
(以及带有AsStream
后缀的等价物)。它们之间的区别(我所知道的唯一区别,尽管可能有其他区别)是Class.getResource
将给定路径视为相对于您调用它的类的包。所以
ClassLoader.getResource("foo/bar/baz/test.xml")
相当于
foo.bar.SomeClass.class.getResource("baz/test.xml");
至于Class.getClassLoader()
和Thread.getContextClassLoader()
之间的差异,我不会声称有很好的理解 - 我建议你将其作为一个单独的问题。