[英]Maven not packing sound resources into JAR
我一直在試圖弄清楚這一點,但無濟於事:/
這是我的 POM 部分
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>ATComApp.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>"src/main/resources"</directory>
<includes>
<include>"*/*.wav"</include>
</includes>
</resource>
</resources>
</build>
<dependencies>
<dependency>
<groupId>com.googlecode.lanterna</groupId>
<artifactId>lanterna</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
當我構建項目時它運行但沒有發現聲音:
聲音部分的代碼是:
@Override
public void run() {
try {
File ostFile = new File(Constants.OST_PATH);
if (!ostFile.exists()) {
System.out.println("OST File not found.");
return;
}
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(ostFile);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
} catch (Exception ex) {
System.out.println("Sound error.");
ex.printStackTrace();
當我使用 IDE 運行時,它運行良好,而當我使用 package 時,它運行但沒有聲音,打印我的字符串“找不到 OST 文件。”...當我使用存檔管理器打開 JAR 時,資源文件夾不存在。
有誰知道為什么會這樣? 非常感謝!
Maven 是約定俗成的。 也就是說,您不需要在 pom.xml 中包含<resources>
部分。 只需將 WAV 文件放在src/main/resources/YOUR_PACKAGE/
下,然后使用 class 加載器加載它們。
如果
/src/main/java/com/yourorg/MyClass.java
|
/resources/com/yourorg/sounds.wav
然后你可以寫(未經測試):
package com.yourorg;
import ...
public class MyClass {
@Override
public void run() {
try {
// look up resource in the class path, which resides in the same package
URL ostFile = MyClass.class.getResource("sounds.wav");
if (ostFile == null) {
System.out.println("OST File not found.");
return;
}
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(ostFile);
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY);
} catch (Exception ex) {
System.out.println("Sound error.");
ex.printStackTrace();
}
}
如果您嘗試識別 a.jar 中的文件,則需要使用URL
而不是File
。 IDE 能夠使用File
,因為所有文件都位於可見目錄中。 但是一旦資源在 jar 內, File
命令將不再起作用。
關於 Maven 的 IDK 足以評論為什么資源沒有被壓縮。 但是當我在 CLI 上編譯程序時,我必須手動添加一個將資源處理到編譯程序的文件系統中的步驟。 AFAIK, javac
不會這樣做。 (可能有java
的 CLI 選項可以提供此功能,但如果有的話,我還沒有學習過)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.