所以我刚刚开始用一个基本的测试程序来处理jpackage。我遇到了一个问题,它将从本质上决定这个系统是否可以应用到实际项目中。
为了设置这一点,Java程序的结构如下:
rootDirectory
-src folder
-res folder程序从这个根目录运行。运行时程序所需的文件位于res文件夹中。因此,该程序将执行类似于File f = new File("res/file_i_need.png");的操作。
我把它导出成一个JAR,现在我用jpackage打包它。安装程序已经完成,我安装了程序。生成的文件夹结构如下所示:
rootDirectory
-app folder
-res folder
-program.jar
-runtime folder
-program.exe因此,当您运行该程序时,突然File f = new File("res/file_i_need.png");不再工作了,因为新的rootDirectory已经将res文件夹埋在了应用程序文件夹中。
有什么方法可以将jpackage配置为将res文件夹放在根目录中,或者将其设置为将app文件夹用作根目录的位置,或者这是您刚刚遇到的问题吗?
为了澄清这一点,下面的将不适用于这个特定的用法:
关键是用户可以轻松地编辑/调整res文件夹中的文件。
如果jpackage无法处理这样的场景,则欢迎使用其他方案。
耽误您时间,实在对不起!
发布于 2021-09-11 05:38:49
也许最简单的解决方案就是检查这两个位置:
class ResourceLoader {
private Path resourceDirectory = null;
File findResourceFile(String resourceName) {
if (resourceDirectory == null) {
if (Path.of("app-folder/res").toFile().isDirectory()) {
resourceDirectory = Path.of("app-folder/res");
} else {
resourceDirectory = Path.of("res");
}
return resourceDirectory.resolve(resourceName).toFile();
}
}发布于 2021-09-11 09:05:03
您可以通过使用System.getProperty("jpackage.app-path")来确定是否使用jpackage来确定资源目录的位置,而无需检查FS路径的存在,然后从当前运行时查找"app“dir,因为对于Windows、MacOS和Linux,"app”和" runtime“文件夹处于相同的级别。
File resourceFile(String resName) {
String exe = System.getProperty("jpackage.app-path");
if (exe != null) {
return Path.of(System.getProperty("java.home"))
.resolveSibling("app")
.resolve("res").resolve(resName).toFile();
}
return Path.of("res", resName).toFile();
}
...
String file = resourceFile("file_i_need.png");编辑
您还可以使用jpackage拥有的APPDIR变量自动设置您自己的系统属性。
public static File resourceFile(String resName) {
String appDir = System.getProperty("myAPPDIR");
return ((appDir == null) ? Path.of("") : Path.of(appDir))
.resolve("res").resolve(resName).toFile();
}为此,您需要使用属性文件命令jpackage @jpackage.args,并确保文件"jpackage.args“包含行:
--java-options "-DmyAPPDIR=$APPDIR"https://stackoverflow.com/questions/69139941
复制相似问题