I try to build jar from clean project with sbt-assembly
how describes in docs:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
import AssemblyKeys._
assemblySettings
mainClass in assembly := Some("play.core.server.ProdServerStart")
fullClasspath in assembly += Attributed.blank(PlayKeys.playPackageAssets.value)
but it gives me a lot of deduplicate errors. How to build "fat" jar from play with sbt-assembly
?
答案 0 :(得分:11)
需要设置几个位来将播放应用程序构建为胖罐。
从asssembly插件开始。必须有一个名为assembly.sbt的文件直接位于项目目录中。如果您的项目名为MyPlayProject,则要准确并消除混淆,该文件必须位于“MyPlayProject / project / assembly.sbt”,并且应仅包含以下内容。
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3"
显然版本可能会发生变化,但它应该有效。这会将程序集插件添加到项目中,如果像其他插件一样添加到plugins.sbt文件中,则无效。
作为涵盖所有基础的问题,还要确保涵盖标准的sbt项目,包括project / build.properties。请注意,对于Play 2.5.x,每https://www.playframework.com/documentation/2.5.x/Migration25#sbt-upgrade-to-0.13.11
需要13.8或更高版本sbt.version=0.13.11
导致问题的可能关键部分是 build.sbt 的一部分 应该包含合并策略的文件。 jar文件中有许多标准文件(例如MANIFEST.MF等),当你将所有的jar组合成一个胖jar时,你必须做一些事情来处理这些重复的文件。基本示例
assemblyMergeStrategy in assembly := {
case r if r.startsWith("reference.conf") => MergeStrategy.concat
case PathList("META-INF", m) if m.equalsIgnoreCase("MANIFEST.MF") => MergeStrategy.discard
case x => MergeStrategy.first
}
您的里程可能与特定情况有关,但这对于标准的游戏胖罐来说非常基本。
上述合并策略的一些基本细节如下:
由于我无法在评论中澄清这是一个完整的示例build.sbt文件。
name := """MyPlayProject"""
version := "1.0"
lazy val `root` = (project in file(".")).enablePlugins(PlayScala)
scalaVersion := "2.11.8"
// Set JS Engine to use
JsEngineKeys.engineType := JsEngineKeys.EngineType.Node
// Set repository details for resolving additional depenecies
resolvers ++= Seq(
"scalaz-bintray" at "https://dl.bintray.com/scalaz/releases",
"ClouderaRepo" at "https://repository.cloudera.com/content/repositories/releases"
)
// Specifies dependencies to use in project
libraryDependencies ++= Seq(
"org.apache.kafka" % "kafka_2.11" % "0.9.0.1",
jdbc,
cache,
ws,
specs2 % Test
)
// Add an additional source content route besides the default
unmanagedResourceDirectories in Test <+= baseDirectory ( _ /"target/web/public/test" )
unmanagedSourceDirectories in Compile += baseDirectory.value / "src2" / "main" / "scala"
sourceDirectory in Compile <<= baseDirectory / "src2/main/scala"
scalaSource in Compile <<= baseDirectory / "src2/main/scala"
// Informs SBT Assembly how to handle duplicated files when combining project and dependency jars into a single fat jar
assemblyMergeStrategy in assembly := {
case n if n.startsWith("reference.conf") => MergeStrategy.concat
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
我会在回答之前留下评论以获取更多细节,所以我可以更准确地回答我的问题,但问题有点陈旧,并说我的代表不够高,反正...希望这有帮助。
P.S。我在搜索有关我自己的合并问题的帮助时找到了您的问题,将游戏2.3.4迁移到2.5.4。这就是为什么我将META-INF合并策略更改为仅丢弃MANIFEST.MF,否则会导致以下异常。我正在用我的答案重新发布它,希望它可能会在搜索结果中被提取,因为我最初在搜索时发现它很少。
Oops, cannot start the server.
com.google.inject.CreationException: Unable to create injector, see the following errors:
1) Error in custom provider, net.sf.ehcache.CacheException: java.lang.AssertionError: No net.sf.ehcache.EhcacheInit services found
while locating play.api.cache.CacheManagerProvider
while locating net.sf.ehcache.CacheManager
for field at play.api.cache.NamedEhCacheProvider.manager(Cache.scala:211)
while locating play.api.cache.NamedEhCacheProvider
at com.google.inject.util.Providers$GuicifiedProviderWithDependencies.initialize(Providers.java:149)
at play.api.cache.EhCacheModule.play$api$cache$EhCacheModule$$bindCache$1(Cache.scala:184):
Binding(interface net.sf.ehcache.Ehcache qualified with QualifierInstance(@play.cache.NamedCache(value=play)) to ProviderTarget(play.api.cache.NamedEhCacheProvider@45312be2)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:176)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
at com.google.inject.Guice.createInjector(Guice.java:96)
at com.google.inject.Guice.createInjector(Guice.java:84)
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
at play.core.server.ProdServerStart$.start(ProdServerStart.scala:47)
at play.core.server.ProdServerStart$.main(ProdServerStart.scala:22)
at play.core.server.ProdServerStart.main(ProdServerStart.scala)
Caused by: net.sf.ehcache.CacheException: java.lang.AssertionError: No net.sf.ehcache.EhcacheInit services found
at net.sf.ehcache.LibraryInit.init(LibraryInit.java:55)
at net.sf.ehcache.CacheManager.init(CacheManager.java:366)
at net.sf.ehcache.CacheManager.<init>(CacheManager.java:259)
at net.sf.ehcache.CacheManager.newInstance(CacheManager.java:1037)
at net.sf.ehcache.CacheManager.newInstance(CacheManager.java:936)
at net.sf.ehcache.CacheManager.create(CacheManager.java:904)
at play.api.cache.CacheManagerProvider.get$lzycompute(Cache.scala:205)
at play.api.cache.CacheManagerProvider.get(Cache.scala:202)
at play.api.cache.CacheManagerProvider.get(Cache.scala:201)
at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81)
at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72)
at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:61)
at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62)
at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:54)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:62)
at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:984)
at com.google.inject.util.Providers$GuicifiedProviderWithDependencies.initialize(Providers.java:149)
at com.google.inject.util.Providers$GuicifiedProviderWithDependencies$$FastClassByGuice$$2a7177aa.invoke(<generated>)
at com.google.inject.internal.cglib.reflect.$FastMethod.invoke(FastMethod.java:53)
at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:57)
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:91)
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93)
at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80)
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)
at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80)
at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:174)
at com.google.inject.internal.Initializer.injectAll(Initializer.java:108)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:174)
... 9 more
Caused by: java.lang.AssertionError: No net.sf.ehcache.EhcacheInit services found
at net.sf.ehcache.LibraryInit.initService(LibraryInit.java:78)
at net.sf.ehcache.LibraryInit.init(LibraryInit.java:50)
... 42 more