【发布时间】:2019-01-03 06:14:20
【问题描述】:
我正在开展一个需要访问大型资源文件夹(包含数千个小图像的结构)的项目。客户希望通过本机安装(包括应用程序运行所需的 JVM)来提供应用程序。他不想将这些资源打包为应用程序中的文件夹,因为它会在最终用户的硬盘驱动器中创建一个与原始文件夹一样大的文件夹结构(该文件夹不占用太多空间,但它有很多小文件),另外,只需复制该文件夹即可轻松窃取该文件夹。鉴于此,我无法将所有应用程序与资源文件夹打包在 jar 文件中,据我所知 jar 文件不可安装。另一个要求是客户端需要一定的灵活性来在已安装的应用程序文件夹结构中添加一些文件以向程序添加新功能。所以安装是获得这个的唯一方法(我认为)。
我尝试将它们打包到一个 jar 文件中,将其包含在构建路径中并尝试访问它,但即使我通过各种站点进行了所有研究,我也失败了。以一百万种方式尝试了 getResources() ,但是不可能在 jar 文件中获取一个简单的目录,同时从 jar 外部的文件夹中获取它真的很容易。我需要访问一个目录才能获得它包含的文件列表。
到此为止。我已经开始问自己,我是否以最好的方式面对这个问题,所以我想问大家:你将如何将你需要的资源打包到具有这种要求的原生 java 应用程序中?
我什至在考虑创建某种加密过程来创建一个包含所有信息的单个文件,并在运行时需要时简单地对其进行临时解密,但我认为会有一种更简单、更简洁的方法来解决这个问题。
提前谢谢你
编辑:正如你所要求的,我正在添加我尝试过的代码:
这是项目结构
project
├───src
│ ├───main
│ │ └───java
│ │ ├───model <--- where my class is
│ │ ├───controllers
│ │ ├───utilities
│ │ └───views
│ ├───resources <--- this is where is (formerly) accessed the content i need
| | ├─── jarfile.jar <--- i've placed file here and included to build path
│ │ └───-various folders and files -
│ └───test
└───target
jar 文件里面有包 src.resources.blalblaba,里面是我需要的文件夹
方式一:
getResources 替换 jar 文件 "."使用“/”尝试使用路径:“src/resources/blablabla/folderINeed”、“src/resources/src/resources/blablabla”(由于可能的重复性)、“folderINeed”、“blablabla/folderINeed”-> URI 总是得到带有消息“null”的 NullPointerException
public void loadContent(String contentPath) throws Exception
{
File resources= null;
File[] listFiles = null;
URI uri = getClass().getClassLoader().getResource(contentPath).toURI();
resources= new File(uri);
listFiles = resources.listFiles();
//do some file proccessing and load them
}
方式 2:使用的路径 "folderINeed","src/resources/blablabla/folderINeed","blablabla/folderINeed","../../../resources/blablabla/folderINeed"
public void loadContent(String contentPath) throws Exception
{
// conseguimos todas las carpetas de animaciones
File resources;
File[] listFiles = null;
URL url = MyClass.class.getResource(contentPath);
if (url == null) {
// error - missing folder
} else {
resources = new File(url.toURI());
listFiles = resources.listFiles();
}
}
方式 3:使用类 JarFile 的一些复杂代码对我不起作用,并且旨在获取简单文件,而不是文件夹。获得here
【问题讨论】:
-
将图像打包到 .jar 文件中是处理此问题的正确方法。请更新一个问题,并至少包含您尝试使用 getResources() 的一百万种方法中的一种,以及对您不起作用的 jar 文件的结构。
-
好的,我会这样做@yole。
-
不要将 .jar 文件放在资源文件夹中。相反,将整个应用程序连同 .class 文件和图像一起打包成一个 .jar 文件。
-
@Yole 我已经考虑过了,但是客户希望通过安装程序来展示应用程序,以便可以沿着运行它所需的 JVM 以本机方式安装它。给出这个我认为这是不可能的。我将编辑添加此详细信息的问题
-
这怎么可能? Windows 和 Mac 上的 IntelliJ IDEA 就是这样分发的。您有一个安装 JRE 和一堆 .jar 文件的本机安装程序,其中一些包含 .class 文件,而另一些包含图像。 (也可以是单个 .jar 文件 - 没关系。)
标签: java jar resources packaging requirements