Scala создание и использование локальной библиотеки - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать локальную библиотеку, которая содержит класс

myproject.scala:

object test {
    def info(message: String): Unit = println(s"INFO: $message")
}

build.sbt:

name := "MyProject"
version := "0.1"
organization := "MyCorp"
scalaVersion := "2.11.0"
sbtVersion := "0.13"

Я запустил sbt clean compile publishLocal и вижу jar в своем локальном каталоге ivy2. В чем я не уверен, так это в том, как теперь использовать эту библиотеку в другом проекте.

я добавил libraryDependencies += "MyCorp"%"myproject_2.11"%"0.1" к sbt второго проекта, и я вижу это в classPath, когда я распечатываю его в repl. Проблема в том, когда я пытаюсь импорт MyCorp.myproject

Я получил ошибку, не найденную. Я уверен, что упускаю что-то простое, но это сводит меня с ума.

1 Ответ

0 голосов
/ 03 мая 2018

Я запустил sbt clean compile и вижу jar в своем локальном каталоге ivy2.

Это странно. sbt clean compile не публикует артефакт в локальном хранилище. (Вы скопировали это вручную там?) Это должно было быть сделано с помощью команды publishLocal, и артефакт должен был стать доступным в {path_to_.ivy2}/local/MyCorp/MyProject/0.1/jars/MyProject.jar.

Теперь в вашем втором проекте его можно добавить как

libraryDependencies += "MyCorp" % "MyProject" % "0.1"
// or in libraryDependencies ++= Seq(...)

Обратите внимание, что суффикс _2.11, который вы использовали в названии, зависит от того, как был построен первый проект, отличалась ли его сборка версиями Scala. Если бы это было так, суффикс обычно присутствовал бы в имени файла артефакта .jar. И предпочтительно избегать включения суффикса в объявление зависимостей библиотеки, но вместо этого используйте %% для встроенной поддержки.

После проверки также попытайтесь перезапустить интерфейс командной строки SBT, потому что, к сожалению, иногда изменения в build.sbt не учитываются на лету.

Обновление

Я предполагаю, что это mycorp.myproject.test, но я перепробовал все возможные комбинации. @ Brian

После комментариев я думаю, что в проекте все еще должно быть что-то неправильно настроенное и / или отсутствующее в описании.

Предполагается, что существует файл {path/to/project}/src/main/scala/mycorp/myproject/Test.scala со следующим содержимым:

package mycorp.myproject

object Test {
  def info(message: String): Unit = println(s"INFO: $message")
}

Когда артефакт публикуется, файл .jar должен содержать папки mycorp/myproject с файлами Test.class и Test$.class.

После добавления .jar к зависимостям второго проекта импорт Test в другой класс должен выглядеть следующим образом:

package mycorp.myproject2

import mycorp.myproject.Test

object AnotherTest extends App {

  Test.info("hello")

}

Надеюсь, это поможет.

Заключительная обновление

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