SBT: "объект не является членом пакета" при импорте зависимостей, созданных из другого проекта с помощью скользкого кода
У меня есть несколько проектов настройки, как это:
lazy val kalosrpc = project
.settings(
libraryDependencies ++= Seq(
"io.grpc" % "grpc-netty" % scalapb.compiler.Version.grpcJavaVersion
)
).dependsOn(kalosgen)
lazy val kalosgen = project
.settings(
// settings not important
)
Основной класс kalosgen
генерирует модель с помощью slick-codegen
и места это в:
kalosgen/target/scala-2.13/src_managed/main
в упаковке com.kalos.gen
, Он также компилирует protobufs в классы scala во время компиляции, но этот пакет находится в classpath, как и ожидалось.
Затем я могу импортировать эти файлы из kalosgen
в kalosrpc
IntelliJ не жалуется и имеет полный доступ к информации о типах, определенной в этих файлах. Итак, я бегу kalosgen/compile
и пакеты генерируются, как я ожидаю, однако, когда я следую за этим с kalosrpc/compile
Я получил:
object gen is not a member of package com.kalos
Я пытался изменить название пакетов, но это ничего не исправило. Исходя из представленной здесь информации, конфигурация моего проекта кажется правильной.
2 ответа
Проблема заключалась в том, что я генерировал исходники в Scala-коде через slick-codegen
утилита:
import slick.codegen.SourceCodeGenerator
object Main extends App {
val url = "hidden"
val user = "hidden"
val password = "hidden"
val dbDriver = "com.mysql.jdbc.Driver"
val profile = "slick.jdbc.MySQLProfile"
SourceCodeGenerator.main(
Array(
profile,
dbDriver,
url,
"./kalosgen/target/scala-2.13/src_managed/main",
"com.kalos.gen",
user,
password
)
)
}
Я предполагаю, что вы должны сгенерировать источники с помощью задач SBT, чтобы SBT распознал их как допустимые источники (по крайней мере, для целей межпроектных зависимостей), поэтому я смог преобразовать приведенный выше код в задачу, выполняемую при компиляции время в build.sbt
:
lazy val gen = project
.settings(
libraryDependencies ++= Seq(
"dependencies"
),
sourceGenerators in Compile += Def.task {
val outDir = (sourceManaged in Compile).value.getPath
(runner in Compile).value.run(
"slick.codegen.SourceCodeGenerator",
(dependencyClasspath in Compile).value.files,
Array(
"slick.jdbc.MySQLProfile",
"com.mysql.jdbc.Driver",
"url",
outDir,
"com.kalos.gen",
"username",
"password"
),
streams.value.log
)
Seq(file(outDir + "/com/kalos/gen/Tables.scala"))
}.taskValue
)
Теперь генерируется Tables.scala
появляется как ожидалось в пути к классам, и мой проект компилируется. Если кто-то с большим знанием sbt сможет дать более полное объяснение того, почему это произошло, я с радостью приму это как правильный ответ.
Попробуйте выполнить show sourceManaged
из sbt, который должен вывести местоположение, где должны сгенерироваться файлы, например, в моем проекте это в
.../myproject/target/scala-2.13/src_managed
Скорее всего должно быть
kalosgen/target/scala-2.13/src_managed/main/com/kalos/gen
вместо
kalosgen/target/scala-2.13/main/com/kalos/gen
Также дважды проверьте сгенерированные файлы, в верхней части которых находятся операторы пакета