我在类加载器方面遇到了问题。一直。
有时有效,有时不起作用。
当我开始的时候,我已经测试了这个工作,但不是从*.jar:
URL url = AcAnalyzer.class.getResource("../stuff/resource");
//甚至在jar文件中也可以使用:
URL url = Acnalyzer.class.getResource("/stuff/resource");
URL url = AcAnalyzer.class.getClassLoader().getResource("stuff/resource");
//但是我遇到了tomcat..when的问题,我需要将它部署到tomcat中,我必须这样做:
URL url = Thread.currentThread().getContextClassLoader().getResource("something.xml");
其中类必须在WEB-INF/ something.xml /中
..。url.getFile();
//问题是大部分时间它必须在jar内工作,而不是同时在jar内工作。现在我已经测试了我的类在哪里获取资源,jar文件被用在一些部署在tomcat..and下的项目中,不知何故,它不想再工作了:
我对类加载器有点困惑:) ..如何获取这些资源?并同时进行了工作试验。
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 (没有这样的文件或目录)
感谢您的帮助
发布于 2009-02-23 11:17:39
我不确定第一部分中的确切问题是什么,尽管我建议不要在资源路径中使用"../“。
对于第二部分,如果你想加载一个资源,你不应该使用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()之间的区别,我不会声称有很好的理解--我建议你单独问这个问题。
https://stackoverflow.com/questions/577280
复制相似问题