diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java index 86371eed1..4b1a85b24 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java @@ -23,6 +23,7 @@ import cpw.mods.modlauncher.api.IEnvironment; import cpw.mods.modlauncher.api.ITransformingClassLoader; import cpw.mods.modlauncher.api.ITransformingClassLoaderBuilder; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.loading.moddiscovery.ModFile; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,6 +42,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static net.minecraftforge.fml.loading.LogMarkers.CORE; +import static net.minecraftforge.fml.loading.LogMarkers.LOADING; public abstract class FMLCommonLaunchHandler { @@ -54,6 +56,8 @@ public abstract class FMLCommonLaunchHandler "net.minecraftforge.eventbus.", "net.minecraftforge.api.", "com.mojang.util.QueueLogAppender" ); + private final List additionalLibraries = new ArrayList<>(); + protected Predicate getPackagePredicate() { return cn -> SKIPPACKAGES.stream().noneMatch(cn::startsWith); } @@ -69,6 +73,7 @@ public abstract class FMLCommonLaunchHandler public void configureTransformationClassLoader(final ITransformingClassLoaderBuilder builder) { builder.addTransformationPath(FMLLoader.getForgePath()); Arrays.stream(FMLLoader.getMCPaths()).forEach(builder::addTransformationPath); + additionalLibraries.forEach(builder::addTransformationPath); FMLLoader.getLanguageLoadingProvider().getLibraries().forEach(builder::addTransformationPath); builder.setClassBytesLocator(getClassLoaderLocatorFunction()); builder.setManifestLocator(getClassLoaderManifestLocatorFunction()); @@ -137,4 +142,12 @@ public abstract class FMLCommonLaunchHandler } protected abstract String getNaming(); + + void addLibraries(final List libraries) { + libraries + .stream() + .map(ModFile::getFilePath) + .peek(p->LOGGER.debug(LOADING, "Adding {} as a library to the transforming classloader", p)) + .forEach(additionalLibraries::add); + } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java index ec8d9fa98..937e57d12 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java @@ -81,6 +81,7 @@ public class FMLLoader private static String forgeGroup; private static Predicate classLoaderExclusions; private static String launchHandlerName; + private static FMLCommonLaunchHandler commonLaunchHandler; static void onInitialLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException { @@ -175,7 +176,7 @@ public class FMLLoader launchHandlerName = launchHandler.get().name(); gamePath = environment.getProperty(IEnvironment.Keys.GAMEDIR.get()).orElse(Paths.get(".").toAbsolutePath()); - FMLCommonLaunchHandler commonLaunchHandler = (FMLCommonLaunchHandler)launchHandler.get(); + commonLaunchHandler = (FMLCommonLaunchHandler)launchHandler.get(); naming = commonLaunchHandler.getNaming(); dist = commonLaunchHandler.getDist(); EarlyProgressVisualization.INSTANCE.accept(dist); @@ -206,6 +207,7 @@ public class FMLLoader modDiscoverer = new ModDiscoverer(arguments); final BackgroundScanHandler backgroundScanHandler = modDiscoverer.discoverMods(); loadingModList = backgroundScanHandler.getLoadingModList(); + commonLaunchHandler.addLibraries(backgroundScanHandler.getModFiles().getOrDefault(IModFile.Type.LIBRARY, Collections.emptyList())); return backgroundScanHandler.getModFiles(); } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java index 247cda8bf..ccf131359 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileInfo.java @@ -24,6 +24,8 @@ import net.minecraftforge.forgespi.language.MavenVersionAdapter; import net.minecraftforge.forgespi.language.IModFileInfo; import net.minecraftforge.forgespi.language.IModInfo; import net.minecraftforge.fml.loading.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.maven.artifact.versioning.VersionRange; import java.net.URL; @@ -31,8 +33,11 @@ import java.util.*; import java.util.jar.Manifest; import java.util.stream.Collectors; +import static net.minecraftforge.fml.loading.LogMarkers.LOADING; + public class ModFileInfo implements IModFileInfo { + private static final Logger LOGGER = LogManager.getLogger(); private final UnmodifiableConfig config; private final ModFile modFile; private final URL issueURL; @@ -64,6 +69,10 @@ public class ModFileInfo implements IModFileInfo } this.mods = modConfigs.stream().map(mi-> new ModInfo(this, mi)).collect(Collectors.toList()); this.issueURL = config.getOptional("issueTrackerURL").map(StringUtils::toURL).orElse(null); + LOGGER.debug(LOADING, "Found valid mod file {} with {} mods - versions {}", + this.modFile::getFileName, + () -> mods.stream().map(IModInfo::getModId).collect(Collectors.joining(",", "{", "}")), + () -> mods.stream().map(IModInfo::getVersion).map(Objects::toString).collect(Collectors.joining(",", "{", "}"))); } @Override diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java index 018448c1c..6f59590f2 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModFileParser.java @@ -42,7 +42,7 @@ public class ModFileParser { private static final Logger LOGGER = LogManager.getLogger(); public static IModFileInfo readModList(final ModFile modFile) { - LOGGER.debug(LOADING,"Parsing mod file candidate {}", modFile.getFilePath()); + LOGGER.debug(LOADING,"Considering mod file candidate {}", modFile.getFilePath()); final Path modsjson = modFile.getLocator().findPath(modFile, "META-INF", "mods.toml"); if (!Files.exists(modsjson)) { LOGGER.warn(LOADING, "Mod file {} is missing mods.toml file", modFile);