Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kscript execution - java.lang.ClassNotFoundException #109

Closed
dector opened this issue Mar 6, 2018 · 3 comments
Closed

kscript execution - java.lang.ClassNotFoundException #109

dector opened this issue Mar 6, 2018 · 3 comments

Comments

@dector
Copy link

dector commented Mar 6, 2018

Source file (sketch1.kts):

#!/usr/bin/env kscript

@file:DependsOn("org.processing:core:3.3.6")

import processing.core.PApplet

class Sketch : PApplet() {

    override fun settings() {
        size(800, 600)
    }

    override fun setup() {
        background(0)
    }
}

PApplet.main(Sketch::class.java)

Execution command: kscript sketch1.kts.

Expected result: black window.

Actual result:

java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at Main_Sketch1$Companion.main(Main_Sketch1.kt:6)
	at Main_Sketch1.main(Main_Sketch1.kt)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:61)
	at org.jetbrains.kotlin.runner.Main.run(Main.kt:109)
	at org.jetbrains.kotlin.runner.Main.main(Main.kt:119)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Sketch1$Sketch
	at processing.core.PApplet.runSketch(PApplet.java:10706)
	at processing.core.PApplet.main(PApplet.java:10513)
	at processing.core.PApplet.main(PApplet.java:10485)
	at Sketch1.<init>(Unknown Source)
	... 13 more
Caused by: java.lang.ClassNotFoundException: Sketch1$Sketch
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at processing.core.PApplet.runSketch(PApplet.java:10699)
	... 16 more

However, packaging works as expected.

kscript --package sketch1.kts
./sketch1
@holgerbrandl
Copy link
Collaborator

I think it's more a kotlin platform issue than a kscript bug, because

cat <<"EOF" > test_processing.kts
import processing.core.PApplet

class Sketch : PApplet() {

    override fun settings() {
        size(800, 600)
    }

    override fun setup() {
        background(0)
    }
}

val className= Sketch::class.qualifiedName
println("class name is $className")

PApplet.main(Sketch::class.java)
EOF

kotlinc -help
kotlinc -cp ~/.m2/repository/org/processing/core/3.3.6/core-3.3.6.jar -script  test_processing.kts -Djava.awt.headless=false

fails with the same error.

I think it is also unrelated to processing, because the following fails as well

cat <<"EOF" > test_classloader.kts
class Sketch {
 fun foo() = println("bar")
}

val className= Sketch::class.qualifiedName
println("class name is $className")

//    val classLoader = String::class.java.getClassLoader()
val classLoader = javaClass.classLoader
println("classLoader is $classLoader")

val sketchClass = classLoader.loadClass(Sketch::class.qualifiedName)
println("sketchClass is $sketchClass")
EOF

kotlinc  -script test_classloader.kts

which fails with

class name is Test_classloader.Sketch
classLoader is org.jetbrains.kotlin.codegen.GeneratedClassLoader@7c8fe8cd
java.lang.ClassNotFoundException: Test_classloader.Sketch
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at org.jetbrains.kotlin.codegen.GeneratedClassLoader.findClass(GeneratedClassLoader.java:64)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at Test_classloader.<init>(test_classloader.kts:12)

Interestingly it seems fine when running as kt file

cat <<"EOF" > test.kt
//ENTRY Foo

class Sketch  {
 fun foo() = println("bar")
}

object Foo{

    @JvmStatic
    fun main(args: Array<String>) {
        val className= Sketch::class.qualifiedName
        println("class name is $className")

        val classLoader =javaClass.classLoader
        println("classLoader is $classLoader")

        val sketchClass = classLoader.loadClass(Sketch::class.qualifiedName)
        println("sketchClass is $sketchClass")
    }
}

EOF

kotlinc test.kt
kotlin Foo

So, I'd suggest that you submit these last two snippets (without any processing dependency) as kotlln platform bug. Feel welcome to point me to the corresponding ticket.

@holgerbrandl
Copy link
Collaborator

Irrespective of the classloader issue when using script mode from above, the problem also remains when using kt files as input


cat <<"EOF" > proc_revisited.kt
import processing.core.PApplet

class Sketch2 : PApplet() {

    override fun settings() {
        size(800, 600)
    }

    override fun setup() {
        background(0)
    }
}

object Foo2{

    @JvmStatic
    fun main(args: Array<String>) {
        PApplet.main(Sketch2::class.java)

    }
}
EOF

kotlinc -cp ~/.m2/repository/org/processing/core/3.3.6/core-3.3.6.jar proc_revisited.kt
kotlin -cp ${PWD}:~/.m2/repository/org/processing/core/3.3.6/core-3.3.6.jar Foo2

This might be another/related platform issue or differences in how kotlin and java setup their classloader environments.

I'm closing the ticket for now, since it is not really a kscript bug. Feel welcome to keep posting to this thread though.

@dector
Copy link
Author

dector commented Mar 6, 2018

Thanks! I'll dive into your exploration and rise issue to kotlin platform.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants