Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
lockieluke opened this issue Dec 2, 2023 · 13 comments

Comments

@lockieluke
Copy link

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
Copy link
Owner

goxr3plus commented Dec 2, 2023

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
Copy link
Author

all of them JARs have to be external?

@goxr3plus
Copy link
Owner

goxr3plus commented Dec 2, 2023

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
Copy link
Author

I tried so many things still doesn't work

@lockieluke
Copy link
Author

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

@omegaui
Copy link

omegaui commented Dec 2, 2023

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

@lockieluke
Copy link
Author

Thanks take your time 🙏

@omegaui
Copy link

omegaui commented Dec 2, 2023

@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
Copy link

omegaui commented Dec 2, 2023

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

@lockieluke
Copy link
Author

Do you not have the source code

@omegaui
Copy link

omegaui commented Dec 2, 2023

The IDE
The Plugin

Both of them

@goxr3plus
Copy link
Owner

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

@lockieluke
Copy link
Author

lockieluke commented Dec 2, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants