java - 使用 JAR 中的文件,同时从 jar 中运行应用程序
问题描述
在将应用程序作为 JAR 运行时,我正在尝试使用文件。当我通过 Intelij 运行应用程序时,一切都很好。但是,当我尝试通过 jar 运行它时,我无法访问该文件。我尝试阅读一些包含类似内容的主题,但没有一个有帮助(例如从 jar 中读取资源文件或如何从 Java jar 文件中读取资源文件? )这是我的目标树和资源:
当我使用
String path = String
.join("", "classpath:static\assets\config\", fileName);
File file = ResourceUtils.getFile(path);
InputStream targetStream = new FileInputStream(file)
在 intelij 运行期间,一切正常。
在 jar 的情况下,我尝试过:
String path = String
.join("", "static\assets\config\", fileName).replace("\\","/")).toExternalForm();
String path2 = String
.join("", "static\assets\config\", fileName).replace("\\","/")).getFile();
String path3 = String
.join("", "static\assets\config\", fileName).replace("\\","/")).getPath();
和许多其他。它们导致正确的路径,例如:
file:/D:/Projects/myProject/target/classes/static/assets/config/fileName(在 toExternalForm 的情况下)
/D:/Projects/myProject/target/classes/static/assets/config/fileName(在 getFile 的情况下)
但是,当我尝试时,所有这些都会导致输入流为空:
InputStream in = getClass().getResourceAsStream(everyPath);
我收到一个错误:
java.io.FileNotFoundException: D:\Projects\myProject\target\project-app-1.0.jar\BOOT-INF\classes\static\assets\config\fileName (The system cannot find the path specified)
当我通过 7zip 打开它时,project-app-1.0.jar 中的路径正好是:
D:\Projects\myProject\target\project-app-1.0.jar\BOOT-INF\classes\static\assets\config\fileName
这就是我的资源处理程序的样子:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/resources/", "classpath:/static/"};
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(
CLASSPATH_RESOURCE_LOCATIONS);
}
解决方案
当您想在 jar 中使用某些东西时,忘记“文件”,它只是一个简单的“资源”,您必须与 getResource 一起使用。
如果您使用标准打包系统,“resources”文件夹中的所有内容都放在 JAR 的根目录下,因此如果您想读取“static\assets\config\”文件夹中的“foo.txt”文件,您必须这样做使用方法:
InputStream in = ClassLoader.getSystemResourceAsStream("static/assets/config/foo.txt");
推荐阅读
- haskell - Haskell 中的可变参数函数类型类
- docker - 将容器安装到我的部署中时,如何避免“权限被拒绝”错误?
- javascript - 将输入隐藏值复制到使用 JS 隐藏的其他输入
- android - getExternalFilesDir(Environment.DIRECTORY_PICTURES) 在某些 Android 9 和 10 设备中不起作用
- android - 使用带有列表的 TypeConverter 更新 Room 字段时出错
- bash - 用于将屏幕截图从桌面移动到文件夹的 Bash 脚本
- python - http请求响应不是json格式
- javascript - 无法从 html 字符串将 html 加载到 webview 中
- reactjs - 无法将诸如 className 或 style 之类的道具传递给自定义组件的道具
- c++ - SIMD 加载的数组元组对齐