Неожиданное поведение с Scala и URLClassLoader - PullRequest
0 голосов
/ 30 сентября 2019

Я обнаружил проводное поведение при попытке загрузить класс с помощью 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, и все заработало, как и ожидалось. .

Итак, после этого длинного рассказа у меня возникнут следующие вопросы:

  1. Почему команда scala не работает в отличие от java?
  2. Существуют ли загрузчики классов для java? и scala?
  3. Есть ли обходной путь, который будетпозвольте мне запустить jar1 со scala?

Примечание: я использую scala 2.13

Редактировать:

Команда scala была "scala -classpath. \ jar1.jar"core.EntryPoint. \ jar2.jar "

И команда java была" java -classpath. \ fatjar1.jar core.EntryPoint. \ jar2.jar "(я передаю местоположение jar2 в аргументах)

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

После небольшого осмотра кажется, что скрипт scala использует объект с именем MainGenericRunner для запуска кода, и этот объект использует URLClassLoader сам, так что у вас есть другой загрузчик классов между java. exe и скрипт scala.

Обходной путь заключался в том, чтобы поставлять java scala-library.jar в classpath, и он работал как шарм.

0 голосов
/ 30 сентября 2019

Правильная команда с классом для запуска в качестве последнего аргумента:

scala -classpath .\jar1.jar .\jar2.jar core.EntryPoint

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...