Handle invalid JAR files more gracefully. Don't crash.
Signed-off-by: cpw <cpw+github@weeksfamily.ca>
This commit is contained in:
parent
f1feac76b3
commit
4441935a4a
|
@ -47,6 +47,7 @@ public class LoadingModList
|
|||
private final Map<String, ModFileInfo> fileById;
|
||||
private BackgroundScanHandler scanner;
|
||||
private final List<EarlyLoadingException> preLoadErrors;
|
||||
private List<ModFile> brokenFiles;
|
||||
|
||||
private LoadingModList(final List<ModFile> modFiles, final List<ModInfo> sortedList)
|
||||
{
|
||||
|
@ -131,4 +132,8 @@ public class LoadingModList
|
|||
public List<EarlyLoadingException> getErrors() {
|
||||
return preLoadErrors;
|
||||
}
|
||||
|
||||
public void setBrokenFiles(final List<ModFile> brokenFiles) {
|
||||
this.brokenFiles = brokenFiles;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ import java.util.zip.ZipError;
|
|||
|
||||
import static net.minecraftforge.fml.loading.LogMarkers.SCAN;
|
||||
|
||||
public class AbstractJarFileLocator {
|
||||
public abstract class AbstractJarFileLocator implements IModLocator {
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
protected final Map<ModFile, FileSystem> modJars;
|
||||
|
||||
|
@ -51,7 +51,7 @@ public class AbstractJarFileLocator {
|
|||
try {
|
||||
return FileSystems.newFileSystem(modFile.getFilePath(), modFile.getClass().getClassLoader());
|
||||
} catch (ZipError | IOException e) {
|
||||
LOGGER.debug(SCAN,"Ignoring invalid JAR file {}", modFile.getFilePath());
|
||||
LOGGER.debug(SCAN,"Invalid JAR file {} - no filesystem created", modFile.getFilePath());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -87,4 +87,9 @@ public class AbstractJarFileLocator {
|
|||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid(final ModFile modFile) {
|
||||
return modJars.get(modFile) != null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -117,4 +117,9 @@ public class ExplodedDirectoryLocator implements IModLocator {
|
|||
rootDirs.addAll(explodedTargets);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid(final ModFile modFile) {
|
||||
return mods.get(modFile) != null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,4 +42,6 @@ public interface IModLocator {
|
|||
Optional<Manifest> findManifest(Path file);
|
||||
|
||||
void initArguments(Map<String, ?> arguments);
|
||||
|
||||
boolean isValid(ModFile modFile);
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class MavenDirectoryLocator extends AbstractJarFileLocator implements IModLocator {
|
||||
public class MavenDirectoryLocator extends AbstractJarFileLocator {
|
||||
private List<Path> modCoords;
|
||||
|
||||
@Override
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.apache.logging.log4j.LogManager;
|
|||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
|
@ -67,12 +68,14 @@ public class ModDiscoverer {
|
|||
FMLLoader.getLanguageLoadingProvider().addAdditionalLanguages(modFiles.get(ModFile.Type.LANGPROVIDER));
|
||||
BackgroundScanHandler backgroundScanHandler = new BackgroundScanHandler();
|
||||
final List<ModFile> mods = modFiles.getOrDefault(ModFile.Type.MOD, Collections.emptyList());
|
||||
final List<ModFile> brokenFiles = new ArrayList<>();
|
||||
for (Iterator<ModFile> iterator = mods.iterator(); iterator.hasNext(); )
|
||||
{
|
||||
ModFile mod = iterator.next();
|
||||
if (!mod.identifyMods()) {
|
||||
LOGGER.debug(SCAN, "Removing file {} from further analysis - it is invalid", mod);
|
||||
if (!mod.getLocator().isValid(mod) || !mod.identifyMods()) {
|
||||
LOGGER.warn(SCAN, "File {} has been ignored - it is invalid", mod.getFilePath());
|
||||
iterator.remove();
|
||||
brokenFiles.add(mod);
|
||||
}
|
||||
}
|
||||
LOGGER.debug(SCAN,"Found {} mod files with {} mods", mods::size, ()->mods.stream().mapToInt(mf -> mf.getModInfos().size()).sum());
|
||||
|
@ -80,6 +83,7 @@ public class ModDiscoverer {
|
|||
loadingModList.addCoreMods();
|
||||
loadingModList.addAccessTransformers();
|
||||
loadingModList.addForScanning(backgroundScanHandler);
|
||||
loadingModList.setBrokenFiles(brokenFiles);
|
||||
return backgroundScanHandler;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ import static net.minecraftforge.fml.loading.LogMarkers.SCAN;
|
|||
/**
|
||||
* Support loading mods located in JAR files in the mods folder
|
||||
*/
|
||||
public class ModsFolderLocator extends AbstractJarFileLocator implements IModLocator {
|
||||
public class ModsFolderLocator extends AbstractJarFileLocator {
|
||||
private static final String SUFFIX = ".jar";
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
private final Path modFolder;
|
||||
|
|
Loading…
Reference in New Issue