SBT多模块项目:如何使静态文件(资源)在主模块中可用?



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

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

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

电子邮件模块的依赖项添加到应用程序模块中包含的安全模块后:

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)
...

如何使电子邮件模块代码在另一个模块中工作?

附加信息: 我尝试通过从应用程序模块运行 Main 类直接从 IDE 运行代码。 斯卡拉版本 2.12.2;缩放版本 1.8.0;SBT 版本 0.13.8;

恐怕您在几个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
),

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

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

最新更新