2016-01-04 7 views
11

हाल ही में मैं Android Dependencies पर कुछ शोध कार्य कर रहा था और एक प्रश्न मेरे दिमाग पर फंस गया। सवाल यह है कि हम जावा कोड का उपयोग करके निर्भरताओं की सूची प्राप्त कर सकते हैं?निर्भरता की सूची प्राप्त करें रनटाइम

उदाहरण के लिए मेरी build.gradle फ़ाइल

dependencies { 
    compile 'com.google.android.gms:play-services:+' 
    compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
} 

में निर्भरता अब अगर मैं उन निर्भरता जबकि एप्लिकेशन चल रहा है, हम इसे प्राप्त कर सकते हैं के नाम करना चाहते हैं?

+0

नहीं। बिल्ड पूरा होने के बाद आप सभी निर्भरताओं से बाहर निकलेंगे कक्षाएं हैं। – njzk2

उत्तर

3

वास्तव में नहीं। वे संकलन-समय निर्भरता हैं।

  • compile 'com.facebook.android:facebook-android-sdk:4.1.0'

  • compile project(':facebook'), के रूप में एक से एक विरूपण साक्ष्य को संदर्भित करने का विरोध किया है जहाँ आप एक GitHub रेपो या कुछ और आप स्थानीय लाइब्रेरी परियोजना देने के लिए क्लोन: अपने संकलित APK में, वहाँ के बीच कोई महत्वपूर्ण अंतर है भंडार

  • एक अपने अनुप्रयोग में फेसबुक के नाम और पैकेज है कि आप ने लिखा है के साथ (संसाधनों का एक गुच्छा डिट्टो) कक्षाओं के गुच्छा

होने

आप अनुप्रयोग लेखन कर रहे हैं, और आप विभिन्न प्रकार के निर्माण और/या उत्पाद जायके का उपयोग कर रहे हैं, और आप प्रत्येक के लिए अलग अलग निर्भरता है, तो आप BuildConfig का उपयोग पता लगाने के लिए जो निर्माण संस्करण आप चल रहे हैं कर सकते हैं।

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

+0

हाँ कि मुझे क्या करना है, क्या कोशिश कर रहा हूँ एक पुस्तकालय लेखन और को पता है कि अन्य निर्भरता डेवलपर को शामिल किया है चाहता हूँ। –

0

क्रम

import org.kohsuke.args4j.CmdLineParser; 

import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.ArrayList; 
import java.util.List; 

public class RuntimeDependenciesExample { 

    public static void main(String[] args) { 
     // just to add some dependency for our list 
     CmdLineParser parser = null; 
     RuntimeDependenciesExample main = new RuntimeDependenciesExample(); 
     main.findRuntimeDependencies(); 
     main.checkSystemClassPath(); 
    } 

    private void checkSystemClassPath() { 
     System.out.println("System classpath:\n" + System.getProperty("java.class.path").replace(':', '\n')); 
    } 

    private void findRuntimeDependencies() { 
     ClassLoader classloader = Thread.currentThread().getContextClassLoader(); 
     do { 
      System.out.println("Using classloader: " + classloader.toString()); 
      URL[] urls = ((URLClassLoader) classloader).getURLs(); 
      List<String> jars = new ArrayList<>(); 
      for (URL url : urls) { 
       jars.add(url.getFile()); 
      } 

      printFiltered(jars); 
      classloader = classloader.getParent(); 
     } while (classloader != null); 
    } 

    private void printFiltered(List<String> jars) { 
     System.out.println("\nFiltered jar list:"); 
     for (String jarPath : jars) { 
      if (!jarPath.contains("jre") && !jarPath.contains("jdk")) { 
       System.out.println(jarPath); 
      } 
     } 
     System.out.println('\n'); 
    } 
} 

पर जार निर्भरता खोजने के बारे में CommonsWare की टिप्पणी @ करने के लिए कुछ कोड डाल सकता है इस तरह उत्पादन कुछ है, जो आप जार सूची मिल सकता है:

Using classloader: [email protected] 

Filtered jar list: 
/Users/someUser/dev/test-code/build/classes/main/ 
/Users/someUser/dev/test-code/build/resources/main/ 
/Users/someUser/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/2.3.11/f6b34997d04c1538ce451d3955298f46fdb4dbd4/groovy-all-2.3.11.jar 
/Users/someUser/.gradle/caches/modules-2/files-2.1/args4j/args4j/2.32/1ccacebdf8f2db750eb09a402969050f27695fb7/args4j-2.32.jar 
/Applications/IntelliJ%20IDEA%2016%20EAP.app/Contents/lib/idea_rt.jar 


Using classloader: [email protected] 

Filtered jar list: 
/usr/local/Cellar/subversion/1.8.10_2/lib/libsvnjavahl-1.0.dylib 
/System/Library/Java/Extensions/MRJToolkit.jar 


System classpath: 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/charsets.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/deploy.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/cldrdata.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/dnsns.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/jaccess.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/jfxrt.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/localedata.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/nashorn.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/sunec.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/ext/zipfs.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/javaws.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jce.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jfr.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jfxswt.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/jsse.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/management-agent.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/plugin.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/resources.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre/lib/rt.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/ant-javafx.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/dt.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/javafx-mx.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/jconsole.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/packager.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/sa-jdi.jar 
/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/lib/tools.jar 
/Users/someUser/dev/test-code/build/classes/main 
/Users/someUser/dev/test-code/build/resources/main 
/Users/someUser/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/2.3.11/f6b34997d04c1538ce451d3955298f46fdb4dbd4/groovy-all-2.3.11.jar 
/Users/someUser/.gradle/caches/modules-2/files-2.1/args4j/args4j/2.32/1ccacebdf8f2db750eb09a402969050f27695fb7/args4j-2.32.jar 
/Applications/IntelliJ IDEA 16 EAP.app/Contents/lib/idea_rt.jar 
+0

'मुख्य'? यह एक जावा ऐप के लिए होगा, न कि एंड्रॉइड ऐप। – njzk2

+0

हां लेकिन एक ही अवधारणा लागू होती है। 'क्लासलोडर' प्राप्त करें और इसमें शामिल पथ को देखें। फिर इसके पथ के लिए अभिभावक 'क्लासलोडर' की जांच करें। कोड में जावा ऐप या एंड्रॉइड विशिष्ट नहीं है। (मुख्य विधि को छोड़कर) – JBirdVegas

+0

नहीं वास्तव में, क्योंकि अपने सभी निर्भरता ही डेक्स फ़ाइल में पैक कर रहे हैं। आप केवल प्रणाली classpath, जो ओ पी के सवाल का जवाब नहीं करता था। – njzk2

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