Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java 9 में jdeps टूल का महत्व: क्लास निर्भरता विश्लेषण

jdeps (Java Dependency Analyzer) JDK 8 से शामिल एक कमांड-लाइन टूल है जो Java क्लास फ़ाइलों, JARs, और मॉड्यूल्स के पैकेज-स्तर और क्लास-स्तर निर्भरताओं का विश्लेषण करता है। यह मॉड्यूलराइजेशन, माइग्रेशन, और आर्किटेक्चर समझ के लिए आवश्यक है।

मुख्य क्षमताएं

  • निर्भरता विश्लेषण: पैकेज/क्लास/मॉड्यूल स्तर
  • JDK आंतरिक API पहचान: --jdk-internals फ्लैग
  • मॉड्यूल जानकारी उत्पन्न करना: --generate-module-info
  • ग्राफ विज़ुअलाइज़ेशन: DOT फॉर्मेट आउटपुट
  • लापता निर्भरताएं ढूंढना: क्लासपथ समस्याओं का निदान

आम कमांड्स और विकल्प

कमांडउद्देश्य
jdeps MyClass.classपैकेज-स्तर निर्भरताएं
jdeps -v MyClass.classक्लास-स्तर निर्भरताएं (वर्बोज)
jdeps -s myapp.jarकेवल सारांश
jdeps --jdk-internals myapp.jarJDK आंतरिक API उपयोग ढूंढें
jdeps --dot-output dir myapp.jarGraphviz DOT फाइलें उत्पन्न करें
jdeps --generate-module-info dir myapp.jarmodule-info.java उत्पन्न करें
jdeps -R --class-path cp myapp.jarपुनरावर्ती रनटाइम निर्भरताएं
jdeps --check MODULEमॉड्यूल निर्भरताओं का विश्लेषण करें

व्यावहारिक उदाहरण

1. बुनियादी पैकेज-स्तर विश्लेषण

$ jdeps MyApp.jar
MyApp.jar -> java.base
MyApp.jar -> java.logging
MyApp.jar -> java.sql
MyApp.jar -> com.fasterxml.jackson.databind (not found)
MyApp.jar -> org.springframework.context (not found)

com.example.app -> java.lang
com.example.app -> java.util
com.example.app -> com.fasterxml.jackson.databind
com.example.app -> org.springframework.beans.factory

2. वर्बोज क्लास-स्तर विश्लेषण

$ jdeps -v MyApp.jar | head -30
MyApp.jar -> java.base
com.example.app.Main -> java.lang.Object
com.example.app.Main -> java.lang.System
com.example.app.Main -> java.util.ArrayList
com.example.app.Main -> com.fasterxml.jackson.databind.ObjectMapper
com.example.app.Main -> org.springframework.boot.SpringApplication
com.example.app.service.UserService -> java.util.List
com.example.app.service.UserService -> java.util.Optional
com.example.app.service.UserService -> com.example.app.repository.UserRepository

3. JDK आंतरिक API पहचान (माइग्रेशन के लिए महत्वपूर्ण)

$ jdeps --jdk-internals MyApp.jar
MyApp.jar -> java.base
com.example.app.Main -> jdk.internal.misc.Unsafe  (JDK internal)
com.example.app.util.ReflectionUtil -> sun.misc.Unsafe  (JDK internal)
com.example.app.util.ReflectionUtil -> sun.reflect.Reflection  (JDK internal)

WARNING: JDK internal APIs are inaccessible.

4. मॉड्यूल जानकारी उत्पन्न करना (Java 9+ माइग्रेशन)

$ jdeps --generate-module-info generated-modules MyApp.jar
# generated-modules/MyApp/module-info.java बनाता है

$ cat generated-modules/MyApp/module-info.java
module MyApp {
    requires java.base;
    requires java.logging;
    requires java.sql;
    requires com.fasterxml.jackson.databind;
    requires org.springframework.context;
    
    exports com.example.app;
    exports com.example.app.service;
    exports com.example.app.repository;
}

5. निर्भरता ग्राफ विज़ुअलाइज़ेशन

$ jdeps --dot-output dots MyApp.jar
$ ls dots/
summary.dot  classes.dot  packages.dot

# Graphviz के साथ PNG उत्पन्न करें
$ dot -Tpng dots/summary.dot -o deps-summary.png
$ dot -Tpng dots/packages.dot -o deps-packages.png

6. व्युत्क्रम निर्भरताएं (कौन किस पर निर्भर करता है)

$ jdeps -I --require java.sql MyApp.jar
# java.sql की आवश्यकता वाले मॉड्यूल्स/पैकेज दिखाता है

उन्नत फ़िल्टरिंग

# केवल विशिष्ट पैकेज की निर्भरताएं
jdeps -p com.example.app MyApp.jar

# रेगेक्स पैटर्न द्वारा फ़िल्टर
jdeps -e ".*service.*" MyApp.jar

# निर्भरता फ़िल्टर: पैकेज/आर्काइव/मॉड्यूल/कोई नहीं
jdeps -filter:package MyApp.jar      # डिफ़ॉल्ट
jdeps -filter:archive MyApp.jar      # प्रति JAR
jdeps -filter:module MyApp.jar       # प्रति मॉड्यूल
jdeps -filter:none MyApp.jar         # कोई फ़िल्टर नहीं

# विश्लेषण की जाने वाली कक्षाएं फ़िल्टर करें
jdeps --include "com.example.*" MyApp.jar

मल्टी-रिलीज JAR समर्थन

# मल्टी-रिलीज JAR के लिए संस्करण निर्दिष्ट करें (9+)
jdeps --multi-release 11 myapp.jar

# बेस संस्करण विश्लेषण करें
jdeps --multi-release base myapp.jar

CI/CD एकीकरण

Maven

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jdeps-plugin</artifactId>
    <version>3.1.2</version>
    <configuration>
        <jdepsOptions>
            <option>--jdk-internals</option>
            <option>--generate-module-info</option>
            <option>target/generated-module-info</option>
        </jdepsOptions>
    </configuration>
</plugin>

Gradle

task jdeps(type: Exec) {
    commandLine 'jdeps', '--jdk-internals', '--generate-module-info', 
                'build/generated-module-info', 'build/libs/app.jar'
}

आउटपुट व्याख्या गाइड

आउटपुटअर्थकार्रवाई
-> java.baseमानक JDK मॉड्यूल पर निर्भर करता हैसामान्य, ठीक है
-> jdk.internal.*JDK आंतरिक API का उपयोग करता हैमाइग्रेट करें! प्रतिस्थापन खोजें
-> sun.*Sun मालिकाना APIमाइग्रेट करें! मानक API का उपयोग करें
(not found)निर्भरता क्लासपथ पर नहींक्लासपथ/मॉड्यूल पथ जोड़ें
-> unnamed moduleक्लासपथ पर अनाम मॉड्यूलमॉड्यूलराइज़ करने पर विचार करें

सर्वोत्तम अभ्यास

  • नियमित रूप से चलाएं: CI पाइपलाइन में एकीकृत करें
  • --jdk-internals का उपयोग करें: Java 9+ माइग्रेशन से पहले महत्वपूर्ण
  • क्लासपथ प्रदान करें: --class-path के साथ लापता निर्भरताओं को कम करें
  • ग्राफ विज़ुअलाइज़ करें: आर्किटेक्चर समीक्षा के लिए DOT आउटपुट का उपयोग करें
  • मॉड्यूल जानकारी उत्पन्न करें: मॉड्यूलराइजेशन के लिए प्रारंभिक बिंदु

सारांश

jdeps Java कोडबेस में निर्भरताओं को समझने के लिए प्राथमिक टूल है। यह मॉड्यूलराइजेशन (module-info.java उत्पन्न करना), JDK आंतरिक API माइग्रेशन, आर्किटेक्चर विश्लेषण, और बिल्ड समस्याओं के निदान के लिए अमूल्य है। अपने बिल्ड पाइपलाइन में इसे एकीकृत करें ताकि निर्भरता स्वच्छता बनी रहे।

  1. Java में GridBagConstraints क्लास का महत्व क्या है? Java में GridBagConstraints क्लास का महत्व क्या है?

    एक GridBagLayout एक बहुत ही लचीला लेआउट प्रबंधक है जो हमें कंस्ट्रेंट्स का उपयोग करके घटकों को एक दूसरे के सापेक्ष स्थिति देने की अनुमति देता है। प्रत्येक GridBagLayout सेल के एक गतिशील आयताकार ग्रिड का उपयोग करता है जिसमें प्रत्येक घटक एक या अधिक सेल पर कब्जा करता है जिसे इसका प्रदर्शन क्षेत्र कहा

  1. Java में SwingWorker क्लास का महत्व क्या है Java में SwingWorker क्लास का महत्व क्या है

    एक SwingWorker क्लास हमें एक वर्कर थ्रेड में एक असिंक्रोनस टास्क (जैसे लंबे समय तक चलने वाला टास्क) करने में सक्षम बनाती है फिर टास्क परिणामों के आधार पर इवेंट डिस्पैच थ्रेड (EDT) से Swing कंपोनेंट्स को अपडेट करती है। इसे Java 1.6 संस्करण में पेश किया गया था।SwingWorker क्लासjava.swing.SwingWorker क

  1. Java में SwingUtilities क्लास का महत्व क्या है? Java में SwingUtilities क्लास का महत्व क्या है?

    Java में, स्विंग कंपोनेंट्स स्क्रीन पर प्रदर्शित होने के बाद, केवल एक थ्रेड द्वारा संचालित किए जा सकते हैं जिसे इवेंट हैंडलिंग थ्रेड कहा जाता है। हम अपना कोड एक अलग ब्लॉक में लिख सकते हैं और इस ब्लॉक का रेफरेंस इवेंट हैंडलिंग थ्रेड को दे सकते हैं। SwingUtilities क्लास में दो महत्वपूर्ण स्टेटिक मेथड्