我使用此代码片段来获取文件作为输入流。文件 version.txt 打包在我的应用程序的 jar 中,在最上面的文件夹中。
InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");
这几乎一直有效。但是对于一个用户来说,它正在获取另一个 version.txt,它不在我的 jar 中。如何确保这会加载我的 jar 中的特定 version.txt 文件?
我使用此代码片段来获取文件作为输入流。文件 version.txt 打包在我的应用程序的 jar 中,在最上面的文件夹中。
InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");
这几乎一直有效。但是对于一个用户来说,它正在获取另一个 version.txt,它不在我的 jar 中。如何确保这会加载我的 jar 中的特定 version.txt 文件?
当您说“最上层文件夹”时,您的意思是默认包?如果是这种情况,您将必须确保您的 JAR 在类路径上比其他version.txt
文件更早,因为 Java 沿着类路径搜索直到找到第一个匹配项。
由于很难确保您的 JAR 始终是第一个,因此您应该将version.txt
文件放在非默认包中,例如:
com.yourcompany.yourproject.version
然后您需要修改代码以找到它:
Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt");
使用默认包是一种反模式。
这是将东西放在顶级包中固有的危险,你可以拿起你并不真正想要的东西。这可能是一个好处(例如,使用 log4j 配置),但这通常不是您想要的。
我强烈建议您将您version.txt
放在应用程序的包结构中,例如在 com.myapp (或任何您的包名称)中,然后使用从那里加载它
getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt");
代码片段将使用加载此类的类加载器来查找 version.txt 文件。如果该文件存在于多个地方的类加载器使用的类路径中,它可能会返回错误的文件(取决于类路径顺序)。