scalasbtsbt-plugin

sbt plugin: add an unmanaged jar file


I'm trying to create a relatively simple sbt plugin to wrap grpc-swagger artifact. Therefore, I've created a project with the following structure:

projectDir/
  build.sbt
  lib/grpc-swagger.jar <- the artifact I've downloaded
  src/...

where build.sbt looks like the following:

ThisBuild / version := "0.0.1-SNAPSHOT"
ThisBuild / organization := "org.testPlugin"
ThisBuild / organizationName := "testPlugin"

lazy val root = (project in file("."))
  .enable(SbtPlugin)
  .settings(name := "grpc-swagger-test-plugin")

According to sbt docs, that's all I have to do in order to include an unmanaged dependecy, that is:

However, when I do execute sbt compile publishLocal, the plugin published lacks of that external artifact.

So far I've tried to:

but none so far seemed to work.

So how am I supposed to add an external artifact to a sbt plugin?


Solution

  • The proper solution to this problem is to publish the grpc-swagger library. If for whatever reason this can't be done from that library's build system, you can do it with sbt. Just add a simple subproject whose only job it is to publish that jar. It should work like so:

    ...
    lazy val `grpc-swagger` = (project in file("."))
      .settings(
        name := "grpc-swagger",
        Compile / packageBin := baseDirectory.value / "lib" / "grpc-swagger.jar",
        // maybe other settings, such as grpc-swagger's libraryDependencies
      )
    
    lazy val root = (project in file("."))
      .enable(SbtPlugin)
      .settings(name := "grpc-swagger-test-plugin")
      .dependsOn(`grpc-swagger`)
    
       ...
    

    The pom file generated for the root project should now specify a dependency on grpc-swagger, and running the publish task in the grpc-swagger project will publish that jar along with a pom file.

    That should be enough to make things work, but honestly, it's still a hack. The proper solution is to fix grpc-swagger's build system so you can publish an artifact from there and then just use it via libraryDependencies.