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

Scala 在使用sbt构建的应用程序上运行时出现NoClassDefFoundError,scala,jar,sbt,sbt-native-packager,Scala,Jar,Sbt,Sbt Native Packager,我有以下build.sbt文件: lazy val shared = (project in file("shared")) . settings (moduleName := "x-shared") . ... lazy val service = (project in file ("service")) . settings (moduleName := "x-api") . dependsO

我有以下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") .
  ...
服务子模块需要共享作业模块。共享项目基本上是所有模块使用的一组类。作业和服务都是不同的应用程序,但我们在服务上有一个端点,需要启动作业应用程序

问题是,在运行时,我们在尝试引用作业模块类时出现以下错误:

java.lang.NoClassDefFoundError: com/earnest/ingestor/models/Pipeline$
但是我们可以毫无问题地引用共享模块

项目的文件夹结构如下所示:

./root
  ./service
  ./shared
  ./job
我注意到的一点是,为作业模块生成的jar文件不会复制到服务模块的lib文件夹中,这与共享jar文件不同:

service/target/universal/stage/lib目录包含以下两个目录:

com.earnest.x-api-localdev.9288.jar
com.earnest.x-shared-localdev.9288.jar
但是作业jar被填充到作业模块:

作业/目标/通用/阶段/库包含:

com.earnest.x-job-localdev.9288.jar
我对sbt构建非常陌生,因此不确定在通过sbt clean命令完成的构建过程中是否会遗漏一些内容。我们正在使用sbt本机软件包插件。我不确定还有哪些信息可以共享,因此我提取了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\u INF/MANIFEST.MF

上的类路径中不包含
com.earnest.x-job-localdev.9288.jar
,通过设置服务模块添加
job%“编译->编译;测试->测试”

整个街区看起来像:

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

通过设置服务模块添加
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) .
  ...

您使用了哪个构建命令
sbt native packager
通常不用于生成uberjar。因此,通常使用
sbt-assembly
。我正在使用
sbt-clean
命令,不确定它是如何配置的,但该命令正在构建完整的项目。我注意到的另一件事是,应用程序是通过launcher.jar运行的,我看到我们在build.sbt中也使用了LauncherJarPlugin,如果使用
jar xf
命令提取,
META\u INF/MANIFEST.MF
在类路径中不包含
com.earsent.x-job-localdev.9288.jar
。如果没有关于配置的详细信息,我怀疑我们能够解决这个问题。我应该只共享完整的build.sbt文件吗?我只是不想复制粘贴整个块。复制粘贴任何与构建逻辑相关的内容。您使用了哪个构建命令
sbt native packager
通常不用于生成uberjar。因此,通常使用
sbt-assembly
。我正在使用
sbt-clean
命令,不确定它是如何配置的,但该命令正在构建完整的项目。我注意到的另一件事是,应用程序是通过launcher.jar运行的,我看到我们在build.sbt中也使用了LauncherJarPlugin,如果使用
jar xf
命令提取,
META\u INF/MANIFEST.MF
在类路径中不包含
com.earsent.x-job-localdev.9288.jar
。如果没有关于配置的详细信息,我怀疑我们能够解决这个问题。我应该只共享完整的build.sbt文件吗?我只是不想复制粘贴整个块。复制粘贴任何与构建逻辑相关的内容。