Skip to content

Commit 0e86c80

Browse files
committed
fix remote dependencies being inaccessible at runtime
1 parent 4155c76 commit 0e86c80

4 files changed

Lines changed: 16 additions & 6 deletions

File tree

src/main/kotlin/dev/echonine/kite/Kite.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class Kite : JavaPlugin(), Listener {
4848
}
4949
}
5050
// Bump this if cache is no longer compatible between releases.
51-
const val CACHE_VERSION = "3"
51+
const val CACHE_VERSION = "4"
5252
}
5353

5454
override fun onEnable() {

src/main/kotlin/dev/echonine/kite/scripting/ScriptManager.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import kotlinx.coroutines.suspendCancellableCoroutine
1616
import kotlinx.coroutines.withContext
1717
import net.kyori.adventure.text.logger.slf4j.ComponentLogger
1818
import org.jetbrains.annotations.Unmodifiable
19+
import java.net.URLClassLoader
1920
import java.util.concurrent.atomic.AtomicBoolean
2021
import kotlin.coroutines.resume
2122
import kotlin.script.experimental.api.ResultWithDiagnostics
@@ -123,10 +124,16 @@ internal class ScriptManager(val plugin: Kite) {
123124
}
124125
}
125126
}
127+
// Building a classloader that includes any JARs downloaded into the per-script libs directory.
128+
val dependencies = Kite.Structure.CACHE_DIR.resolve(script.name).resolve("libs").walkTopDown()
129+
.filter { it.isFile && it.extension == "jar" }
130+
.map { it.toURI().toURL() }
131+
.toList()
132+
val classLoader = if (dependencies.isEmpty() == false) URLClassLoader(dependencies.toTypedArray(), Kite::class.java.classLoader) else Kite::class.java.classLoader
126133
// Creating EvaluationConfiguration based on KiteEvaluationConfiguration template.
127134
val evaluationConfiguration = KiteEvaluationConfiguration.with {
128135
jvm {
129-
baseClassLoader(Kite::class.java.classLoader)
136+
baseClassLoader(classLoader)
130137
}
131138
implicitReceivers(script)
132139
providedProperties(mapOf(

src/main/kotlin/dev/echonine/kite/scripting/configuration/KiteCompilationConfiguration.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,12 @@ object KiteCompilationConfiguration : ScriptCompilationConfiguration({
9191
?: return@onAnnotations context.compilationConfiguration.asSuccess()
9292
val scriptBaseDir = (context.script as? FileBasedScriptSource)?.file?.parentFile
9393
val importedSources: MutableList<FileScriptSource> = mutableListOf()
94-
// We don't want to share the instance of KiteLibraryManager between compiler runs.
95-
// Reason: It can easily stock up on stale repositories and dependencies.
96-
val libraryManager = KiteLibraryManager()
94+
val libsDirectory = Kite.Structure.CACHE_DIR.resolve("${context.compilationConfiguration[displayName]}").resolve("libs")
95+
// Creating KiteLibraryManager instance. Downloads are placed in scripts' own 'plugins/Kite/cache/{SCRIPT}/libs/' directory because:
96+
// (1) this improves script isolation
97+
// (2) this does not require any extra tracking to know which dependencies should be added to runtime classpath
98+
// We also don't want to share the instance of KiteLibraryManager between compiler runs. It can easily stock up on stale repositories and dependencies.
99+
val libraryManager = KiteLibraryManager(libsDirectory)
97100
// Adding all declared repositories to the KiteLibraryManager instance.
98101
annotations.filterIsInstance<Repository>().map { it.repository }.forEach(libraryManager::addRepository)
99102
// Getting declared @Dependency and @Relocation annotations.

src/main/kotlin/dev/echonine/kite/scripting/libraries/KiteLibraryManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ private class SoftLogAdapter(logger: Logger) : JDKLogAdapter(logger) {
3434

3535
// This class is based on BukkitLibraryLoader and exists solely to track resolved dependencies.
3636
// Neither LibraryLoader#downloadLibrary nor LibraryLoader#loadLibrary do not return a comprehensive list of resolved dependencies.
37-
class KiteLibraryManager : LibraryManager(SoftLogAdapter(Kite.INSTANCE!!.logger), Kite.Structure.KITE_DIR.toPath(), Kite.Structure.LIBS_DIR.name) {
37+
class KiteLibraryManager(libsDirectory: File) : LibraryManager(SoftLogAdapter(Kite.INSTANCE!!.logger), libsDirectory.parentFile.toPath(), libsDirectory.name) {
3838
val resolvedPaths = ConcurrentHashMap.newKeySet<File>()!!
3939

4040
// See that super method is not called here.

0 commit comments

Comments
 (0)