Class ExtractMinecraftServerJarTask

java.lang.Object
org.gradle.api.internal.AbstractTask
org.gradle.api.DefaultTask
net.fabricmc.loom.pipeline.ExtractMinecraftServerJarTask
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 ExtractMinecraftServerJarTask extends org.gradle.api.DefaultTask
L3 流水线:把 bootstrap server jar 里内嵌的 server jar 抽出来.

它取代的是 MinecraftProvider.extractBundledServerJar() 那段配置期同步执行的抽取 (由 provide() 在锁内调用)。1.18(21w39a)之后的 server 下载是 bootstrap jar, 真正的 server jar 在 META-INF/versions/<版本>/ 下,抽取产物才是后续合并/拆分/重映射的输入。

旧路径 vs 本任务
旧路径本任务
是否需要抽取配置期读 LoomHash 标记 + Files.exists Gradle up-to-date 检查(输出内容与输入指纹)
并发保护跨进程文件锁 + 锁内二次确认任务图 + 构建缓存
执行时机配置期 afterEvaluate执行期

抽取规则不在这里

真正的抽取(原子发布 + LoomHash 标记)由 BundleMetadata.unpackEntry(java.nio.file.Path, java.nio.file.Path, java.lang.String, java.lang.String, boolean) 唯一持有: 配置期路径与执行期路径共用同一份实现。若本任务另写一套,两套产出的 jar 只要差一点, 「任务产物」与「配置期产物」就会在同一个共享目录里互相判为不可复用(LoomHash 标记不匹配 会触发配置期路径重新抽取),而两者本应是同一个文件。

为什么输入里没有 Project

配置期那一版要从 Project 取 extension.refreshDeps(),而「是否要求刷新」本身就是配置期事实, 与「命令行是否要求刷新」同源,因此改为显式的 getRefreshDeps() 输入:任务在执行期不触碰项目模型, 配置缓存友好。

产物只有一个文件,刻意不声明目录

输出位于跨项目共享的 <userCache>/<mcVersion>/:同一目录里还有 client/server/merged jar 等 别的 provider、别的阶段(甚至别的 loom 版本)的产物,声明目录会把它们纳入本任务的快照与清理范围。
  • 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
    void
     
    abstract org.gradle.api.provider.Property<String>
    内嵌 server jar 在 bootstrap jar 中的路径(来自 bundle 元数据的 META-INF/versions.list).
    abstract org.gradle.api.provider.Property<String>
    内嵌 server jar 声明的 sha1.
    abstract org.gradle.api.file.RegularFileProperty
    抽取出的 server jar.
    abstract org.gradle.api.provider.Property<Boolean>
    是否忽略既有产物、强制重新抽取(对应配置期的 extension.refreshDeps()).
    abstract org.gradle.api.file.RegularFileProperty
    bootstrap server jar(1.18 起 server 下载的形态).

    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

    • ExtractMinecraftServerJarTask

      public ExtractMinecraftServerJarTask()
  • Method Details

    • getServerJar

      @InputFile @PathSensitive(NONE) public abstract org.gradle.api.file.RegularFileProperty getServerJar()
      bootstrap server jar(1.18 起 server 下载的形态).
    • getEntryPath

      @Input public abstract org.gradle.api.provider.Property<String> getEntryPath()
      内嵌 server jar 在 bootstrap jar 中的路径(来自 bundle 元数据的 META-INF/versions.list).
    • getEntrySha1

      @Input public abstract org.gradle.api.provider.Property<String> getEntrySha1()
      内嵌 server jar 声明的 sha1.

      它是「这个产物是不是那一份」的身份:既是 up-to-date 判定的输入,也是写入产物 LoomHash 标记的值——配置期路径据此判定抽取产物可复用。

    • getRefreshDeps

      @Input public abstract org.gradle.api.provider.Property<Boolean> getRefreshDeps()
      是否忽略既有产物、强制重新抽取(对应配置期的 extension.refreshDeps()).
    • getOutputJar

      @OutputFile public abstract org.gradle.api.file.RegularFileProperty getOutputJar()
      抽取出的 server jar.
    • extract

      public void extract() throws IOException
      Throws:
      IOException