首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPackage安装的Java程序目录结构

JPackage安装的Java程序目录结构
EN

Stack Overflow用户
提问于 2021-09-11 04:13:27
回答 2查看 242关注 0票数 2

所以我刚刚开始用一个基本的测试程序来处理jpackage。我遇到了一个问题,它将从本质上决定这个系统是否可以应用到实际项目中。

为了设置这一点,Java程序的结构如下:

代码语言:javascript
复制
        rootDirectory
        -src folder
        -res folder

程序从这个根目录运行。运行时程序所需的文件位于res文件夹中。因此,该程序将执行类似于File f = new File("res/file_i_need.png");的操作。

我把它导出成一个JAR,现在我用jpackage打包它。安装程序已经完成,我安装了程序。生成的文件夹结构如下所示:

代码语言:javascript
复制
    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文件夹用作根目录的位置,或者这是您刚刚遇到的问题吗?

为了澄清这一点,下面的将不适用于这个特定的用法:

  • 将资源存储在JAR本身中
  • 将资源存储在其他JAR中

关键是用户可以轻松地编辑/调整res文件夹中的文件。

如果jpackage无法处理这样的场景,则欢迎使用其他方案。

耽误您时间,实在对不起!

EN

回答 2

Stack Overflow用户

发布于 2021-09-11 05:38:49

也许最简单的解决方案就是检查这两个位置:

代码语言:javascript
复制
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();
   }
}
票数 0
EN

Stack Overflow用户

发布于 2021-09-11 09:05:03

您可以通过使用System.getProperty("jpackage.app-path")来确定是否使用jpackage来确定资源目录的位置,而无需检查FS路径的存在,然后从当前运行时查找"app“dir,因为对于Windows、MacOS和Linux,"app”和" runtime“文件夹处于相同的级别。

代码语言:javascript
复制
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文档

编辑

您还可以使用jpackage拥有的APPDIR变量自动设置您自己的系统属性。

代码语言:javascript
复制
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“包含行:

代码语言:javascript
复制
--java-options "-DmyAPPDIR=$APPDIR"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69139941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档