autaut03 / kottle

Kotlin language provider for Forge 1.13.2+
GNU Lesser General Public License v3.0
30 stars 13 forks source link

Fix missing stdlib-jdk7 transitive dependency #26

Closed thecodewarrior closed 4 years ago

thecodewarrior commented 4 years ago

The current build (1.5.0) doesn't include kotlin-stdlib-jdk7, which is a transitive dependency of kotlin-stdlib-jdk8. This just fixes the gradle script so it includes transitive dependencies.

This issue only shows up in a select few cases, including using the AutoClosable.use {} method (which is only present in kotlin-stdlib-jdk7) and using the default kotlin.random.Random instance (which is present on JDK8PlatformImplementations, which extends the missing JDK7PlatformImplementations class)

Here's a snippet of the error I encountered when trying to access the Collection<T>.random(): T method:

[00:43:55] [Render thread/ERROR] [ne.mi.ev.EventSubclassTransformer/EVENTBUS]: Could not find parent kotlin/internal/jdk7/JDK7PlatformImplementations for class kotlin/internal/jdk8/JDK8PlatformImplementations in classloader cpw.mods.modlauncher.TransformingClassLoader@149b0577 on thread Thread[Render thread,5,main]
[00:43:55] [Render thread/ERROR] [ne.mi.ev.EventSubclassTransformer/EVENTBUS]: An error occurred building event handler
java.lang.ClassNotFoundException: kotlin.internal.jdk7.JDK7PlatformImplementations
    at java.lang.ClassLoader.findClass(ClassLoader.java:530) ~[?:1.8.0_181] {}
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_181] {}
    at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:101) ~[modlauncher-5.0.0-milestone.4.jar:?] {re:classloading}
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_181] {}
    at net.minecraftforge.eventbus.EventSubclassTransformer.buildEvents(EventSubclassTransformer.java:62) ~[eventbus-2.0.0-milestone.1-service.jar:?] {}
    at net.minecraftforge.eventbus.EventSubclassTransformer.transform(EventSubclassTransformer.java:44) ~[eventbus-2.0.0-milestone.1-service.jar:?] {}
    at net.minecraftforge.eventbus.EventBusEngine.processClass(EventBusEngine.java:20) ~[eventbus-2.0.0-milestone.1-service.jar:?] {}
    at net.minecraftforge.eventbus.service.ModLauncherService.processClass(ModLauncherService.java:20) ~[eventbus-2.0.0-milestone.1-service.jar:2.0.0-milestone.1+57+de55078] {}
    at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:85) ~[modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:115) ~[modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.TransformingClassLoader$DelegatedClassLoader.findClass(TransformingClassLoader.java:239) ~[modlauncher-5.0.0-milestone.4.jar:?] {}
    at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:126) ~[modlauncher-5.0.0-milestone.4.jar:?] {re:classloading}
    at cpw.mods.modlauncher.TransformingClassLoader.loadClass(TransformingClassLoader.java:96) ~[modlauncher-5.0.0-milestone.4.jar:?] {re:classloading}
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_181] {}
    at java.lang.Class.forName0(Native Method) ~[?:1.8.0_181] {}
    at java.lang.Class.forName(Class.java:264) ~[?:1.8.0_181] {}
    at kotlin.internal.PlatformImplementationsKt.<clinit>(PlatformImplementations.kt:41) ~[?:?] {re:classloading}
    at kotlin.random.Random.<clinit>(Random.kt:242) ~[?:?] {re:classloading}
autaut03 commented 4 years ago

Hey. I just tried running listOf(1, 2, 3).random() as you suggested on master branch and did not encounter any exceptions. What am I missing?

thecodewarrior commented 4 years ago

If you tried in the kottle repo then you'll probably have kotlin on the classpath, or maybe the project you're using accidentally includes kotlin on the classpath in addition to Kottle. The issue is only with shading the dependencies into the Kottle jar, which you won't be able to see if you test within Kottle itself.

ejektaflex commented 4 years ago

Yeah, in a production environment this is definitely an issue. I thought it was ASM doing something funky to Kotlin's Random class, but I'm now realizing that it's actually this issue instead. I resorted to using Java's Random for my released mod, but an update to Kottle allowing for use of Kotlin's Random class would be great.

autaut03 commented 4 years ago

Thank you! I'll publish it asap.