Maven 没有将声音资源打包到 JAR 中
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>
当我构建项目时 运行s 但没有发现声音:
声音部分的代码是:
@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 时它 运行 很好,当我打包它 运行 但没有声音时,打印我的字符串 "OST File not found." ...当我使用存档管理器打开 JAR 时,资源文件夹不存在。
有人知道为什么会这样吗?
非常感谢!
如果您尝试识别 .jar 中的文件,则需要使用 URL
,而不是 File
。 IDE 可以使用 File
,因为所有文件都位于可见目录中。但是一旦资源在 jar 中,File
命令将不再起作用。
关于 Maven 的 IDK 足以评论为什么资源没有被压缩。但是当我在 CLI 上编译程序时,我必须手动添加一个将资源处理到编译程序的文件系统中的步骤。 AFAIK,javac
不会这样做。 (可能有 java
的 CLI 选项可以提供此功能,但如果有的话我还没学过)。
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();
}
}
我花了一段时间想弄清楚这个问题,但无济于事:/
这是我的 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>
当我构建项目时 运行s 但没有发现声音:
声音部分的代码是:
@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 时它 运行 很好,当我打包它 运行 但没有声音时,打印我的字符串 "OST File not found." ...当我使用存档管理器打开 JAR 时,资源文件夹不存在。
有人知道为什么会这样吗? 非常感谢!
如果您尝试识别 .jar 中的文件,则需要使用 URL
,而不是 File
。 IDE 可以使用 File
,因为所有文件都位于可见目录中。但是一旦资源在 jar 中,File
命令将不再起作用。
关于 Maven 的 IDK 足以评论为什么资源没有被压缩。但是当我在 CLI 上编译程序时,我必须手动添加一个将资源处理到编译程序的文件系统中的步骤。 AFAIK,javac
不会这样做。 (可能有 java
的 CLI 选项可以提供此功能,但如果有的话我还没学过)。
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();
}
}