Gradle 所做的一切完全在意料之中。这src/主/java and src/主/资源目录分别存放代码和资源。 resources 文件夹包含所有非 Java 代码,如图像、声音等。
创建 JAR 文件时,资源目录的内容将按原样复制(保持包结构)。注意点击.mp3 and bgm.mp3是成员sound包裹。
因此,当您想要加载资源时,(通常)不应该使用文件路径来完成。相反,使用包结构来执行此操作。在这里,随着声音和SoundPlayer
有相同的包,即sound
,您可以使用SoundPlayer
类来加载资源,如下所示:
public SoundPlayer(String filename) {
URL resource = SoundPlayer.class.getResource(filename);
Media soundMedia = new Media(resource.toExternalForm());
mediaPlayer = new MediaPlayer(soundMedia);
}
来自Java文档
公共字符串 toExternalForm()
构造此 URL 的字符串表示形式。该字符串是通过调用该对象的流协议处理程序的 toExternalForm 方法创建的。
本质上,toExternalForm() 函数为给定资源创建适当的 URL。
这是一个完整的例子。
// build.gradle
apply plugin: 'java'
apply plugin: 'application'
sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
mainClassName = 'sound.Main'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.10'
}
jar { manifest { attributes 'Main-Class': 'sound.Main' } }
和修改后的 SoundPlayer
//sound.SoundPlayer
package sound;
import java.net.URL;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
public class SoundPlayer {
private MediaPlayer mediaPlayer;
public SoundPlayer(String filename) {
URL resource = SoundPlayer.class.getResource(filename);
Media soundMedia = new Media(resource.toExternalForm());
mediaPlayer = new MediaPlayer(soundMedia);
}
public void play(){
mediaPlayer.play();
}
}
和使用 SoundPlayer 的 Main 类
// sound.Main
// This class does not actually create a JavaFX UI. Instead, it is
// only creating a JavaFX application to use Media
package sound;
import javafx.application.Application;
import javafx.stage.Stage;
/**
*
* @author aga53
*/
public class Main extends Application{
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
SoundPlayer s = new SoundPlayer("test.mp3");
System.out.println("Hello World");
s.play();
}
}