Wil*_*ser 8 java javafx jar gradle
我有一个javafx项目,我正在使用Gradle文件构建,我正在Intellij中编写所有内容.在其中,我使用javafx.scene.media.Media和javafx.scene.media.MediaPlayer播放一些音乐.
public SoundPlayer(String filename) {
String soundLocation = "\\src\\main\\resources\\sound\\" + fileName;
String absolute = new File("").getAbsolutePath() + soundLocation;
System.out.println(absolute);
Media soundMedia = new Media(new File(absolute).toURI().toString());
mediaPlayer = new MediaPlayer(soundMedia);
}
Run Code Online (Sandbox Code Playgroud)
我一直在努力的项目目录是:
SRC /
| ---主/
| --- | ---爪哇/
| --- | --- | --- sound.SoundPlayer
| --- | ---资源/
| --- | --- | ---声音/
| --- | --- | --- | --- click.mp3
| --- | --- | --- | --- bgm.mp3
然而,当我去编译并将其转换为jar文件时,Gradle将目录更改为此(在jar文件中,顶级):
声音/
| --- SoundPlayer.class
| --- click.mp3
| --- bgm.mp3
这使得它引发媒体异常:MEDIA UNAVAILABLE.我已经尝试将文件更改为以下两个:
Media soundMedia = new Media(new File("sound\\" + fileName).toURI().toString());
Run Code Online (Sandbox Code Playgroud)
和
Media soundMedia = new Media(new File(fileName).toURI().toString());
Run Code Online (Sandbox Code Playgroud)
......但我总是得到同样的例外.这是怎么回事?
Ank*_*kit 11
Gradle做了什么是完全可以预料到的.该的src/main/JAVA和SRC /主/资源目录分别存储代码和资源.resources文件夹包含所有非java代码,如图像,声音等.
创建jar文件时,资源目录的内容将按原样复制(维护包结构).请注意,click.mp3和bgm.mp3是声音包的成员.
因此,当您要加载资源时,应该(通常)不使用文件路径来完成.而是使用包结构来做到这一点.在这里,作为声音和SoundPlayer具有相同的包,即sound,您可以使用SoundPlayer该类来加载如下资源:
public SoundPlayer(String filename) {
URL resource = SoundPlayer.class.getResource(filename);
Media soundMedia = new Media(resource.toExternalForm());
mediaPlayer = new MediaPlayer(soundMedia);
}
Run Code Online (Sandbox Code Playgroud)
来自Javadocs
public String 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' } }
Run Code Online (Sandbox Code Playgroud)
和修改后的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();
}
}
Run Code Online (Sandbox Code Playgroud)
和Main类使用SoundPlayer
// 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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5010 次 |
| 最近记录: |