Why does enablePlugins (DockerPlugin) from sbt-docker in the Play Project give "error: link to DockerPlugin ambiguous"?

I am trying to prove a web application for a game and I am using sbt-docker. I get a gollowing error when I execute sbt docker:

error: reference to DockerPlugin is ambiguous; it is imported twice in the same scope by import _root_.sbtdocker.DockerPlugin and import _root_.com.typesafe.sbt.packager.docker.DockerPlugin enablePlugins(DockerPlugin) ^ [error] Type error in expression Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? q 

I get the above error and my build.sbt file looks like this:

 enablePlugins(DockerPlugin) lazy val root = (project in file(".")).enablePlugins(PlayScala) scalaVersion := "2.11.6" libraryDependencies ++= Seq( jdbc, cache, ws, specs2 % Test ) resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases" // Play provides two styles of routers, one expects its actions to be injected, the // other, legacy style, accesses its actions statically. routesGenerator := InjectedRoutesGenerator // Make docker depend on the package task, which generates a jar file of the application code docker <<= docker.dependsOn(sbt.Keys.`package`.in(Compile, packageBin)) // Define a Dockerfile dockerfile in docker := { val jarFile = artifactPath.in(Compile, packageBin).value val classpath = (managedClasspath in Compile).value val mainclass = mainClass.in(Compile, packageBin).value.getOrElse(sys.error("Expected exactly one main class")) val jarTarget = s"/app/${jarFile.getName}" // Make a colon separated classpath with the JAR file val classpathString = classpath.files.map("/app/" + _.getName).mkString(":") + ":" + jarTarget new Dockerfile { // Base image from("java") // Add all files on the classpath add(classpath.files, "/app/") // Add the JAR file add(jarFile, jarTarget) // On launch run Java with the classpath and the main class entryPoint("java", "-cp", classpathString, mainclass) } } 

My suspicion is that sbt-native-packager is conflicting with sbt-docker. But I do not import sbt-native-packager anywhere.

+8
scala docker build sbt sbt-docker
source share
2 answers

As the message says: "and import _root_.com.typesafe.sbt.packager.docker.DockerPlugin" sbt-native-packager comes with a conflicting DockerPlugin class. But that is what you already know.

The trick is that the Play plugin depends on sbt-native-packager to ... make life easier for people and therefore conflict (sorry, too much help can break people's lives :)).

The solution is to use fully qualified plugin class names as the recommended @pfn or disablePlugins(SbtNativePackager) .

See http://www.scala-sbt.org/sbt-native-packager/topics/play.html .

+1
source share

If there is a conflict, use the full name.

 enablePlugins(sbtdocker.DockerPlugin) 
+10
source share

All Articles