类加载器

时间:2009-02-23 11:12:46

标签: java

我遇到了类加载器的问题。每时每刻。

有时它有效,有时它不起作用。

当我开始时,我已经测试过这个有效但不是来自* .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(没有这样的文件或目录)

谢谢你的帮助

1 个答案:

答案 0 :(得分:3)

我不确定第一部分到底是什么问题,尽管我建议不要在资源路径中使用“../”。

对于第二部分,如果要加载资源,则不应使用FileInputStream - 您应该使用getResourceAsStream()而不是getResource().getFile()。只需从InputStream加载 - 不会总是存在您可以加载FileInputStream的单个文件。

编辑:引用资源的两种方式是ClassLoader.getResourceClass.getResource(以及带有AsStream后缀的等价物)。它们之间的区别(我所知道的唯一区别,尽管可能有其他区别)是Class.getResource将给定路径视为相对于您调用它的类的包。所以

ClassLoader.getResource("foo/bar/baz/test.xml")

相当于

foo.bar.SomeClass.class.getResource("baz/test.xml");

至于Class.getClassLoader()Thread.getContextClassLoader()之间的差异,我不会声称有很好的理解 - 我建议你将其作为一个单独的问题。