当前位置: 首页 > 知识库问答 >
问题:

JPackage安装的Java程序目录结构

柳胡媚
2023-03-14

所以我刚刚让jpackage使用一个基本的测试程序。我遇到了一个问题,这个问题从本质上决定了这个系统是否可以应用于实际项目。

要进行设置,Java程序的结构如下:

        rootDirectory
        -src folder
        -res folder

程序从此根目录运行。运行时程序所需的文件位于res文件夹中。因此,程序将执行类似以下操作:File f=new File(“res/File\u i\u need.png”)

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

    rootDirectory
        -app folder
            -res folder
            -program.jar
        -runtime folder
        -program.exe

因此,当您运行程序时,突然间,文件f=新文件(“res/File\u i\u need.png”) 不再工作,因为新的根目录已将res文件夹掩埋在app文件夹中。

有没有办法将jpackage配置为将res文件夹放在根目录中,或者将其设置为将app文件夹用作根目录的位置,或者这是您一直在使用的方法?

为了澄清,以下内容不适用于此特定用途:

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

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

如果jpack不能处理这样的场景,则欢迎替代方案。

谢谢你的时间!

共有2个答案

巫马修然
2023-03-14

您可以使用系统确定资源目录的位置,而无需检查该FS路径的存在。getProperty(“jpackage.app path”)确定是否使用jpackage,然后从当前运行时中查找“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");

请参见jpack留档。

编辑

您还可以使用jpack ownAPPDIR变量自动设置自己的系统属性。

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"
丁恩
2023-03-14

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

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();
   }
}
 类似资料:
  • 我使用jpack打包了我的java应用程序。当我使用打包的安装程序安装它时,安装后的目录始终是

  • 我使用JPackage打包了我的java应用程序。当我安装它的时候,目录总是。我怎么更改它呢? 让我再澄清一次,我不是在讨论打包完成后打包的单个exe文件应该位于的输出目录。我说的是双击打包的exe文件后提取其内容的目录,默认情况下是 FIDA

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 我正在开发一个javafx应用程序。此应用程序与设备通信,因此设备JAR不是模块化的,它们附带一些添加到开发中的dll文件。现在,它在Netbeans 12.6上运行得很好,但在我使用jdk-17 jpackage创建安装程序时就不是了。我相信我遗漏了一些东西,但由于我对这个jpackage还很陌生,所以我不知道如何解决它。以下是

  • 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page。 一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下: 文件 必需 作用 app.js 是 小程序逻辑 app.json 是 小程序公共配置 app.ftss 否 小程序公共样式表 一个小程序页面由四个文件组成,分别是: 文件类型 必需 作用 js 是 页面逻辑 fxml 是 页面结构 json 否 页面配置 ftss

  • 程序目录结构 SpeedPHP框架的目录结构比较简单,秉承了SpeedPHP快速学习的理念。 新版的sp框架,由于加入了mudules开发模式,所以在目录结构方面,趋于更精炼,更固定化。 3.1版及之前的sp框架,目录结构是可以通过配置进行修改。 但是新版的情况不一样了。 之所以我们要用固定的目录结构,理由如下: 加入mudules开发模式,使得多个应用可以集成到一个程序里面,也就是传统的模块开发

  • 今天,我需要一个解决方案来避免在修补程序安装的上下文中通过install4j Version6.1.3创建安装目录。我编写了一个安装程序,其中包含一些文件来将它们安装到现有的应用程序安装中。这些文件应该与修补程序安装程序捆绑在一起。在install files操作中,我停用了install运行时选择点,但安装程序仍然创建了包含名为.install4j的文件夹的安装目录。在这个文件夹中只有一些ins