МирДружбаЖвачка ForgeGradle + ShadowGradle

Версия Minecraft
1.7.10
API
Forge
13
2
4
Надеюсь кто-то уже настраивал себе среду под ShadowGraddle.
У меня есть настроенная среда под плагины, и там shadowgradle работает почти идеально. Решил перенести свой build.gradle оттуда в среду с Forge, но не тут то было.
Билдиться с нужными либами оно конечно стало, вот только мод работать перестал:
  • На клиенте java.lang.NoSuchMethodError: net.minecraft.client.Minecraft.getMinecraft()
  • На серверной стороне java.lang.NoSuchMethodError: net.minecraft.item.Item.getItemById(I)

С сборкой без shadowgradle все было ок. Билдил все через gradlew build. Build.gradle прикрепил

P.s. не кидайтесь яблоками, возможно когда-то я предпочту GSON вместо Jackson, но это не единственная либа на очереди, потому легче мне не станет)
P.s.2 с обычной конфигурацией он пихает весь Forge в мой джарник. С configurations = [project.configurations.shadow] все тоже самое.
P.s.3 ну и если посмотреть готовый джарник, то в shadow майновские методы никак не обфуцированы
build.gradle:
buildscript {
    repositories {
        mavenCentral()
        maven {
            url = uri("https://plugins.gradle.org/m2/")
        }
        maven {
            name = "github"
            url = "https://github.com/juanmuscaria/maven/raw/master"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:[1.2-1.4.6-SNAPSHOT,)'
        classpath("com.github.jengelman.gradle.plugins:shadow:4.0.0")
    }
}

repositories {
    flatDir {
        dirs 'deps'
    }
    maven {
        name = "Snapshot repo"
        url = "https://oss.sonatype.org/service/local/repositories/iogitlabhohserg-1069/content/"
    }
}

apply plugin: 'java'
apply plugin: 'forge'
apply plugin : 'com.github.johnrengelman.shadow'

[compileJava, compileTestJava][I].options[/I].encoding = 'UTF-8'
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'

version = mod_version
group = mod_group
archivesBaseName = mod_archives_name

minecraft {
    version = "1.7.10-10.13.4.1614-1.7.10"
    runDir = "eclipse"
    replace "@VERSION@", project.version
}
configurations {
    shade
    implementation.extendsFrom shade
}

dependencies {
    implementation "io.gitlab.hohserg.elegant.networking:elegant-networking-1.7.10:3.14"
    compileOnly "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14"
    annotationProcessor "io.gitlab.hohserg.elegant.networking:annotation-processor:3.14"
 
    shade 'com.fasterxml.jackson.core:jackson-databind:2.14.2'
}

processResources {

    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod.info'
        expand 'version': project.version,
        'mod_id': mod_id,
        'mod_name': mod_name,
        'mod_author': mod_author,
        'mod_description': mod_description,
        'mc_version': mc_version,
        'mod_version': mod_version,
        'mod_icon': mod_icon
    }

    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}

task devJar(type: Jar) {
    classifier = 'dev'
    from sourceSets.main.output
}

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

artifacts {
    archives devJar
    archives sourcesJar
}


shadowJar {
    relocate 'com.fasterxml.jackson', 'exlnmoddeps.com.fasterxml.jackson'
    archiveBaseName.set('shadowMod')
    archiveClassifier.set('')
    archiveVersion.set('')
    configurations = [project.configurations.shade]
}
reobf {
    shadowJar {
    }
}
assemble.dependsOn shadowJar
idea.module.inheritOutputDirs = true
 
Решение
reobf { shadowJar { } } assemble.dependsOn shadowJar
Не будет оно так работать.

С созданием своей конфигурации сделал правильно, встроенная shadow предназначена немного для другого. Сделать тебе нужно следущее:
Gradle (Groovy):
shadowJar {
    manifest.inheritFrom(tasks.jar.manifest)
    configurations = [project.configurations.shade]
    classifier("${tasks.jar.classifier}-shadow")
}

reobf.reobf(shadowJar) { spec ->
    spec.classpath = sourceSets.main.compileClasspath;
}

tasks.build.dependsOn(shadowJar)
373
26
102
reobf { shadowJar { } } assemble.dependsOn shadowJar
Не будет оно так работать.

С созданием своей конфигурации сделал правильно, встроенная shadow предназначена немного для другого. Сделать тебе нужно следущее:
Gradle (Groovy):
shadowJar {
    manifest.inheritFrom(tasks.jar.manifest)
    configurations = [project.configurations.shade]
    classifier("${tasks.jar.classifier}-shadow")
}

reobf.reobf(shadowJar) { spec ->
    spec.classpath = sourceSets.main.compileClasspath;
}

tasks.build.dependsOn(shadowJar)
 
13
2
4
Ладно, видимо я немного поторопился. Оказывается это была одноразовая акция, когда он и правда скомпилился как надо.

Если указывать зависимость через shade, получаю подобное:
failed:
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':reobf'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:166)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:163)
    at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:191)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:156)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
    at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
    at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
    at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: java.lang.IllegalArgumentException
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:170)
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:153)
    at org.objectweb.asm.ClassReader.<init>(ClassReader.java:424)
    at net.md_5.specialsource.JarRemapper.remapClassFile(JarRemapper.java:228)
    at io.github.crucible.forgegradle.reobf.JarRemapperWrapper.remapJar(JarRemapperWrapper.java:62)
    at net.minecraftforge.gradle.tasks.user.reobf.ObfArtifact.applySpecialSource(ObfArtifact.java:375)
    at net.minecraftforge.gradle.tasks.user.reobf.ObfArtifact.generate(ObfArtifact.java:333)
    at net.minecraftforge.gradle.tasks.user.reobf.ReobfTask.doTask(ReobfTask.java:277)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:717)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:684)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:476)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:461)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:444)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:93)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:237)
    at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
    at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
    at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
    at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
    at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
    at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
    at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
    at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
    at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
    at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
    at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
    at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
    at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
    at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
    at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:208)
    at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
    at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
    at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
    at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
    at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
    at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
    at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
    at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
    at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
    at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
    at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
    at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
    at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
    at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
    at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
    at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
    at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
    at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:69)
    at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:47)
    at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:140)
    ... 34 more
Насколько я понял из лога, оно пытается применить маппинги не только на основной проект, но и на либы.
 
13
2
4
Ладно, я решил просто пойти в обход. В Main классe мода обфуцировать ничего не надо, а значит пустой мод можно собрать даже через настроенный 'shadow' таск, который тупо джарник собирает. Так я и сделал, запихнув туда нужную либу шадоуградлом, а эту затычку уже как зависимость в основной проект.
Костыль, но мне никто ничего не сделает я в другом городе :)
 
1,202
37
238
Если тебе не критично шейдить через плагин, то можешь посмотреть как я сделал через создание конфигурации, причем для такой же цели (мне нужен json5 в моде): MJUtils/build.gradle at master · MJaroslav/MJUtils

---

В configurations {} создаю shade, в minecraft {} меняю пакет либы через srgExtra, в dependencies {} подключаю через shade, в jar {} добавляю все shade в итог сборки.
 
Сверху