10

Play Web アプリを Docker 化しようとしていますが、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 をどこにもインポートしていません。

4

2 に答える 2

13

競合がある場合は、フルネームを使用してください。

enablePlugins(sbtdocker.DockerPlugin)
于 2015-11-22T14:55:17.427 に答える
1

メッセージにあるように、"and import _root_.com.typesafe.sbt.packager.docker.DockerPlugin" sbt-native-packager には競合するDockerPluginクラスが付属しています。しかし、それはあなたがすでに知っていることです。

秘訣は、Play プラグインが sbt-native-packager に依存して...人々の生活を楽にし、その結果、競合が発生することです (申し訳ありませんが、助けが多すぎると人々の生活が壊れる可能性があります :))。

解決策は、@pfn が推奨するまたはdisablePlugins(SbtNativePackager).

http://www.scala-sbt.org/sbt-native-packager/topics/play.htmlを参照してください。

于 2015-11-22T20:42:32.757 に答える