3

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

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

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

4

3 回答 3

10

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

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

com.yourcompany.yourproject.version

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

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

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

于 2009-09-30T12:37:13.173 回答
3

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

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

getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt");
于 2009-09-30T12:37:18.243 回答
0

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

于 2009-09-30T13:10:52.423 回答