所以我的任务是创建一个显示媒体文件列表的小程序,并分别使用默认的 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
,媒体文件似乎没有人阅读,所以我的问题是:
- 为什么它通过 Netbeans 而不是通过构建 .jar 工作?
- 这是这个问题的最佳解决方案吗?
- 我应该以不同的方式包装媒体吗?
提前致谢。
编辑
因此,在通过控制台运行而不是双击 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/