वसा जार के रूप में एक प्ले एप्लिकेशन बनाने के लिए कई बिट्स सेट अप करने की आवश्यकता है।
asssembly प्लगइन से शुरू। प्रोजेक्ट निर्देशिका में सीधे assembly.sbt नाम की एक फ़ाइल होनी चाहिए। सटीक होने और भ्रम को खत्म करने के लिए यदि आपकी परियोजना का नाम MyPlayProject है, तो फ़ाइल "MyPlayProject/project/assembly.sbt" पर स्थित होनी चाहिए और इसमें केवल निम्नलिखित होना चाहिए।
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3"
स्पष्ट रूप से संस्करण बदल गया है लेकिन इसे काम करना चाहिए। यह आपकी प्रोजेक्ट में असेंबली प्लगइन जोड़ देगा और प्लगइन.sbt फ़ाइल में अन्य प्लगइन्स जैसे जोड़े जाने पर काम नहीं करेगा।
सभी आधार कवर की बात भी सुनिश्चित करें कि आप मानक एसबीटी आइटम परियोजना/build.properties सहित कवर किया हुआ है। ध्यान दें कि प्ले 2.5.x एसबीटी संस्करण के लिए 13.8 या अधिक से अधिक प्रति https://www.playframework.com/documentation/2.5.x/Migration25#sbt-upgrade-to-0.13.11
sbt.version=0.13.11
की आवश्यकता है और संभावना महत्वपूर्ण हिस्सा अपने मुद्दों के कारण build.sbt फ़ाइल जो मर्ज रणनीति को शामिल करना चाहिए का हिस्सा है। जार फ़ाइलों (जैसे MANIFEST.MF आदि) में मानक हैं जो कई फाइलें हैं और आपको इन डुप्लिकेट फ़ाइलों को संभालने के लिए कुछ करना होगा जब आप सभी जार को एक वसा जार में जोड़ते हैं। मूल उदाहरण
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
}
आपका माइलेज विशिष्ट मामलों को संभालने के साथ बहुत ही हो सकता है लेकिन यह एक मानक वसा जार मानक के लिए काफी बुनियादी है।
ऊपर मर्ज की रणनीति पर कुछ बुनियादी विवरण इस प्रकार है:
- मर्ज वसा जार के लिए एकल फाइल करने के लिए सभी जार के reference.conf। मैं उस विशिष्ट मुद्दे को भूल जाता हूं जो इसका कारण बनता है लेकिन मुझे नहीं लगता कि आप इस चरण के बिना अपने प्ले एप्लिकेशन को वसा जार के रूप में चलाने में सक्षम होंगे। मेरे पास इसका कोई सबूत नहीं है)
- प्रत्येक जार के लिए MANIFEST.MF फ़ाइलों को छोड़ दें। 'केस पाथलिस्ट ("मेटा-आईएनएफ", एक्सएस @ _ *) => MergeStrategy.discard' के रूप में इसे दिखाने के साथ ऑनलाइन कई उदाहरण। यह जार की मेटा-आईएनएफ निर्देशिका में कुछ भी हटाकर काम करता है। हालांकि शुरू करने प्ले 2.4 निर्भरता इंजेक्षन खेलने के साथ बहुत मुश्किल धक्का दिया हो रही किया गया है और निर्भरता इंजेक्शन का उपयोग कर अगर वहाँ जो सेवा निर्भरता इंजेक्शन का उपयोग करने के लिए आवश्यक फ़ाइलें शामिल net.sf.ehcache पर एक पुस्तकालय निर्भरता है। ठीक अन्य सभी फ़ाइलों को छोड़ कर सिर्फ MANIFEST.MF फ़ाइलों त्यागने विशेष रूप से के रूप में मैंने किया है या सिर्फ सब कुछ को हटाने और इंजेक्शन (अनुशंसित नहीं)
- एक सामान्य पकड़ सभी मामले कि पहले रहता निर्भरता कुछ भी उपयोग नहीं करते हैं करने के लिए है किसी भी डुप्लिकेट फाइलों के और दूसरों को त्यागें। उपयोगी आप एक ही पुस्तकालय पर एक से अधिक आम निर्भरता हो सकता है और कोई कारण नहीं कई प्रतियां रखना है जब।
चूंकि मैं यहां टिप्पणियों के साथ स्पष्टीकरण नहीं दे सकता, यह एक पूर्ण नमूना 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
}
इस मदद करता है मैं अधिक जानकारी के लिए टिप्पणी छोड़ दिया है | का जवाब दे इसलिए मैं अपने जवाब के साथ अधिक सटीक हो सकता था लेकिन सवाल थोड़ा पुराना है और ही कहा मेरी प्रतिनिधि वैसे भी पर्याप्त नहीं है इससे पहले कि ... उम्मीद ।
पीएस मुझे अपने स्वयं के मर्ज मुद्दों के साथ मदद की तलाश करते समय आपका प्रश्न मिला 2.37 से 2.5.4 तक माइग्रेट करना। यही कारण है कि मैंने मेटा-आईएनएफ विलय रणनीति को केवल 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([email protected])) (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
क्या आप सुनिश्चित हैं कि जार सबसे अच्छा विकल्प है। Sbt-native packager बॉक्स – mgosk
@zella के लगभग इंस्टॉलेशन पैकेज का निर्माण करता है, अपने कुछ त्रुटि लॉग पेस्ट करें। – Nio