【问题标题】:Proper packaging of runnable Jar project in netbeans在netbeans中正确打包runnable Jar项目
【发布时间】:2017-05-21 17:00:49
【问题描述】:

所以我的任务是创建一个显示媒体文件列表的小程序,并使用默认的 OS 媒体播放器分别运行这些媒体文件。

我目前的解决方案是创建一个包含所有媒体文件的包,例如:

-com.media
       |_a.mp4
       |_b.mp4

以下代码将选定的 mp4 复制到临时目录,然后运行默认的 os 媒体播放器:

public File copyTempMedia(File tempAppFolder, String videoName) {

    URL f = getClass().getResource(String.format("%s/%s", Constants.MEDIA_LOCATION, videoName));
    File from = new File(f.getPath());
    File to = new File(tempAppFolder.getAbsolutePath());

    try {
        FileUtils.copyFileToDirectory(from, to);
    } catch (IOException ex) {
        Logger.getLogger(MediGUIModel.class.getName()).log(Level.SEVERE, null, ex);
    }
    System.out.println("Temp video copied: "  +  to.getAbsolutePath() + "/" + to.getName());
    return to;
}

public void triggerMediaPlayer(String fileLocation) {
    System.out.println("Triggering media player: " + fileLocation);
    try {
        if (OPERATIN_SYSTEM.contains("Linux")) {
            Runtime.getRuntime().exec("sh -c " + fileLocation);
        } else if (OPERATIN_SYSTEM.contains("Windows")) {

            Runtime.getRuntime().exec("cmd /c " + fileLocation);
        }
    } catch (IOException ex) {
        Logger.getLogger(MediGUIModel.class.getName()).log(Level.SEVERE, null, ex);
        ex.printStackTrace();
    }
}

当我通过 Netbeans 运行程序时,它按预期工作,但是当我执行 clean/build 运行从构建创建的 .jar 时,似乎没有读取媒体文件,所以我的问题是:

  1. 为什么它通过 Netbeans 而不是通过 build .jar 工作?
  2. 这是解决此问题的最佳方法吗?
  3. 我应该以不同的方式包装媒体吗?

提前致谢。

编辑

所以在通过控制台运行而不是双击 jar 之后,在我读取文件的行中得到一个空指针异常:

URL f = getClass().getResource(String.format("%s/%s", Constants.MEDIA_LOCATION, videoName));

为什么它在 Netebeans 中有效,但在 build/jar 中无效?

在 jar 中是否还有其他地方可以放置媒体文件,以便通过 getResource 或 getResourceAsStream 毫无问题地读取它们?

【问题讨论】:

    标签: java netbeans jar


    【解决方案1】:

    当您在 NetBeans 中运行项目时,它不会像 java -jar yourproject.jar 那样运行可执行 jar。相反,它将类路径设置为类似于java -cp build/classes com.media.YourMainClass 的构建/类。这意味着您的视频文件是位于 yourproject/build/classes/com/media 中的实际文件,它们可以作为文件系统中的普通文件访问,也可以像普通文件一样复制。从 jar 运行时,文件被打包在 jar 文件中,无法使用简单的文件复制命令进行复制。

    不要通过调用getClass().getResource() 来获取URL,而是尝试通过调用getClass().getResourceAsStream() 来获取InputStream。然后,您可以编写一个简单的循环将字节从输入流复制到您的临时文件。

    【讨论】:

    • 嘿Corey,我尝试使用getResourceAsStream,但这只是返回null。还有其他建议吗?
    • 在 jar 中是否还有其他位置可以放置媒体文件,以便通过 getResourcegetResourceAsStream 毫无问题地读取它们?
    • 您得到一个空值,因为路径不太正确。例如,尝试添加前导斜杠“/com/media/a.mp4”。
    • 或者更好的是,首先处理 URL 而不是文件。您可以从两者中读取输入。并且 File 总是可以转换为 URL,反之则不然。您可能想研究通过标准输入将数据流式传输到媒体播放器。如果你能做到这一点,那么根本不需要使用 File。
    【解决方案2】:

    这个 sn-p 可能会有所帮助:

        BufferedInputStream result = (BufferedInputStream) getClass().getResourceAsStream("/com/media/a.mp4");
        byte[] bytes = new byte[4098];
        try {
            result.read(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(new String(bytes));
    

    您需要读取循环中的字节或其他内容,但这应该可以在不需要单独的 jar 的情况下工作。

    【讨论】:

      【解决方案3】:

      我认为将媒体文件放在 jar 中不是一个好主意,因为如果要更改一个,则需要重新构建项目,并且 jar 的大小会变大。

      用途:

      File from = new File(String.format("%s/%s", Constants.MEDIA_LOCATION,videoName));
      

      从与 jar 相同的文件夹中加载文件。

      如果您想将媒体保存在 jar 中,请创建一个 Maven 项目并将 mp4 放在 src/main/resources 中。 使用 maven 创建一个 fat jar 并且 src/main/resources 将包含在 jar 中。 参见 'maven-shade-plugin' 配置 pom.xml 和 https://www.mkyong.com/maven/create-a-fat-jar-file-maven-shade-plugin/

      那你就可以使用其他maven的优秀属性了!

      Reading a resource file from within jar

      编辑

      经过一些尝试,我无法使用 jar 中的“getResource”来正确处理它。 您从 jar 中获取的路径如下:file:/C:/.../JavaApplication4/dist/JavaApplication4.jar!/test.txt 并且未被识别为有效的文件系统路径。

      您可以使用 'getResourceAsStream' 并将文件从 jar 复制到本地文件夹。

      InputStream in;
      OutputStream out;
      IOUtils.copy(in,out);
      in.close();
      out.close();
      

      【讨论】:

        【解决方案4】:

        好的,我找到了解决方案:

        1. 使用media.*.mp4 创建一个单独的项目。
        2. 导出为Jar 库。
        3. 将库导入桌面应用程序。
        4. 确保库位于类路径中。

        这个解决方案对我有用...

        如果有人有更好的解决方案,很高兴听到,希望在赏金结束之前 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-19
          • 2012-01-21
          • 2014-11-15
          • 2012-06-05
          • 1970-01-01
          • 2020-04-24
          • 2011-11-07
          • 2015-01-12
          相关资源
          最近更新 更多