kotlin-eclipse-2022 icon indicating copy to clipboard operation
kotlin-eclipse-2022 copied to clipboard

[BUG] java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file mmbmods/kotlin/KotlinMod

Open Monniasza opened this issue 4 years ago • 5 comments

Steps to reproduce:

  1. Create a new Kotlin project
  2. Download MultiMachineBuilder (https://github.com/MultiMachineBuilder/MultiMachineBuilder) into an Eclipse workspace
  3. Add MultiMachineBuilder as dependency
  4. Write a simple test mod (https://github.com/MultiMachineBuilder/MultiMachineBuilder/wiki/Writing-a-mod)
  5. Export the mod as library JAR and put it into 'mods' directory
  6. Run the game from Eclipse

Expected behavior: 'Kotlin Mod' throws NullPointerException during loading Your mod works Actual behavior: 'Kotlin Mod' throws: (MOD - kotlin.jar) Invalid class file: mmbmods/kotlin/KotlinMod.class (MOD - kotlin.jar) java.lang.ClassFormatError (MOD - kotlin.jar) Absent Code attribute in method that is not native or abstract in class file mmbmods/kotlin/KotlinMod (MOD - kotlin.jar) java.lang.ClassLoader.defineClass1(Native Method) (MOD - kotlin.jar) java.lang.ClassLoader.defineClass(Unknown Source) (MOD - kotlin.jar) java.lang.ClassLoader.defineClass(Unknown Source) (MOD - kotlin.jar) io.github.micwan88.helperclass4j.ByteClassLoader.findClass(ByteClassLoader.java:43) (MOD - kotlin.jar) java.lang.ClassLoader.loadClass(Unknown Source) (MOD - kotlin.jar) java.lang.ClassLoader.loadClass(Unknown Source) (MOD - kotlin.jar) io.github.micwan88.helperclass4j.ByteClassLoader.loadClass(ByteClassLoader.java:53) (MOD - kotlin.jar) mmb.MODS.loader.AddonLoader.interpretClassFile(AddonLoader.java:214) (MOD - kotlin.jar) mmb.MODS.loader.AddonLoader.processFile(AddonLoader.java:179) (MOD - kotlin.jar) mmb.MODS.loader.AddonLoader.lambda$2(AddonLoader.java:163) (MOD - kotlin.jar) java.util.Hashtable.forEach(Unknown Source) (MOD - kotlin.jar) mmb.MODS.loader.AddonLoader.whenWorking(AddonLoader.java:162) (MOD - kotlin.jar) mmb.MODS.loader.AddonLoader.init(AddonLoader.java:123) (MOD - kotlin.jar) mmb.MODS.loader.AddonLoader.lambda$0(AddonLoader.java:74) (MOD - kotlin.jar) java.lang.Thread.run(Unknown Source) Your mod might throw the same exception

Description: When a class file is loaded, the class loader throws java.lang.ClassFormatError:

Monniasza avatar Jan 25 '21 10:01 Monniasza

  1. Write a simple test mod

Give me please a mod, with which this error has aquired.

bvfalcon avatar Jan 26 '21 15:01 bvfalcon

  1. Download entire repository: https://github.com/MultiMachineBuilder/MultiMachineBuilder
  2. Paste https://github.com/MultiMachineBuilder/MultiMachineBuilder/releases/download/d0.4.0_/Machine.Builder.0.4-pre.jar into game directory
  3. Run the Machine Builder 0.4-pre.jar file
  4. 'kotlin.jar' mod will have its state as 'Crashed'

Monniasza avatar Jan 26 '21 17:01 Monniasza

I think, this problem has nothing common with eclipse-plugin. The reasons:

  1. Files .classpath and .project (eclipse-specific) not contains kotlin-nature
  2. Project not contains Files *.kt -- kotlin source files

Problem can be in Machine.Builder.0.4-pre source code, but this is not a eclipse-project. Runtime-ready jar not contains it

bvfalcon avatar Jan 28 '21 10:01 bvfalcon

Here is bytecode. Notice that it has missing definition for main() but not main(String[]):

// Compiled from KotlinMod.kt (version 1.6 : 50.0, super bit)
public final class mmbmods.kotlin.KotlinModKt {
  
  // Method descriptor #6 ()V
  public static final void main();
  
  // Method descriptor #7 ([Ljava/lang/String;)V
  // Stack: 0, Locals: 1
  public static synthetic void main(java.lang.String[] arg0);
    0  invokestatic mmbmods.kotlin.KotlinModKt.main() : void [9]
    3  return
}

The game uses ByteClassLoader, which can be found at: https://github.com/micwan88/helperclass4j

Monniasza avatar Jan 28 '21 13:01 Monniasza

Note that if you inspect bytecode, override methods do not have bodies.

Monniasza avatar Jan 31 '21 09:01 Monniasza