So you may have heard that as of Java 8 update 20, a bug came to light in Forge which causes a crash at startup. This appears to affect both Minecraft 1.6 and 1.7. Fortunately, later versions of Forge for 1.7.10 correct the issue. But 1.6.4 and 1.7.2 are still affected, as are many versions for 1.7.10 still in use. You could easily just use Java 7, or Java 8 update 11, and not be affected by this bug. But for future-proofing sake, in case someone wants to run Java 8 but a security issue is discovered at some point in the future which makes update 11 not very safe, I decided to just fix Forge.
Only one file is the problem, so that's all you need:
I'm going to assume you already have Forge installed into the vanilla launcher for these instructions.
From here you need to find your way into your libraries directory for Forge. On Windows, the direct route would be:
For 1.6.4: %appdata%\.minecraft\libraries\net\minecraftforge\minecraftforge\126.96.36.1995
For 1.7.2: %appdata%\.minecraft\libraries\net\minecraftforge\forge\1.7.2-10.12.2.1147 (or switch 1147 for the version you're using)
For 1.7.10: %appdata%\.minecraft\libraries\net\minecraftforge\forge\1.7.10-10.13.0.1208
If you use Linux then you know your way around your home directory. And if you use OSX, then I'm sure someone else can help you find it, but I imagine that your base Minecraft directory is in your home directory somewhere as well like Linux.
You can make a backup of the JAR if you want at this point. But now open up the JAR in WinRAR or what ever program you use for such things. First, go ahead and delete the META-INF directory in the root of the JAR, or you'll get a crash related to security, just like in the old JAR-modding days. Now navigate your way through cpw/mods/fml/relauncher. You should see a CoreModManager.class in here. Just drop this patched version on top, and you should be good to go!
-- FTB --
This is relatively identical to the above instructions. The only difference is that you have to find the libraries directory inside your FTB directory instead. Then do the same process as above, and this should fix every related pack on the launcher.
-- Technic --
This is a bit different. You need to patch individual modpacks. And every time a pack is updated, you'll probably have to patch it again. But it's not a big deal. For this, first go into your packs directory. For Windows this is: %appdata%\.technic\modpacks
Now go into whichever pack you want to fix. For this example we'll use the main Tekkit. So navigate into tekkitmain, then into bin. You should see a modpack.jar here. This is basically your Forge JAR. Follow the process of above for patching the JAR, of deleting META-INF and adding the class file into the appropriate place, and your pack should now run again.
-- ATLauncher --
Again, this is slightly different, requiring you to fix per-instance like Technic. Go to your ATLauncher directory, then into instances. Find the instance you want to repair, then go into jarmods. You should see the Forge JAR here. So do the above mentioned process to patch the JAR, and the pack should be fixed. Like Technic, updates might break it.
-- MultiMC --
I have no easy fix for this at this time, because it automatically redownloads the Forge JAR after it detects modification, which is both nice and annoying depending on the situation!
-- Servers --
In this case, Forge will already be in the server JAR. You won't want to erase all of META-INF or the server won't launch, just deleting FORGE.DSA is enough according to DAOWAce's post below. Then just copy the class file you downloaded into the appropriate place in the JAR.
-- Misc --
Now for the technical details of what this does, for those interested. Java 8 update 20 changed the way Collections.sort works, no longer cloning a List but modifying it in-place. Since FML is iterating this list at this particular moment, you get the crash. So what this patch does is replace Collections.sort with a wrapper function inside CoreModManager.
It does this:
public static <T> void sort(List<T> list, Comparator<? super T> c)
T toSort = list.toArray((T)new Object[list.size()]);
for (int j = 0; j < toSort.length; j++) list.set(j, toSort[j]);
This is basically a modified version of the same code used to fix later versions of FML, just implemented differently for the sake of a patch.
What I did was compile this bit of code in an otherwise empty class, then used Java Bytecode Editor to extract the bytecode from that class and create the identical method in CoreModManager. Lastly I modified the sortTweakList method to invoke cpw/mods/fml/relauncher/CoreModManager/sort instead of java/util/Collections/sort. You can use JBE to confirm youself that that's the only difference between this patched file and the original if you're concerned at all.
There's a chance that the 1.6.4 patch will work on other versions of Forge for 1.6.x, you would just have to try it and see. The two 1.7.2 builds are the 'latest' and 'recommended' ones, and both had an identical version of CoreModManager, though it might work on earlier builds for that version as well if necessary.
Replacing the class results in the security issue.
Deleting the META-INF folder results in it complaining the jar file is corrupt.
Using the same .jar file as the client has the same result.
Edit: Seems deleting just the FORGE.DSA file will get it working. Removing MANIFEST.MF 'corrupts' it. Have not tried removing the other file.
That's good info to share, I never even considered servers. The reason it needs MANIFEST.MF is probably because that specifies the entry point, which would be necessary since you're executing the JAR in that case. Glad you got it going.
Does this affect anything if you use 1.7 forge versions sometimes?
Doing the patch on 1.6.4 Forge JARs won't hurt anything related to any 1.7 instances you have, if that's what you mean. And if your 1.7 instances currently run fine, then you're probably not using Java 8, or the newest version of Java 8, so you wouldn't want to upgrade your Java any time soon until modpacks get a chance to update to the upcoming version of Forge for 1.7.10 which fixes this bug.
I don't have the latest "Cauldron" as I hadn't been updating as I should. MANIFEST.MS says "Implementation-Version: git-MCPC-Plus-jenkins-Cauldron-164-272". I did not delete any files in the META-INF as the one to delete wasn't there just replaced the one class file. I didn't expect it to work when I tried it TBA.
I can't give a link to the version that worked or test it on other Cauldron versions as the downloads have been pulled do to DMCA.
I'm having trouble with getting ATLauncher's Yogscast Complete to work with the patch, I get it to Launch, but then it doesn't get past the Mojang logo cause it says "Not Responding" and doesn't change. It works fine however on the Technic mods I use no problem. but Yogscast Complete wont get past the Mojang logo after launching.
edit: never mind, it loaded, just took longer then normal (3 mintues)
Is it possible you could just apply the patch and put a new build for everyone to download? I'm sure lots of new people that have recently gotten the 1.6.4 forge when they have a new computer with the new java and it would be more convenient for everyone