kscripting / kscript

Scripting enhancements for Kotlin
MIT License
2.07k stars 124 forks source link

--package is broken in 4.2.3 - doesn't include stuff in local dependencies #415

Open vsajip opened 7 months ago

vsajip commented 7 months ago

I have a simple setup where packaging a script with a local dependency fails, because the local dependency is not included in the package. Here is the project:

$ tree .
.
├── libs
│   └── congocc.jar
└── pkgtest.kts

The script just imports a class in congocc.jar and prints it:

import org.congocc.core.Grammar

println(Grammar::class.java)

which runs fine when invoked like this:

$ KSCRIPT_DIRECTORY_ARTIFACTS=$PWD/libs kscript pkgtest.kts
class org.congocc.core.Grammar

However, packaging it fails:

$ KSCRIPT_DIRECTORY_ARTIFACTS=$PWD/libs kscript -cp pkgtest.kts
Cleaning up cache...
[kscript] Packaging script 'pkgtest' into standalone executable...
[kscript] Packaged script 'pkgtest' available at path:
[ksript] /home/vinay/.cache/kscript/package_9c6421c9540b73cf0ccfbcfd1405be52/build/libs/pkgtest
$ /home/vinay/.cache/kscript/package_9c6421c9540b73cf0ccfbcfd1405be52/build/libs/pkgtest
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at Main_Pkgtest$Companion.main(Main_Pkgtest.kt:6)
    at Main_Pkgtest.main(Main_Pkgtest.kt)
Caused by: java.lang.NoClassDefFoundError: org/congocc/core/Grammar
    at kscript.scriplet.Pkgtest.<init>(Pkgtest.kts)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: org.congocc.core.Grammar
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
    ... 7 more

This is because the build.gradle.kts is missing the dependency. Here is the relevant portion of build.gradle.kts:

dependencies {
    implementation(files("/home/vinay/.cache/kscript/jar_9c6421c9540b73cf0ccfbcfd1405be52/scriplet.jar"))
    implementation("org.jetbrains.kotlin:kotlin-stdlib")
    implementation("org.jetbrains.kotlin:kotlin-script-runtime:1.7.21")
}

There's no mention of congocc.jar, even though it is contained in the relevant dependencies file:

$ cat ~/.cache/kscript/dependencies_9c6421c9540b73cf0ccfbcfd1405be52/dependencies.content 
/home/vinay/projects/scratch/kscript/libs/congocc.jar

Adding implementation(files("/home/vinay/projects/scratch/kscript/libs/congocc.jar")) manually to the build script and rerunning gradle makeScript solves the problem, so it's just in the construction of build.gradle.kts where the problem seems to be.