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.jar | JDK आंतरिक API उपयोग ढूंढें |
jdeps --dot-output dir myapp.jar | Graphviz DOT फाइलें उत्पन्न करें |
jdeps --generate-module-info dir myapp.jar | module-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 माइग्रेशन, आर्किटेक्चर विश्लेषण, और बिल्ड समस्याओं के निदान के लिए अमूल्य है। अपने बिल्ड पाइपलाइन में इसे एकीकृत करें ताकि निर्भरता स्वच्छता बनी रहे।