Class GenerateForgePatchedJarTask

java.lang.Object
org.gradle.api.internal.AbstractTask
org.gradle.api.DefaultTask
net.fabricmc.loom.pipeline.GenerateForgePatchedJarTask
All Implemented Interfaces:
Comparable<org.gradle.api.Task>, org.gradle.api.internal.DynamicObjectAware, org.gradle.api.internal.TaskInternal, org.gradle.api.Named, org.gradle.api.plugins.ExtensionAware, org.gradle.api.Task, org.gradle.util.Configurable<org.gradle.api.Task>

@CacheableTask public abstract class GenerateForgePatchedJarTask extends org.gradle.api.DefaultTask
L3 流水线:生产 modern Forge 的最终 patched jar(与 client-extra).

它取代的是 MinecraftPatchedProvider.remapJar 里那段配置期同步执行的 「判断是否需要重建 → 取跨进程锁 → 重映射 patched jar / 填充 client-extra → 原子落位」。

旧路径 vs 本任务
旧路径本任务
是否需要重建配置期 provide() 设的 dirty + 锁内二次确认 Gradle up-to-date 检查(输入内容 + 输出快照)+ 锁内按可复用性二次确认
并发保护跨进程文件锁任务图 + 跨进程文件锁(产物仍在共享缓存)
执行时机配置期(CompileConfiguration.setupMinecraft)执行期

生产逻辑不在这里

真正的生产仍由 MinecraftPatchedProvider.produceFinalJarsForTask(dev.architectury.loom.forge.minecraft.MinecraftPatchedProvider.ProductionOptions, java.nio.file.Path, java.nio.file.Path, java.nio.file.Path, java.lang.String, boolean, java.util.function.Consumer<java.lang.String>) 持有:它和配置期路径共用 同一份实现(remapFinalJar / fillClientExtraJar),因此两条路径的产物逐字节一致。 本任务另写一套「等价」的实现就会引入分叉——同一个输入产出两份略有差异的 jar,正是这次迁移要消灭的东西。 与 GenerateSrgNamedMappingsTask 处置一致:同一份实现被两条路径共用。

为什么输出是共享缓存里的那两个绝对路径

产物位置必须与配置期逐字一致(<userCache>/<mcVersion>/forge/minecraft-<type>-patched.jar 与 client-extra.jar):消费侧(getMinecraftJars()/ getMinecraftJarsCollection(OFFICIAL)、FORGE_EXTRA 配置的依赖项)按路径找它们。 该目录跨项目、跨 daemon 共享,因此「同一个路径只有一个生产者」由 RemapMinecraftTaskRegistry 在同一构建内保证,跨构建由 @OutputFile 的 up-to-date 判定 与产物自身的原子落位承担。

输入为什么是这些

输入逐项对应生产时真正读入的文件与判据,而不是「把 provider 的对象搬进来」:
  • getAtPatchedJar():重映射的输入(打过补丁并做过 AT 的中间 jar);
  • getForgeJar():参与重映射的类解析,并作为产物里的非 class 文件来源;
  • getForgeUserdevJar():inject/ 下的文件会被复制进产物;
  • getClientJar():client-extra 的非 class 文件来源;
  • getServerJar():NeoForge 的 dist 清单要按它分边(bootstrap 版本是抽取产物, 否则是下载下来的 server jar);
  • getMappingsServiceOptions():上述重映射、coremod 重映射与 dist 清单都从它取映射树, 与配置期 buildRemapper/remapCoreMods 用的是同一个映射选项;
  • getPatchVersion():写在产物 manifest 里的补丁版本,也是配置期路径的就绪判据。
  • Nested Class Summary

    Nested classes/interfaces inherited from interface org.gradle.api.Named

    org.gradle.api.Named.Namer
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    任务名:消费侧(本仓库的测试与诊断)按它引用产出任务.

    Fields inherited from interface org.gradle.api.Task

    TASK_ACTION, TASK_CONSTRUCTOR_ARGS, TASK_DEPENDS_ON, TASK_DESCRIPTION, TASK_GROUP, TASK_NAME, TASK_OVERWRITE, TASK_TYPE
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
     
    abstract org.gradle.api.file.RegularFileProperty
    打补丁并做过 access transform 的中间 Minecraft jar,即重映射的输入.
    abstract org.gradle.api.provider.Property<Boolean>
    本配置是否产出 client-extra(与配置期 providesClientJar() 同判据).
    abstract org.gradle.api.file.RegularFileProperty
    产物:client-extra(与配置期同一条路径);不产出时为未设置.
    abstract org.gradle.api.file.RegularFileProperty
    client jar(client-extra 的内容来源);server-only 配置下不设置.
    abstract org.gradle.api.provider.Property<String>
    coremod 重映射使用的源命名空间(生产命名空间).
    abstract org.gradle.api.provider.Property<String>
    写进 dist 清单的 Minecraft-Dists 取值.
    abstract org.gradle.api.provider.Property<Boolean>
    是否 Forge(决定 client-extra 是否写空 MANIFEST).
    abstract org.gradle.api.file.RegularFileProperty
    Forge 的 universal jar.
    abstract org.gradle.api.file.RegularFileProperty
    Forge 的 userdev jar.
    abstract org.gradle.api.provider.Property<String>
    跨进程锁的 key:与配置期 withPatchedLock 取同一个 key,两侧的生产才不会互相穿插.
    abstract org.gradle.api.provider.Property<String>
    跨进程锁所在目录.
    abstract org.gradle.api.provider.Property<TinyMappingsService.Options>
    映射服务配置:产出 jar 的重映射、coremod 重映射与 dist 清单都读它.
    abstract org.gradle.api.provider.Property<Boolean>
    是否 MERGED 形态(决定 dist 清单是否按 client/server 分边).
    abstract org.gradle.api.provider.Property<Boolean>
    是否 NeoForge(决定是否挂 mixin 扩展、是否写 dist 清单).
    abstract org.gradle.api.file.RegularFileProperty
    产物:最终 patched jar(与配置期同一条路径).
    abstract org.gradle.api.provider.Property<String>
    Loom 补丁版本:写在产物 manifest 里,也是配置期路径的就绪判据.
    abstract org.gradle.api.provider.Property<Boolean>
    是否显式要求刷新(对应 --refresh-dependencies);与配置期 refreshDeps 同源.
    abstract org.gradle.api.provider.Property<String>
    重映射的源命名空间(Forge 为 srg、NeoForge 为 mojang).
    abstract org.gradle.api.provider.Property<Boolean>
    是否在运行时使用 mojang 映射(决定 coremod 重映射的方向).
    abstract org.gradle.api.file.RegularFileProperty
    服务端侧 jar;仅 MERGED 形态用于 NeoForge 的 dist 清单.
    abstract org.gradle.api.provider.Property<Boolean>
    是否 unobfuscated Forge(最终 jar 走 userdev 合并分支、dist 清单用空映射树).

    Methods inherited from class org.gradle.api.DefaultTask

    compareTo, configure, dependsOn, doFirst, doFirst, doFirst, doLast, doLast, doLast, finalizedBy, getActions, getAnt, getDependsOn, getDescription, getDestroyables, getDidWork, getEnabled, getExtensions, getFinalizedBy, getGroup, getInputs, getLocalState, getLogger, getLogging, getMustRunAfter, getName, getOutputs, getPath, getProject, getShouldRunAfter, getState, getTaskDependencies, getTemporaryDir, getTimeout, hasProperty, mustRunAfter, onlyIf, onlyIf, onlyIf, property, setActions, setDependsOn, setDescription, setDidWork, setEnabled, setFinalizedBy, setGroup, setMustRunAfter, setOnlyIf, setOnlyIf, setOnlyIf, setProperty, setShouldRunAfter, shouldRunAfter, usesService

    Methods inherited from class org.gradle.api.internal.AbstractTask

    acceptServiceReferences, appendParallelSafeAction, doNotTrackState, doNotTrackStateIf, getAsDynamicObject, getIdentityPath, getImpliesSubProjects, getLifecycleDependencies, getOnlyIf, getReasonNotToTrackState, getReasonsNotToTrackState, getReasonTaskIsIncompatibleWithConfigurationCache, getRequiredServices, getServices, getSharedResources, getStandardOutputCapture, getTaskActions, getTaskIdentity, getTemporaryDirFactory, hasTaskActions, injectIntoNewInstance, isCompatibleWithConfigurationCache, isEnabled, isHasCustomActions, notCompatibleWithConfigurationCache, prependParallelSafeAction, restoreOnlyIf, restoreTaskActions, setImpliesSubProjects

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.gradle.api.Task

    doNotTrackState, notCompatibleWithConfigurationCache
  • Field Details

    • NAME

      public static final String NAME
      任务名:消费侧(本仓库的测试与诊断)按它引用产出任务.
      See Also:
  • Constructor Details

    • GenerateForgePatchedJarTask

      public GenerateForgePatchedJarTask()
  • Method Details

    • getAtPatchedJar

      @InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getAtPatchedJar()
      打补丁并做过 access transform 的中间 Minecraft jar,即重映射的输入.
    • getForgeJar

      @InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getForgeJar()
      Forge 的 universal jar.
    • getForgeUserdevJar

      @InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getForgeUserdevJar()
      Forge 的 userdev jar.
    • getClientJar

      @InputFile @PathSensitive(NONE) @Optional public abstract org.gradle.api.file.RegularFileProperty getClientJar()
      client jar(client-extra 的内容来源);server-only 配置下不设置.
    • getServerJar

      @InputFile @PathSensitive(NONE) @Optional public abstract org.gradle.api.file.RegularFileProperty getServerJar()
      服务端侧 jar;仅 MERGED 形态用于 NeoForge 的 dist 清单.
    • getMappingsServiceOptions

      public abstract org.gradle.api.provider.Property<TinyMappingsService.Options> getMappingsServiceOptions()
      映射服务配置:产出 jar 的重映射、coremod 重映射与 dist 清单都读它.
    • getClientExtraEnabled

      @Input public abstract org.gradle.api.provider.Property<Boolean> getClientExtraEnabled()
      本配置是否产出 client-extra(与配置期 providesClientJar() 同判据).
    • getPatchVersion

      @Input public abstract org.gradle.api.provider.Property<String> getPatchVersion()
      Loom 补丁版本:写在产物 manifest 里,也是配置期路径的就绪判据.
    • getNeoForge

      @Input public abstract org.gradle.api.provider.Property<Boolean> getNeoForge()
      是否 NeoForge(决定是否挂 mixin 扩展、是否写 dist 清单).
    • getForge

      @Input public abstract org.gradle.api.provider.Property<Boolean> getForge()
      是否 Forge(决定 client-extra 是否写空 MANIFEST).
    • getUnobfuscatedForge

      @Input public abstract org.gradle.api.provider.Property<Boolean> getUnobfuscatedForge()
      是否 unobfuscated Forge(最终 jar 走 userdev 合并分支、dist 清单用空映射树).
    • getRuntimeMojang

      @Input public abstract org.gradle.api.provider.Property<Boolean> getRuntimeMojang()
      是否在运行时使用 mojang 映射(决定 coremod 重映射的方向).
    • getMerged

      @Input public abstract org.gradle.api.provider.Property<Boolean> getMerged()
      是否 MERGED 形态(决定 dist 清单是否按 client/server 分边).
    • getRemapNamespace

      @Input public abstract org.gradle.api.provider.Property<String> getRemapNamespace()
      重映射的源命名空间(Forge 为 srg、NeoForge 为 mojang).
    • getCoreModNamespace

      @Input public abstract org.gradle.api.provider.Property<String> getCoreModNamespace()
      coremod 重映射使用的源命名空间(生产命名空间).
    • getDistAttribute

      @Input public abstract org.gradle.api.provider.Property<String> getDistAttribute()
      写进 dist 清单的 Minecraft-Dists 取值.
    • getRefreshDeps

      @Input public abstract org.gradle.api.provider.Property<Boolean> getRefreshDeps()
      是否显式要求刷新(对应 --refresh-dependencies);与配置期 refreshDeps 同源.
    • getLockKey

      @Input public abstract org.gradle.api.provider.Property<String> getLockKey()
      跨进程锁的 key:与配置期 withPatchedLock 取同一个 key,两侧的生产才不会互相穿插.

      是 @Input 而不是 @Internal:换了 MC/Forge 版本就是换了一份产物身份。

    • getLockRoot

      @Internal public abstract org.gradle.api.provider.Property<String> getLockRoot()
      跨进程锁所在目录.

      @Internal:它只决定「在哪里互斥」,不决定产物内容;把它算进指纹会让同一份产物 因为缓存目录搬家而重建。

    • getOutputJar

      @OutputFile public abstract org.gradle.api.file.RegularFileProperty getOutputJar()
      产物:最终 patched jar(与配置期同一条路径).
    • getClientExtraJar

      @OutputFile @Optional public abstract org.gradle.api.file.RegularFileProperty getClientExtraJar()
      产物:client-extra(与配置期同一条路径);不产出时为未设置.
    • generate

      public void generate() throws Exception
      Throws:
      Exception