scaladockersbtsbt-native-packagerfinch

Sbt generated docker container fails to package subproject


I have a multi-project build.sbt file, with projects like so:

lazy val utils = (project in file("utils"))
  .settings(
    Seq(
      publishArtifact := false
    )).[...]


lazy val api = (project in file("api"))
  .dependsOn(utils)
  .settings(commonSettings: _*)
  .enablePlugins(JavaAppPackaging, DockerPlugin)
  .settings(publish := {})
  .settings(
    Seq(
      packageName in Docker := "my-api",
      dockerBaseImage := "java:8",
      mainClass in Compile := Some("com.path.to.Main"),
      publishArtifact := false,
      unmanagedJars in Compile += file("jars/somejars.jar")
    ))

API is built on top of Finch framework. I create a docker image for the API using sbt api/docker:publishLocal and then run it locally. However, it seems like the utils subproject classes are not packaged with the final container, and as a result I am getting multiple

java.lang.ClassNotFoundException:

types of exceptions. For a similar project that doesn't have a subproject dependency, everything runs smoothly and I have no problems.

Am I missing something in the plugin configuration? I thought .dependsOn() should be taking care of providing dependent classes in the project docker image.


Solution

  • Answering my own question, but turns out this is a default behaviour of sbt-native-packager, or rather sbt, when a dependent project has publishArtifact := false setting.

    A workaround that worked for me was changing the above to publish/skip := true.

    More on this issue can be found here: https://github.com/sbt/sbt-native-packager/issues/1221