Extract nested jars from modCompile
This commit is contained in:
		
							parent
							
								
									02e9616622
								
							
						
					
					
						commit
						6f35014805
					
				
					 2 changed files with 64 additions and 4 deletions
				
			
		|  | @ -108,6 +108,14 @@ public class LoomGradleExtension { | |||
| 		return remappedModCache; | ||||
| 	} | ||||
| 
 | ||||
| 	public File getNestedModCache() { | ||||
| 		File nestedModCache = new File(getProjectCache(), "nested_mods/"); | ||||
| 		if (!nestedModCache.exists()) { | ||||
| 			nestedModCache.mkdir(); | ||||
| 		} | ||||
| 		return nestedModCache; | ||||
| 	} | ||||
| 
 | ||||
| 	@Nullable | ||||
| 	private Dependency findDependency(Collection<String> configs, BiPredicate<String, String> groupNameFilter) { | ||||
| 		for (String s : configs) { | ||||
|  |  | |||
|  | @ -25,27 +25,28 @@ | |||
| package net.fabricmc.loom.util; | ||||
| 
 | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonArray; | ||||
| import com.google.gson.JsonObject; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.providers.MappingsProvider; | ||||
| import net.fabricmc.loom.providers.MinecraftMappedProvider; | ||||
| import net.fabricmc.loom.providers.MinecraftProvider; | ||||
| import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||
| import net.fabricmc.tinyremapper.TinyRemapper; | ||||
| import net.fabricmc.tinyremapper.TinyUtils; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| import org.gradle.api.artifacts.ExternalModuleDependency; | ||||
| import org.gradle.api.artifacts.repositories.MavenArtifactRepository; | ||||
| import org.gradle.internal.impldep.aQute.lib.strings.Strings; | ||||
| import org.zeroturnaround.zip.commons.FileUtils; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| import java.util.Collection; | ||||
| import java.util.jar.JarEntry; | ||||
| import java.util.jar.JarFile; | ||||
| import java.util.zip.ZipEntry; | ||||
| 
 | ||||
|  | @ -58,6 +59,57 @@ public class ModProcessor { | |||
| 		} | ||||
| 		remapJar(input, output, project); | ||||
| 		readInstallerJson(input, project); | ||||
| 		try { | ||||
| 			handleNestedJars(input, project); | ||||
| 		} catch (IOException e) { | ||||
| 			throw new RuntimeException("Failed to handle nested jar", e); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private static void handleNestedJars(File input, Project project) throws IOException { | ||||
| 		JarFile jarFile = new JarFile(input); | ||||
| 		JarEntry modJsonEntry = jarFile.getJarEntry("fabric.mod.json"); | ||||
| 		if(modJsonEntry == null){ | ||||
| 			return; | ||||
| 		} | ||||
| 		try(InputStream inputStream = jarFile.getInputStream(modJsonEntry)){ | ||||
| 			JsonObject json = GSON.fromJson(new InputStreamReader(inputStream), JsonObject.class); | ||||
| 			if(json == null || !json.has("jars")){ | ||||
| 				return; | ||||
| 			} | ||||
| 			JsonArray jsonArray = json.getAsJsonArray("jars"); | ||||
| 			for (int i = 0; i < jsonArray.size(); i++) { | ||||
| 				JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); | ||||
| 				String fileName = jsonObject.get("file").getAsString(); | ||||
| 				project.getLogger().lifecycle(String.format("Found %s nested in %s", fileName, input.getName())); | ||||
| 				processNestedJar(jarFile, fileName, project); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private static void processNestedJar(JarFile parentJar, String fileName, Project project){ | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 
 | ||||
| 		JarEntry entry = parentJar.getJarEntry(fileName); | ||||
| 		if(entry == null){ | ||||
| 			throw new RuntimeException(Strings.format("%s was not found in %s", fileName, parentJar.getName())); | ||||
| 		} | ||||
| 
 | ||||
| 		File nestedFile = new File(extension.getNestedModCache(), fileName.substring(fileName.lastIndexOf("/"))); | ||||
| 		try(InputStream jarStream = parentJar.getInputStream(entry)){ | ||||
| 			FileUtils.copy(jarStream, nestedFile); | ||||
| 		} catch (IOException e) { | ||||
| 			throw new RuntimeException(e); | ||||
| 		} | ||||
| 		File remappedFile = new File(extension.getRemappedModCache(), fileName.substring(fileName.lastIndexOf("/"))); | ||||
| 
 | ||||
| 		handleMod(nestedFile, remappedFile, project); | ||||
| 
 | ||||
| 		if(!remappedFile.exists()){ | ||||
| 			throw new RuntimeException("Failed to find processed nested jar"); | ||||
| 		} | ||||
| 		//Add the project right onto the remapped mods, hopefully this works | ||||
| 		project.getDependencies().add(Constants.COMPILE_MODS_MAPPED, project.files(remappedFile)); | ||||
| 	} | ||||
| 
 | ||||
| 	private static void remapJar(File input, File output, Project project){ | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue