【问题标题】:SBT multi module project: how to make static files (resources) available in main module?SBT 多模块项目:如何使静态文件(资源)在主模块中可用?
【发布时间】:2017-07-30 07:51:51
【问题描述】:

我开发了多模块 SBT 项目。一般来说,它是一个akka api。当我在本地运行它以及将它打包到 docker 中时,它运行良好。

最近我添加了一个用于生成电子邮件模板的新模块。为此,我决定使用scalate mustache。出于测试原因,我在email/src/main/resources/templates 中创建了一个简单的模板hello.mustache

然后我运行代码,该代码使用位于email/src/main/scala 中的类中的模板。一切编译正常(scalate 模板和 scala 代码)。

在我将 email 模块的依赖项添加到 app 模块中包含的 security 模块之后:

import sbt.Keys._
import NativePackagerHelper._

lazy val core = project.in(file("core"))
  .settings(name := "core")
  .settings(Common.settings)
  .settings(libraryDependencies ++= Dependencies.commonDependencies)
  .enablePlugins(JavaAppPackaging)

lazy val email = project.in(file("email"))
  .settings(name := "email")
  .settings(Common.settings)
  .settings(libraryDependencies ++= Dependencies.emailDependencies)
  .enablePlugins(JavaAppPackaging)

lazy val contacts = project.in(file("contacts"))
  .settings(name := "contacts")
  .settings(Common.settings)
  .dependsOn(core % "test->test;compile->compile")
  .enablePlugins(JavaAppPackaging)

lazy val security = project.in(file("security"))
  .settings(name := "security")
  .settings(Common.settings)
  .dependsOn(email, core % "test->test;compile->compile")
  .enablePlugins(JavaAppPackaging)

lazy val app = project.in(file("."))
  .enablePlugins(JavaAppPackaging, AshScriptPlugin, DockerPlugin)
  .settings(name := "app")
  .settings(Common.settings)
  .dependsOn(core, security, contacts)
  .settings(
    mainClass in Compile := Some("com.app.Main"),
    packageName in Docker := "app-backend",
    version in Docker := "latest",
    dockerBaseImage := "openjdk:8-jre-alpine",
    dockerExposedPorts := Seq(5000)
  )

我在尝试运行电子邮件代码时看到以下错误:

Exception in thread "main" org.fusesource.scalate.TemplateException: scala.tools.nsc.symtab.classfile.ClassfileParser$unpickler$.unpickle([BILscala/reflect/internal/Symbols$Symbol;Lscala/reflect/internal/Symbols$Symbol;Ljava/lang/String;)V
    at org.fusesource.scalate.TemplateEngine.compileAndLoad(TemplateEngine.scala:886)
    at org.fusesource.scalate.TemplateEngine.compileAndLoadEntry(TemplateEngine.scala:745)
...

如何让email模块代码在其他模块中工作?

附加信息: 我尝试通过运行 app 模块中的 Main 类直接从 IDE 运行代码。 斯卡拉版本 2.12.2;缩放版本 1.8.0; sbt 版本 0.13.8;

【问题讨论】:

    标签: scala sbt scalate


    【解决方案1】:

    恐怕您在几个 scala 编译器版本之间遇到了 bin 兼容性问题。最好像这样显式覆盖 scala lang 版本以避免此类问题。

    dependencyOverrides := Set(
      "org.scala-lang"         % "scala-library"             % scalaVersion.value,
      "org.scala-lang"         % "scala-reflect"             % scalaVersion.value,
      "org.scala-lang"         % "scala-compiler"            % scalaVersion.value
    ),
    

    【讨论】:

      【解决方案2】:

      在我的特殊情况下,log4j 版本的 scalate 和另一个 scala 库之间存在冲突问题。所以对我有用的解决方案是:

      "org.scalatra.scalate"    %% "scalate-core" % "1.8.0" excludeAll(ExclusionRule(organization = "org.slf4j"))
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2018-04-26
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 2016-01-04
        • 2011-11-24
        相关资源
        最近更新 更多