在sbt程序集上播放Java 2.3.8重复数据消除
问题:为什么它忽略了合并策略。首先? 我已经使用2.3.8版在Play框架中开发了一个小应用程序 根据官方文档,您可以向plugin.sbt添加行在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
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)
}