0

I am building a mod jar. I need an external library to be included in the final jar (org.apache.httpcomponents:httpasyncclient:4.1.5). I am using the Shadow plugin to make the fat jar. However, I cannot get the dependencies to be included properly.

Here is my build.gradle:

buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "https://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath "net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT"
    }
}
plugins {
    id "com.github.johnrengelman.shadow" version "4.0.4"
    id "java"
}
apply plugin: "net.minecraftforge.gradle.forge"

configurations {
    shade
    implementation.extendsFrom shade
}
repositories {
    jcenter()
}
dependencies {
    compile "org.apache.httpcomponents:httpasyncclient:4.1.5"
    shade "org.apache.httpcomponents:httpasyncclient:4.1.5"
}
shadowJar {
    classifier = ''
    configurations = [project.configurations.shade]
    finalizedBy 'reobfShadowJar'
}
reobf {
    shadowJar {}
}
tasks.build.dependsOn reobfShadowJar
shadowJar.finalizedBy('reobfShadowJar')
compileJava {
    sourceCompatibility = targetCompatibility = "1.8"
}
archivesBaseName = "${mod_id}"
version = "${mod_version}"
group = "com.<modid>.<modid>"
minecraft {
    version = "1.8.9-11.15.1.2318-1.8.9"
    runDir = "run"
    replace "@VERSION@", project.version
    replaceIn "<Modid>.java"
    mappings = "stable_22"
}
processResources {
    inputs.property "mod_version", project.version
    inputs.property "mc_version", project.minecraft.version
    from(sourceSets.main.resources.srcDirs) {
        include "mcmod.info"
        expand "mod_id":"${mod_id}",
                "mod_name":"${mod_name}",
                "mod_version":"${mod_version}",
                "mod_description":"${mod_description}",
                "mc_version":"${mc_version}"
    }
    from(sourceSets.main.resources.srcDirs) {
        exclude "mcmod.info"
    }
}

When I run the "Minecraft Client" run configuration in IDEA, everything works as expected. However, when I run gradlew build, at runtime, I get Error: net.minecraftforge.fml.common.LoaderException: java.lang.NoClassDefFoundError: /org/apache/http/concurrent/FutureCallback. Why can't the mod loader find the classes, even though they are in the jar? (I might be doing this completely wrong).

1 Answers1

0

I had to relocate org.apache. I suppose it interfered with an existing dependency. The reason this didn't work before was that I was using an nonexistent gradle.properties placeholder.

buildscript {
    repositories {
        jcenter()
        maven {
            name = "forge"
            url = "https://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath "net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT"
    }
}
plugins {
    id "com.github.johnrengelman.shadow" version "4.0.4"
    id "java"
}
apply plugin: "net.minecraftforge.gradle.forge"
repositories {
    jcenter()
}
configurations {
    shade
    implementation.extendsFrom shade
}
dependencies {
    shade "org.apache.httpcomponents:httpasyncclient:4.1.5"
}
shadowJar {
    classifier = ""
    configurations = [project.configurations.shade]
    relocate("org.apache", "${group}.org.apache")
}
reobf {
    shadowJar {}
}
shadowJar.finalizedBy('reobfShadowJar')
compileJava {
    sourceCompatibility = targetCompatibility = "1.8"
}
archivesBaseName = "${mod_id}"
version = "${mod_version}"
group = "${group}"
minecraft {
    version = "1.8.9-11.15.1.2318-1.8.9"
    runDir = "run"
    replace "@VERSION@", project.version
    replaceIn "HighpixelSpeed.java"
    mappings = "stable_22"
}
processResources {
    inputs.property "mod_version", project.version
    inputs.property "mc_version", project.minecraft.version
    from(sourceSets.main.resources.srcDirs) {
        include "mcmod.info"
        expand "mod_id":"${mod_id}",
                "mod_name":"${mod_name}",
                "mod_version":"${mod_version}",
                "mod_description":"${mod_description}",
                "mc_version":"${mc_version}"
    }

    // copy everything else, thats not the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude "mcmod.info"
    }
}