在sbt程序集上播放Java 2.3.8重复数据消除

在sbt程序集上播放Java 2.3.8重复数据消除,java,playframework,playframework-2.0,sbt-assembly,Java,Playframework,Playframework 2.0,Sbt Assembly,问题:为什么它忽略了合并策略。首先? 我已经使用2.3.8版在Play框架中开发了一个小应用程序 根据官方文档,您可以向plugin.sbt添加行addSbtPlugin(“com.eed3si9n“%”sbt assembly“%”0.12.0”),并添加一些(见下面的代码)以使用激活器assembly命令 这似乎可行,但存在重复数据消除冲突。这种情况在ServerWithStop.class文件中发生得很奇怪。在build.sbt中,这个类有一个AssembleEmergestStrateg

问题:为什么它忽略了合并策略。首先?

我已经使用2.3.8版在Play框架中开发了一个小应用程序 根据官方文档,您可以向plugin.sbt添加行
addSbtPlugin(“com.eed3si9n“%”sbt assembly“%”0.12.0”)
,并添加一些(见下面的代码)以使用
激活器assembly
命令

这似乎可行,但存在重复数据消除冲突。这种情况在ServerWithStop.class文件中发生得很奇怪。在build.sbt中,这个类有一个AssembleEmergestStrategy。这是正式文件的精确副本

case "play/core/server/ServerWithStop.class" => MergeStrategy.first
case other => (assemblyMergeStrategy in assembly).value(other)
我已经添加了几行代码来修复spring.tooling重复数据消除(可以在完整的sbt中再次找到)。 我理解这些原则;它使用散列SHA-1来比较类,然后根据行为进行合并,我知道它不知道如何处理与ServerWithStop.class不同的重复项

我不明白的是(这就是问题):为什么它忽略了合并策略

-

build.sbt

name:=“MovieRequest”
版本:=“1.0”
lazy val root=(文件中的项目(“.”)。启用插件(PlayJava)
规模规避:=“2.11.1”
libraryDependencies++=Seq(
javaJdbc,
爪哇人,
隐藏物
javaWs,
“mysql”%“mysql连接器java”%“5.1.35”
)
程序集中的mainClass:=Some(“play.core.server.NettyServer”)
程序集中的fullClasspath+=属性化.blank(PlayKeys.playPackageAssets.value)
程序集x.data.getName.matches(“sbt.*)| | x.data.getName.matches(“.*宏。*”)}
}
//排除公用日志记录,因为它与jcl-over-slf4j冲突
库依赖关系~={uu}映射{
如果m.organization==“com.typesafe.play”=>
m、 排除(“公用记录”、“公用记录”)
案例m=>m
}}
程序集中的assemblyMergeStrategy:={
如果Assembly.isConfigFile(x)=>
MergeStrategy.concat
如果Assembly.isReadme(ps.last)| Assembly.isLicenseFile(ps.last)=>
MergeStrategy.rename
案例路径列表(“META-INF”,xs@*)=>
(xs映射{{toLowerCase})匹配{
大小写(“manifest.mf”::Nil)|(“index.list”::Nil)|(“依赖项”::Nil)=>
合并策略。放弃
如果ps.last.endsWith(“.sf”)| ps.last.endsWith(“.dsa”)=>
合并策略。放弃
案例“丛”::xs=>
合并策略。放弃
案例“spring.tooling”::xs=>
合并策略。放弃
案例“服务”::xs=>
MergeStrategy.filterDistinctLines
大小写(“spring.schemas”::Nil)|(“spring.handlers”::Nil)=>
MergeStrategy.filterDistinctLines
案例=>MergeStrategy.deduplicate
}
案例“asm license.txt”|“overview.html”=>MergeStrategy.discard
//以第一台服务器为例,因为它被打包成两个罐子
案例“play/core/server/ServerWithStop.class”=>MergeStrategy.first
案例其他=>(汇编中的assemblyMergeStrategy)。值(其他)
}

为什么不直接使用内置的
dist
命令呢
dist
产生不同的输出;它创建了一个ZIP文件,而
sbt assembly
创建了一个胖JAR,您可以使用
java-JAR my_filename.JAR
运行它。
name := """MovieRequest"""

version := "1.0"

lazy val root = (project in file(".")).enablePlugins(PlayJava)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs,
  "mysql" % "mysql-connector-java" % "5.1.35"
)

mainClass in assembly := Some("play.core.server.NettyServer")

fullClasspath in assembly += Attributed.blank(PlayKeys.playPackageAssets.value)

assemblyExcludedJars in assembly <<= (fullClasspath in assembly) map { cp =>
  cp filter {x => x.data.getName.matches("sbt.*") || x.data.getName.matches(".*macros.*")}
}

// Exclude commons-logging because it conflicts with the jcl-over-slf4j
libraryDependencies ~= { _ map {
  case m if m.organization == "com.typesafe.play" =>
m.exclude("commons-logging", "commons-logging")
  case m => m
}}

assemblyMergeStrategy in assembly := {
  case x if Assembly.isConfigFile(x) =>
    MergeStrategy.concat
  case PathList(ps @ _*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) =>
MergeStrategy.rename
  case PathList("META-INF", xs @ _*) =>
(xs map {_.toLowerCase}) match {
  case ("manifest.mf" :: Nil) | ("index.list" :: Nil) | ("dependencies" :: Nil) =>
    MergeStrategy.discard
      case ps @ (x :: xs) if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa")     =>
        MergeStrategy.discard
      case "plexus" :: xs =>
        MergeStrategy.discard
      case "spring.tooling" :: xs =>
        MergeStrategy.discard
      case "services" :: xs =>
        MergeStrategy.filterDistinctLines
      case ("spring.schemas" :: Nil) | ("spring.handlers" :: Nil) =>
        MergeStrategy.filterDistinctLines
      case _ => MergeStrategy.deduplicate
    }
  case "asm-license.txt" | "overview.html" => MergeStrategy.discard

  // Take the first ServerWithStop because it's packaged into two jars
  case "play/core/server/ServerWithStop.class" => MergeStrategy.first
  case other => (assemblyMergeStrategy in assembly).value(other)
}