首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当通过slick codegen导入从另一个项目构建的依赖项时,“对象不是包的成员”

当通过slick codegen导入从另一个项目构建的依赖项时,“对象不是包的成员”
EN

Stack Overflow用户
提问于 2019-07-03 02:43:42
回答 2查看 1.3K关注 0票数 1

我有一个多项目设置,如下所示:

代码语言:javascript
复制
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生成一个模型,并将其放置在:

代码语言:javascript
复制
kalosgen/target/scala-2.13/src_managed/main 

com.kalos.gen包中。它还会在编译时将protobufs编译为scala类,但该包如预期的那样位于类路径中。

然后,我可以将这些文件从kalosgen导入到kalosrpc中,intelliJ不会出现错误,并且可以完全访问这些文件中定义的类型信息。所以我运行kalosgen/compile,包就像我期望的那样生成了,但是当我继续使用kalosrpc/compile时,我得到了:

代码语言:javascript
复制
object gen is not a member of package com.kalos

我尝试更改包的名称,但没有解决任何问题。根据presented here的信息,我的项目配置似乎是正确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-05 21:39:45

这里的问题是我是通过slick-codegen实用程序在scala代码中生成源代码的:

代码语言:javascript
复制
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中运行的任务

代码语言:javascript
复制
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有更多的了解,可以更全面地解释为什么会发生这种情况,我会很高兴地接受它作为正确的答案。

票数 0
EN

Stack Overflow用户

发布于 2019-07-03 03:01:17

尝试从sbt执行show sourceManaged,它应该输出generated files应该结束的位置,例如在我的项目中

代码语言:javascript
复制
.../myproject/target/scala-2.13/src_managed

它很可能应该是

代码语言:javascript
复制
kalosgen/target/scala-2.13/src_managed/main/com/kalos/gen

而不是

代码语言:javascript
复制
kalosgen/target/scala-2.13/main/com/kalos/gen

同样,仔细检查生成的文件在顶部有包statements

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56858438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档