Я обнаружил проводное поведение при попытке загрузить класс с помощью URLClassLoader.
Немного контекста: у меня есть черта в jar1, которая выглядит следующим образом:
trait ATrait { def act(context: Context): Unit }
икласс в jar2, который выглядит следующим образом (jar2 получил jar1 в своем classpath в IDE):
class EntryPoint extends ATrait {
override def act(context: Context): Unit = {
println(s"Hello World! context is = $context")
}
}
и обратно в jar1 У меня есть точка входа в программу, которая выглядит следующим образом:
private val classloader = new URLClassLoader(Array(jar2.toURI.toURL))
private val myClass = classloader.loadClass(jar2ClassName)
private val instance = myClass.newInstance().asInstanceOf[ATrait]
instance.act(null)
Затем я попытался запустить программу из моей IDE (IntelliJ + sbt), и она работала, как и ожидалось.
позже я запустил jar1 из моего cli с помощью команды scala, и я получил эту ошибку:java.lang.ClassNotFoundException: core.ATrait
, ведьма была странной, потому что jar1 содержит core.ATrait.
После долгих поворотов я создал толстый jar (со сборкой sbt) формы jar1 и запустил его с помощью команды java, и все заработало, как и ожидалось. .
Итак, после этого длинного рассказа у меня возникнут следующие вопросы:
- Почему команда scala не работает в отличие от java?
- Существуют ли загрузчики классов для java? и scala?
- Есть ли обходной путь, который будетпозвольте мне запустить jar1 со scala?
Примечание: я использую scala 2.13
Редактировать:
Команда scala была "scala -classpath. \ jar1.jar"core.EntryPoint. \ jar2.jar "
И команда java была" java -classpath. \ fatjar1.jar core.EntryPoint. \ jar2.jar "(я передаю местоположение jar2 в аргументах)