मैं "मेटा-इन / * में कॉपी की गई डुप्लिकेट फ़ाइलों को कैसे हल करूं"


91

मैं एक वाणिज्यिक Android आवेदन पर काम कर रहा हूँ। मैं विभिन्न लाइसेंस प्रकारों के तहत लाइसेंस प्राप्त कुछ पुस्तकालयों का उपयोग कर रहा हूं जिनमें से कुछ निम्नलिखित बताते हैं:

यदि लाइब्रेरी में एट्रिब्यूशन नोट्स के साथ "NOTICE" फाइल है, तो आपको वितरित करते समय उस NOTICE को शामिल करना होगा

(उनमें से एक को उदाहरण के लिए अपाचे लाइसेंस 2.0 के तहत लाइसेंस प्राप्त है )।

एक से अधिक पुस्तकालय हैं। जब मैं निर्माण को ढाल के साथ या एंड्रॉइड स्टूडियो के साथ करता हूं तो मुझे निम्नलिखित बिल्ड त्रुटि प्राप्त होती है:

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/license.txt

निम्नलिखित जवाब जो मैंने अब तक इंटरनेट और स्टैकओवरफ़्लो पर पाए हैं, build.gradleउन्हें निम्नलिखित को जोड़ने के लिए पैकेजिंग से lic.txt (नोटिस.टेक्स्ट या अन्य फाइलें जो इस तरह से हस्तक्षेप कर सकती हैं) को हटाने का सुझाव देते हैं :

packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
}

उदाहरण के लिए देखें: Android METAL-INF / LICENSE.txt में कॉपी किए गए एंड्रॉइड स्टूडियो 0.4 डुप्लीकेट फाइलें

उन पुस्तकालयों ( उदाहरण के लिए अपाचे लाइसेंस 2.0 ) के लाइसेंस के अनुसार, लाइसेंस और नोटिस फ़ाइलों को शामिल किया जाना चाहिए ।

मेरा प्रश्न: मैं कैसे (जैसे लाइसेंस से संबंधित एक से अधिक फ़ाइलों को जोड़ सकते हैं license.txt , notice.txt (Gradle से मेरी परियोजना में क्रम में लाइसेंस के अनुरूप होने के आदि) : तकनीकी विस्तार लाइसेंस ग्रंथों concatenated किया जाएगा)?


2
एक तकनीकी पीओवी से, क्या आप चीजों को पैकेज नहीं कर सकते हैं ताकि प्रत्येक पुस्तकालय की सभी "फाइलें शामिल होनी चाहिए" अपनी निर्देशिका में हों? एक विकल्प जो मैंने कुछ ऐप्स के साथ देखा है, वह आपके लिए (मैन्युअल रूप से) सभी संबंधित लाइसेंस / नोटिस फ़ाइलों को एक संसाधन में संयोजित करता है और इसमें शामिल हैं / इसे प्रदर्शित करता है (जहां दो या अधिक लाइब्रेरी एक ही लाइसेंस संस्करण साझा करते हैं, आपको उन्हें सक्षम करना चाहिए। , "लाइब्रेरी ए और लाइब्रेरी बी निम्नलिखित लाइसेंस के अधीन हैं: ...")।
ट्रिपहाउंड

@TripeHound यह वही है जो मैं वर्तमान में वर्कअराउंड के रूप में करता हूं, जबकि विकासशील प्रक्रिया में मैं उन्हें छोड़ देता हूं और जब यह रिलीज़ होता है: सभी 'बहिष्कृत' टिप्पणी करें और मैन्युअल रूप से लाइसेंस हल करें।
फ्लोअरी

1
जवाब के लिए खोज "पैकेजिंगओसेस - बाहर" एक उत्थान के हकदार हैं
अहमद अदेल इस्माइल

जवाबों:


47

एक समाधान है यदि आपके पास नाम का उपयोग करके केवल एक लाइसेंस है license.txt(पढ़ें: सभी license.txtप्रतियां समान हैं):

packagingOptions {
   pickFirst  'META-INF/license.txt'
}

अन्यथा, Google ने निर्भरता लाइसेंस प्रबंधित करने के लिए एक ग्रेड प्लगइन भी जारी किया। देखें यहाँ । मैंने इसकी कोशिश नहीं की, लेकिन ऐसा लगता है कि यह हर निर्भरता को एकत्र करने में सक्षम है, और यहां तक ​​कि उन सभी लाइसेंसों को प्रदर्शित करने वाली गतिविधि भी उत्पन्न कर रहा है।


1
मेरे पास इस समय 2 लाइसेंस हैं, एक अपाचे 2.0 से है और दूसरा जीपीएल 3.0। मेरा वर्तमान समाधान चरण के विकास के दौरान उन्हें बाहर करना है और जब हम जारी करते हैं तो मैन्युअल रूप से उन्हें शामिल करते हैं। सभी लाइसेंस.टेक्स्ट को संक्षिप्त किया जाएगा। नोटिस के लिए भी। वैसे भी लाइसेंस लेने के मामले में मुझे पिक के साथ आपका दृष्टिकोण पसंद है!
Flowryn

3
यदि आप कभी भी स्वचालित रूप से लाइसेंस प्राप्त करने का एक तरीका खोजते हैं, तो मैं सभी कान हूँ!
मार्क प्लानो-लेसे

यह मैं अब जांच कर रहा हूं। पहले मुझे यह पता लगाने की आवश्यकता है कि संघर्ष को उत्पन्न करने वाले (और कैसे) संघर्ष कर रहा है (इसके लिए मैंने यह प्रश्न पूछा: stackoverflow.com/questions/34287701/… ) और फिर इसे बदल दें
फ़्लिकरन

@ कैसे आप सभी सूचनाओं को शामिल करते हैं। मैन्युअल रूप से, सिर्फ एक नोटिस में कॉपी करें। इसे संशोधित नहीं किया जा सकता है जो jarफ़ाइल में है
चीनानीचेन

आप उल्लेख करते हैं कि इस मुद्दे का उपयोग पुस्तकालयों में किया जा रहा है ... मेरे मामले में, मैं उन पुस्तकालयों को बनाने के लिए जिम्मेदार हूं जिनका मैं उपयोग कर रहा हूं..क्या मैं गलत कर सकता हूं जब मैं उन्हें बना रहा हूं? धन्यवाद
एरिक

32

निम्नलिखित build.gradle फ़ाइल में जोड़ें

packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/MANIFEST.MF'
    }

1
यह उन लाइसेंसों को बाहर करता है, जो उनमें से अधिकांश के लिए, स्पष्ट रूप से उनकी शर्तों के खिलाफ हैं।
मार्क प्लानो-लेसे

1
यह एंड्रॉइड {} को चालू (2. *)
ग्रैडल के

4

मुझे अपने आवेदन के साथ इसी मुद्दे का सामना करना पड़ा। आपको यह सुनिश्चित करने की आवश्यकता है कि आपने दो बार कोई लाइब्रेरी नहीं जोड़ी है। अगर आपने फायरबेस डॉक्यूमेंट का अनुसरण किया है तो https://firebase.google.com/docs/android/setup

फिर आपको एंड्रॉइड स्टूडियो के अंदर फायरबेस लाइब्रेरी को नहीं जोड़ना चाहिए, फ़ाइल-> प्रोजेक्ट संरचना-> क्लाउड-> फायरबेस

आपको अपने Android एप्लिकेशन में फायरबेस का उपयोग करने के लिए दोनों में से केवल एक करना है।

अंत में अपने ऐप को साफ़ और फिर से चलाएँ।


2
यदि आप जैकसन-डेटाबाइंड का उपयोग करते हैं तो आपको एक बार इसे जोड़ने पर समस्या आती है।
15 जनवरी को अविश्वसनीय जान


0

मुझे लगता है कि आपको build.gradle में केवल इन विकल्पों को शामिल करने की आवश्यकता है:

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
    }
}

-2

निश्चित रूप से यह काम करेगा

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }

1
नहीं, यह नहीं होगा: यह लाइसेंस को बाहर करता है। यह उक्त लाइसेंस शर्तों के अनुसार अवैध है।
मार्क प्लानो-लेसे

किसी परियोजना के तुरंत संकलन के लिए इसका tmp समाधान नहीं
महेंद्रन कैंडी

1
जो भी उपयोग हो, लाइसेंस पढ़ें: उनमें से अधिकांश के लिए, आप अपने बहिष्करण नियम के साथ जो हासिल कर रहे हैं वह अवैध है।
मार्क प्लानो-लेसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.