ClassLoader加载错误的文件

时间:2009-09-30 12:28:38

标签: java classloader

我使用此代码段获取文件作为输入流。文件version.txt打包在我应用程序的jar中,位于最上面的文件夹中。

InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");

几乎所有时间都有效。但是对于一个用户来说,它正在拾取另一个版本.txt,这不在我的jar中。如何确保加载我jar中的特定version.txt文件?

3 个答案:

答案 0 :(得分:9)

当你说“最上层文件夹”时,你的意思是默认包?如果是这种情况,那么你必须确保你的JAR在类路径上比在其他version.txt文件中贡献的更早,因为Java在类路径中搜索,直到找到第一个匹配。

由于很难确保您的JAR始终是第一位的,因此您应该将version.txt文件放在非默认包中,例如:

com.yourcompany.yourproject.version

然后你需要修改代码来找到它:

Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt");

使用默认包是一种反模式。

答案 1 :(得分:3)

这是把东西放在顶层包装中固有的危险,你可以拿起你不想要的东西。这可能是一个好处(例如,使用log4j配置),但它通常不是你想要的。

我强烈建议您将version.txt放入应用程序的包结构中,例如在com.myapp中(或任何包名称),然后使用

从那里加载它
getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt");

答案 2 :(得分:0)

代码片段将使用加载此类的类加载器来查找version.txt文件。 如果文件存在于类加载器在多个位置使用的类路径中,则可能返回错误的文件(取决于类路径顺序)。