【问题标题】:JPackage installed Java program directory structureJPackage安装Java程序目录结构
【发布时间】:2021-09-11 04:13:27
【问题描述】:

所以我刚刚让 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文件夹埋在了app文件夹中了。

有没有办法配置 jpackage 将 res 文件夹放在根目录中,或者将其设置为 app 文件夹用作根目录的位置,或者这是你刚刚卡住的东西?

澄清一下,以下不会适用于这个特定的用例:

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

重点是用户可以自己轻松地编辑/调整 res 文件夹中的文件。

如果 jpackage 无法处理这种情况,欢迎使用替代方案。

感谢您的宝贵时间!

【问题讨论】:

  • 为什么不能使用路径app-folder/res/file_i_need
  • 问题是这个程序已经用 res/file_i_need 构建了,因为它在 eclipse 中是这样工作的。 app-folder 是 jpackage 在打包过程中自动添加的。除了可能试图以一种期望工作目录不匹配的方式进行破解之外,没有办法在代码本身中真正考虑到它。
  • 使用系统属性为res 文件夹提供前缀,您只能在从 jpacked 版本运行时设置(我想 jpackage 允许您指定系统属性?)
  • 您能详细说明一下吗?也许将其添加为问题的潜在答案。
  • 正如最初的帖子中提到的,在这种情况下,使用 getResourceAsStream/将这些资源包含在 JAR 本身中是不可能的。用户需要轻松访问它们。本文 (docs.oracle.com/javase/10/deploy/…) 中的这张图片 (docs.oracle.com/javase/10/deploy/img/bundle_file_struc.png) 实际上显示了它的外观。唯一的问题是exe在运行时弄乱了根目录应该是什么。

标签: java jpackage


【解决方案1】:

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

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();
   }
}

【讨论】:

    【解决方案2】:

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

    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 documentation

    编辑

    您还可以使用 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      相关资源
      最近更新 更多