Class MergeMinecraftJarsTask

java.lang.Object
org.gradle.api.internal.AbstractTask
org.gradle.api.DefaultTask
net.fabricmc.loom.pipeline.MergeMinecraftJarsTask
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 MergeMinecraftJarsTask extends org.gradle.api.DefaultTask
L3 流水线:把 client 与 server jar 合并成 merged jar.

它取代的是 MergedMinecraftProvider.provide() 里那段配置期同步执行的合并 (无锁快路径 → 跨进程锁 → 锁内二次确认 → 合并 → 原子落位)。合并本身仍走 MergedMinecraftProvider.mergeJars(java.io.File, java.io.File, java.io.File): 同一份实现被两条路径共用,避免两套合并逻辑产出不等价的 jar。

旧路径 vs 本任务
旧路径本任务
是否需要合并配置期 JarReusability.isReusable 判定 Gradle up-to-date 检查(输出内容与输入指纹)
并发保护跨进程文件锁 + 锁内二次确认任务图 + 构建缓存
残骸恢复手工判「0 字节/截断」构建缓存重新恢复
执行时机配置期 afterEvaluate执行期

两个输入各自来自哪一步

getServerJar() 由接线侧按 bundle 元数据选好:该版本使用 bootstrap jar 时是抽取产物, 否则就是下载下来的 server jar(判据与配置期 MergedMinecraftProvider.mergeJars 逐字一致)。 选在这里而不是任务里,是因为任务只有一对路径、无从分辨「这个 server jar 是 bootstrap 还是真身」; 而对应关系在配置期已经确定(元数据来自 L2 规格缓存,不打开 jar)。

落位必须原子

产物位于跨进程、跨 daemon 共享的 <userCache>/<mcVersion>/,配置期即已原子落位 (AtomicFiles.publish)。本任务沿用同一条契约:否则读方会读到半写的 merged jar, 而内容判定只能发现截断、发现不了「完整但没写完」。

为什么 action 自己还要判一次复用

同时服务「共享产物」与「Gradle 的增量机制」这两套语义,缺一不可:
  • 对**本项目**的连续构建,@OutputFile 的 up-to-date 检查足够;
  • 但对**别的项目**,这个 merged jar 落在共享的 <userCache>/<mcVersion>/ 下, 它从未被本项目生产过,因此是 unknown output:既不会 up-to-date,也进不了构建缓存。 于是每个新项目首次构建都要把两件 jar 重新合并一遍,哪怕产物完好地躺在盘上。
前置判据因此由 ArtifactReuse 提供(产物完好 + 合并规则未换代 + 两个输入的内容指纹未变), 命中则直接返回、不写任何文件。判据只读,不破坏原子发布的语义。
  • Nested Class Summary

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

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

    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
    abstract org.gradle.api.file.RegularFileProperty
    待合并的 client jar.
    abstract org.gradle.api.file.RegularFileProperty
    合并产物.
    abstract org.gradle.api.file.RegularFileProperty
    待合并的 server jar:bootstrap 版本下是抽取产物,否则是下载下来的 server jar.
    void
     

    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
  • Constructor Details

    • MergeMinecraftJarsTask

      public MergeMinecraftJarsTask()
  • Method Details

    • getClientJar

      @InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getClientJar()
      待合并的 client jar.
    • getServerJar

      @InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getServerJar()
      待合并的 server jar:bootstrap 版本下是抽取产物,否则是下载下来的 server jar.
    • getMergedJar

      @OutputFile public abstract org.gradle.api.file.RegularFileProperty getMergedJar()
      合并产物.
    • merge

      public void merge() throws IOException
      Throws:
      IOException