java - 在 netbeans 中正确打包可运行的 Jar 项目

标签 java netbeans jar

所以我的任务是创建一个显示媒体文件列表的小程序,并分别使用默认的 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 而不是通过构建 .jar 工作?
  2. 这是这个问题的最佳解决方案吗?
  3. 我应该以不同的方式包装媒体吗?

提前致谢。

编辑

因此,在通过控制台运行而不是双击 jar 后,在我读取文件的行中出现空指针异常:

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

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

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

最佳答案

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

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

关于java - 在 netbeans 中正确打包可运行的 Jar 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099508/

相关文章:

java - java中的Mysql查询

mysql - 将 JSF 添加到 Netbeans 中的现有项目 J2EE

groovy - 使用要执行的 Spock 测试集创建一个 Groovy 可执行 jar

java - 如何学习鼠标移动?

java - 某些操作系统版本上的 NoSuchMethodError

java - 通过 GarbageCollectorMXBean 确定 GC 类型

java - 如何通知客户端有关 Rest 端点更改的信息

java - Windows下模拟打印屏幕

java - Jzy3d API 的正确 jar 文件是什么?

java - 将文件扩展名与 Java 应用程序关联