使用 sbt 构建的应用程序运行时出现 NoClassDefFoundError

NoClassDefFoundError during runtime on application built with sbt

我有以下 build.sbt 文件:

lazy val shared = (project in file("shared")) .
  settings (moduleName := "x-shared") .
  ...

lazy val service = (project in file ("service")) .
  settings (moduleName := "x-api") .
  dependsOn (shared % "compile->compile;test->test", job % "compile->compile;test->test") .
  aggregate (shared, joob) .
  ...

lazy val job = (project in file("job") dependsOn (shared % "compile->compile;test->test")) .
  settings (moduleName := "x-job") .
  ...

服务子模块需要 sharedjob 模块。共享项目基本上是所有模块使用的一组 类。工作和服务都是不同的应用程序,但我们在服务上有一个端点,需要启动工作应用程序。

问题是在运行时,我们在尝试引用 job 模块时遇到以下错误 类:

java.lang.NoClassDefFoundError: com/earnest/ingestor/models/Pipeline$

但是我们可以毫无问题地引用共享模块。

项目的文件夹结构如下:

./root
  ./service
  ./shared
  ./job

我注意到的一件事是,为 job 模块生成的 jar 文件不会复制到服务模块的 lib 文件夹中,这与 共享 jar文件:

service/target/universal/stage/lib 目录包含:

com.earnest.x-api-localdev.9288.jar
com.earnest.x-shared-localdev.9288.jar

但是 job jar 被填充到作业模块中:

job/target/universal/stage/lib 包含:

com.earnest.x-job-localdev.9288.jar

我是 sbt 构建的新手,所以不确定在通过 sbt clean 命令完成的构建过程中是否可能遗漏了一些部分。我们正在使用 sbt-native-package 插件。我不确定还有哪些其他信息可能有用,所以我提取了 build.sbt 要点,感谢您提前提供帮助。

sbt 插件:

addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.11")

更新 1

应用程序正在从 launcher.jar 启动,使用的似乎是 build.sbt 文件中的 LauncherJarPlugin。我注意到的一件事是 launcher.jar 在 META_INF/MANIFEST.MF

的 ClassPath 中不包含 com.earnest.x-job-localdev.9288.jar

我能够通过添加 job % "compile->compile;test->test"

设置服务模块来解决我的问题

整个街区看起来像:

lazy val service = (project in file ("service")) .
  settings (moduleName := "x-api") .
  dependsOn (shared % "compile->compile;test->test", job % "compile->compile;runtime->runtime;test->test") .
  aggregate (shared, job) .
  ...