【发布时间】:2023-03-03 10:49:02
【问题描述】:
此代码在 Intellij 中编译,但在 jar 中不起作用。
使用getResourceAsStream() 或getResource 并不能解决问题。
(我已经尝试过使用像 Image image = newImage(getClass().getResourceAsStream("image.png"); 这样的 Image 并且它确实有效)
package Sound;
import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.io.File;
/**
*/
public class TestSound extends Application{
public TestSound() {
play();
}
@Override
public void start(Stage primaryStage) throws Exception {
new TestSound().play();
}
private void play(){
String mainsound = "src/res/sound/main.mp3";
Media i = null;
i = new Media( new File(mainsound).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(i);
mediaPlayer.play();
mediaPlayer.setStopTime(new Duration(120000));
mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);
}
public static void main (String[] args){
launch(args);
}
}
编辑:
Media i = new Media(getClass().getClassLoader().getResource(mainsound));
不会工作,因为构造函数需要一个字符串。
还有
Media i = new Media(getClass().getClassLoader().getResource(mainsound).toString());
new MediaPlayer(i).play();
不起作用。
当然 mainsound="res/sound/main.mp3";
用winrar提取jar后 我得到了声音词典,包括 testsound.class 和 main.mp3
还有另一个包含 main.mp3 的 res 字典
两个字典都在同一个根目录下。
【问题讨论】:
-
路径错误。
src文件夹不可能在运行时可用,尤其是在 jar 文件中。您需要使用具有正确路径的getClass().getResource(...)。通过命令行执行jar tf MyFile.jar来检查你生成的jar文件的内容;确保您在列表中看到 mp3 文件并记下它的路径。 -
你有什么理由a)将
play();添加到构造函数和start方法? b) 在start方法中创建另一个TestSound实例? -
@James_D 是的,.mp3 在 Jar 中,文件路径是 C:Users/Max/Desktop/TestSound/res/sound/main.mp3 是否意味着,如果我更改路径罐子。我也必须改变资源的路径?
-
不,您需要 jar 文件中 中的 mp3 路径,而不是在您的源或资源文件夹中。可能,根据您的 IDE 的配置,
/sound/main.mp3会如此,所以您可以使用getClass().getResource("/sound/main.mp3");,但我不知道您如何配置您的 IDE 来构建 jar 文件。如果您按照我之前评论中的建议列出 jar 内容会怎样?
标签: javafx jar media-player