我使用此代码段获取文件作为输入流。文件version.txt打包在我应用程序的jar中,位于最上面的文件夹中。
InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");
几乎所有时间都有效。但是对于一个用户来说,它正在拾取另一个版本.txt,这不在我的jar中。如何确保加载我jar中的特定version.txt文件?
答案 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文件。 如果文件存在于类加载器在多个位置使用的类路径中,则可能返回错误的文件(取决于类路径顺序)。