为什么Play项目中的sbt-docker的enablePlugins(DockerPlugin)给出了“错误:对DockerPlugin的引用是不明确的”?

我试图dockerize玩一个networking应用程序,我正在使用sbt-docker。 当我执行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 

我得到了上面的错误,我的build.sbt看起来像这样:

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

我的怀疑是sbt-native-packager与sbt-docker冲突。 但是我没有在任何地方导入sbt-native-packager。

正如消息所示, “import _root_.com.typesafe.sbt.packager.docker.DockerPlugin” sbt-native-packager附带了冲突的DockerPlugin类。 但这就是你已经知道的。

诀窍是Play插件依靠sbt-native-packager来缓解人们的生活,从而缓解冲突(抱歉,太多的帮助可能会打破人们的生活:))。

解决scheme是使用完全限定的插件类名称,如@pfn recommended或disablePlugins(SbtNativePackager)

请参阅http://www.scala-sbt.org/sbt-native-packager/topics/play.html

如果有冲突,请使用全名。

 enablePlugins(sbtdocker.DockerPlugin)