2016-04-25 14 views
5

से जार मैं sbt-assembly के साथ स्वच्छ परियोजना से जार का निर्माण करने के लिए कैसे docs में वर्णन करता है की कोशिश कैसे बनाएं:खेलने ढांचे 2.5.x

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) 

लेकिन यह मुझे deduplicate त्रुटियों की एक बहुत कुछ देता है। sbt-assembly के साथ खेलने से "वसा" जार कैसे बनाएं?

+0

क्या आप सुनिश्चित हैं कि जार सबसे अच्छा विकल्प है। Sbt-native packager बॉक्स – mgosk

+0

@zella के लगभग इंस्टॉलेशन पैकेज का निर्माण करता है, अपने कुछ त्रुटि लॉग पेस्ट करें। – Nio

उत्तर

9

वसा जार के रूप में एक प्ले एप्लिकेशन बनाने के लिए कई बिट्स सेट अप करने की आवश्यकता है।

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 
+0

एक साल बाद, धन्यवाद !! मुझे आपका पीएस-संपादित टेक्स्ट मिला। मैंने जो किया वह मैंने किया, लेकिन फिर मुझे जार पर 'अवैध हस्ताक्षर' त्रुटि मिल गई। फिर भी, मेरे पास एक सुराग है जहां आपको धन्यवाद देना है। त्रुटि जो मुझे मिलती है: 'org.apache.flink.client.program.ProgramInvocationException: प्रोग्राम की प्रविष्टि बिंदु वर्ग 'net.tagtog.services.documents.flink.Job' प्रारंभिकरण के दौरान अपवाद का कारण बनता है: मैनिफेस्ट मुख्य विशेषताओं के लिए अमान्य हस्ताक्षर फ़ाइल पचाना ' – juanmirocks

+0

समाधान मिला! (कि कम से कम मेरे लिए काम किया)। यह: '' पाथलिस्ट ("मेटा-आईएनएफ", "सेवाएं", एक्सएस @ _ *) => MergeStrategy.concat केस पाथलिस्ट ("मेटा-आईएनएफ", एक्सएस @ _ *) => MergeStrategy.discard'' '- आपको सभी सेवाओं की फाइलों की आवश्यकता है – juanmirocks

संबंधित मुद्दे