2009-09-30 74 views
3

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

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

这个几乎所有的时间都适用。但是对于一个用户来说,它正在挑选另一个version.txt,这不在我的jar中。我怎样才能确保这加载我的jar中的特定version.txt文件?

回答

9

当你说“最上面的文件夹”时,你是指默认包?如果是这样的话,你必须确保你的JAR早于类路径,而不是像其他version.txt文件一样沿着类路径搜索,直到它找到第一个匹配。

因为很难保证你的JAR将永远是第一位,你真的应该放置version.txt文件在非默认的包,如:

com.yourcompany.yourproject.version 

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

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

使用默认包是反模式。

+0

哦,男孩。我称自己是Java专家,但我使用这种反模式。我感到惭愧...... :-)初步测试显示您的解决方案可行! – 2009-09-30 12:39:12

+0

正如他们所说,失败是最好的老师;-) – SteveD 2009-09-30 12:45:04

3

这是将事物置于顶层包装中固有的危险,您可以挑选出您并非真正想要的东西。这可能是一个好处(例如使用log4j配置),但它通常不是你想要的。

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

getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt"); 
0

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