Package net.fabricmc.loom.pipeline
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。
| 旧路径 | 本任务 | |
|---|---|---|
| 是否需要合并 | 配置期 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 -
Method Summary
Modifier and TypeMethodDescriptionabstract org.gradle.api.file.RegularFileProperty待合并的 client jar.abstract org.gradle.api.file.RegularFileProperty合并产物.abstract org.gradle.api.file.RegularFileProperty待合并的 server jar:bootstrap 版本下是抽取产物,否则是下载下来的 server jar.voidmerge()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, usesServiceMethods 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, setImpliesSubProjectsMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods 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
- Throws:
IOException
-