goxr3plus / java-stream-player

🌌Java Advanced Audio Controller Library (WAV, AU, AIFF, MP3, OGG VORBIS, FLAC, MONKEY's AUDIO and SPEEX audio formats )
GNU General Public License v3.0
147 stars 33 forks source link

MP3 Playback does not work in exported JAR despite MP3 dependencies being added from XR3Player's pom file #79

Open lockieluke opened 12 months ago

lockieluke commented 12 months ago
plugins {
    id 'fabric-loom' version '1.4-SNAPSHOT'
    id 'maven-publish'
    id "org.jetbrains.kotlin.jvm" version "1.9.21"
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.21'
}

version = project.mod_version
group = project.maven_group

base {
    archivesName = project.archives_base_name
}

repositories {
    // Add repositories to retrieve artifacts from in here.
    // You should only use this when depending on other mods because
    // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
    // See https://docs.gradle.org/current/userguide/declaring_repositories.html
    // for more information about repositories.

    mavenCentral()
    maven { url = "https://jitpack.io/" }
}

loom {
    splitEnvironmentSourceSets()

    mods {
        "coopersmpwinterclient" {
            sourceSet sourceSets.main
            sourceSet sourceSets.client
        }
    }

}

dependencies {
    // To change the versions see the gradle.properties file
    minecraft "com.mojang:minecraft:${project.minecraft_version}"
    mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
    modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

    // Fabric API. This is technically optional, but you probably want it anyway.
    modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
    modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}"
    modImplementation "com.ptsmods:devlogin:3.4.1"

    // java-stream-player and its dependencies
    include implementation("com.github.goxr3plus:java-stream-player:10.0.2")
    include implementation("com.mpatric:mp3agic:0.9.1")
    include implementation("com.github.goxr3plus:jaudiotagger:2.2.7")
    include implementation("com.googlecode.soundlibs:mp3spi:1.9.5.4") {
        exclude group: 'com.googlecode.soundlibs', module: 'tritonus-share'
    }
    include implementation('org.jflac:jflac-codec:1.5.2')
    include implementation('com.github.trilarion:vorbis-support:1.1.0')
    include implementation('com.googlecode.soundlibs:tritonus-all:0.3.7.2') {
        exclude group: 'com.googlecode.soundlibs', module: 'tritonus-share'
    }
    // Uncomment the following line to enable the deprecated Fabric API modules.
    // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time.

    // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}"
}

processResources {
    inputs.property "version", project.version

    filesMatching("fabric.mod.json") {
        expand "version": project.version
    }
}

tasks.withType(JavaCompile).configureEach {
    it.options.release = 17
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jvmTarget = 17
    }
}

java {
    // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
    // if it is present.
    // If you remove this line, sources will not be generated.
    withSourcesJar()

    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

jar {
    from("LICENSE") {
        rename { "${it}_${project.base.archivesName.get()}" }
    }
}

remapJar {
    addNestedDependencies = true
}

// configure the maven publication
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }

    // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
    repositories {
        // Add repositories to publish to here.
        // Notice: This block does NOT have the same function as the block in the top level.
        // The repositories here will be used for publishing your artifact, not for
        // retrieving dependencies.
    }
}

I'm trying to use java-stream-player in a Minecraft fabric mod, everything works in dev environment but MP3 playback just does not work when the mod is exported to a normal JAR file and then added to a normal Minecraft Fabric instance.

It would simply says:

javax.sound.sampled.UnsupportedAudioFileException: Stream of unsupported format
goxr3plus commented 12 months ago

Well you have to export the jar dependencies outside the project jar on a separate folder. Same way i do it with XR3Player. I had this issue too. The jar dependencies can't be in the main jar file of the project for some weird reason.

So

1)Project Jar 2) MyProjectDependencies ( folder) => all jar dependencies here

It is possible just Google it a bit. I only know how to do it with Maven. Check my XR3Player repository

lockieluke commented 12 months ago

all of them JARs have to be external?

goxr3plus commented 12 months ago

Yes exactly there will be one main jar which has the application code and also will be a folder that contains all your project dependencies as jars.

Just copy paste my text and ask chatgpt ☺. It's easy to do it.

lockieluke commented 12 months ago

I tried so many things still doesn't work

lockieluke commented 12 months ago

@omegaui i think you came across the same issue 2 years ago, may i ask how did you manage to sort that out?

omegaui commented 12 months ago

@lockieluke I remember being able to fix this, Let me check that project It's been so long since I coded in Java

lockieluke commented 12 months ago

Thanks take your time 🙏

omegaui commented 12 months ago

@lockieluke So, there's an IDE I wrote, which has a plugin called Vibe n Code This plugin's sole purpose was to play music right in the IDE.

I was able to compile the plugin into self-contained jar with the required libraries. But I don't remember how I did it that time .... sorry about that.

But here's that self-contained jar file, if this could help.

omegaui commented 12 months ago

Also, in one of the its trailer videos, I could see, the plugin playing a wav file. image

lockieluke commented 12 months ago

Do you not have the source code

omegaui commented 12 months ago

The IDE The Plugin

Both of them

goxr3plus commented 12 months ago

Guys check the XR3Player of mine repository i have done it for you with Maven instead of Gradle. It's the same logic.

lockieluke commented 12 months ago

Good News, I did it! All of the stream-player related dependencies have to be exported to a folder outside the JAR

In this case, I created a new dependency keyword externalImplementation, the build script would pick that up and export the dependencies to a folder next to the jar named "dependencies". The biuld script will then add the relative path to the deps folder to the classpath, you can verify this by checking System.getProperty("java.class.path").

The thing I'm making is a Minecraft mod so when you install the mod you'll have to copy the "dependencies" folder next to the jar file too which is not the most seamless solution but it works, and there we go. Please consider keeping this issue open, it would help so many people.

plugins {
    id 'fabric-loom' version '1.4-SNAPSHOT'
    id 'maven-publish'
    id "org.jetbrains.kotlin.jvm" version "1.9.21"
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.21'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

version = project.mod_version
group = project.maven_group

base {
    archivesName = project.archives_base_name
}

configurations {
    externalImplementation
}

repositories {
    // Add repositories to retrieve artifacts from in here.
    // You should only use this when depending on other mods because
    // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
    // See https://docs.gradle.org/current/userguide/declaring_repositories.html
    // for more information about repositories.

    mavenCentral()
    maven {
        name = "jitpack"
        url = "https://jitpack.io/"
    }
}

loom {
    splitEnvironmentSourceSets()

    mods {
        "coopersmpwinterclient" {
            sourceSet sourceSets.main
            sourceSet sourceSets.client
        }
    }

}

dependencies {
    // To change the versions see the gradle.properties file
    minecraft "com.mojang:minecraft:${project.minecraft_version}"
    mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
    modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

    // Fabric API. This is technically optional, but you probably want it anyway.
    modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
    modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}"
    modImplementation "com.ptsmods:devlogin:3.4.1"

    // java-stream-player and its dependencies
        implementation externalImplementation("com.github.goxr3plus:java-stream-player:10.0.2")
    include implementation("com.github.goxr3plus:jaudiotagger:2.2.7")
    include implementation("com.mpatric:mp3agic:0.9.1")
    include implementation('com.googlecode.soundlibs:mp3spi:1.9.5-1') {
        exclude group: 'com.googlecode.soundlibs', module: 'tritonus-share'
    }
    include implementation('org.jflac:jflac-codec:1.5.2')
    include implementation('com.github.trilarion:vorbis-support:1.1.0')
    include implementation('com.googlecode.soundlibs:tritonus-all:0.3.7.2') {
        exclude group: 'com.googlecode.soundlibs', module: 'tritonus-share'
    }

    // Uncomment the following line to enable the deprecated Fabric API modules.
    // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time.

    // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}"
}

processResources {
    inputs.property "version", project.version

    filesMatching("fabric.mod.json") {
        expand "version": project.version
    }
}

tasks.withType(JavaCompile).configureEach {
    it.options.release = 17
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jvmTarget = 17
    }
}

java {
    // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
    // if it is present.
    // If you remove this line, sources will not be generated.
    withSourcesJar()

    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

remapJar {
    addNestedDependencies = true
}

// MAGIC STARTS HERE
def dependsDir = "build/libs/dependencies"

tasks.register("copyDependencies", Copy) {
    configurations.externalImplementation.canBeResolved = true
    from configurations.externalImplementation
    into "$dependsDir"
}

remapJar.dependsOn(tasks.named("copyDependencies"))

jar {
    from("LICENSE") {
        rename { "${it}_${project.base.archivesName.get()}" }
    }

    manifest {
        attributes("Class-Path": configurations.externalImplementation.collect { "dependencies/${it.getName()}" }.join(' '))
    }
}

// configure the maven publication
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }

    // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
    repositories {
        // Add repositories to publish to here.
        // Notice: This block does NOT have the same function as the block in the top level.
        // The repositories here will be used for publishing your artifact, not for
        // retrieving dependencies.
    }
}

include is a fabric api keyword, normally you would have to use shadowJar to bundle dependencies