Java 9 दो स्थैतिक विश्लेषण टूल्स पेश करता है जो अलग-अलग उद्देश्यों की पूर्ति करते हैं: jdeps (निर्भरता विश्लेषक) और jdeprscan (अप्रचलित API स्कैनर)।
त्वरित तुलना
| पहलू | jdeps | jdeprscan | |
|---|---|---|---|
| उद्देश्य | क्लास/पैकेज/मॉड्यूल निर्भरताओं का विश्लेषण करें | अप्रचलित API उपयोग के लिए स्कैन करें | |
| मुख्य उपयोग | मॉड्यूलराइजेशन, निर्भरता विज़ुअलाइज़ेशन | माइग्रेशन योजना, कोड गुणवत्ता | |
| इनपुट | .class, .jar, निर्देशिका, मॉड्यूल | .class, .jar, निर्देशिका, क्लास नाम | |
| आउटपुट | निर्भरता ग्राफ, पैकेज/क्लास स्तर | अप्रचलित API उपयोग की सूची | |
| JDK आंतरिक | --jdk-internals फ्लैग | --for-removal फ्लैग | |
| थर्ड-पार्टी JAR | हां, विश्लेषण कर सकते हैं | नहीं (केवल JDK API) |
jdeps - Java क्लास निर्भरता विश्लेषक
मुख्य कमांड्स
# पैकेज-स्तर निर्भरताएं (डिफ़ॉल्ट)
jdeps MyClass.class
jdeps myapp.jar
# वर्बोज: क्लास-स्तर निर्भरताएं
jdeps -v MyClass.class
jdeps --verbose myapp.jar
# केवल सारांश
jdeps -s myapp.jar
# JDK आंतरिक API उपयोग ढूंढें (माइग्रेशन के लिए महत्वपूर्ण)
jdeps --jdk-internals myapp.jar
# मॉड्यूल निर्भरताएं
jdeps --module-path mods -m my.module
# DOT ग्राफ आउटपुट (Graphviz के साथ विज़ुअलाइज़ करें)
jdeps --dot-output dots myapp.jar
dot -Tpng dots/summary.dot -o deps.png
# मॉड्यूल जानकारी उत्पन्न करें (Java 9+ माइग्रेशन के लिए)
jdeps --generate-module-info output-dir myapp.jar
jdeps आउटपुट उदाहरण
$ jdeps -v MyApp.jar
MyApp.jar -> java.base
MyApp.jar -> java.logging
MyApp.jar -> java.sql
MyApp.jar -> third-party.lib (not found)
com.example.MyApp -> java.lang.Object
com.example.MyApp -> java.util.List
com.example.MyApp -> com.example.internal.Service (internal)
com.example.MyApp -> jdk.internal.misc.Unsafe (JDK internal!)
महत्वपूर्ण jdeps विकल्प
jdeps --help # पूर्ण सूची
मुख्य विकल्प:
-cp, --class-path PATH क्लासपथ सेट करें
--module-path PATH मॉड्यूल पथ सेट करें
-p, --package PKG पैकेज द्वारा फ़िल्टर
-e, --regex REGEX पैटर्न द्वारा फ़िल्टर
-f, --filter REGEX निर्भरता फ़िल्टर
--require MODULE मॉड्यूल द्वारा फ़िल्टर
-R, --recursive पुनरावर्ती रनटाइम निर्भरताएं
-I, --inverse व्युत्क्रम निर्भरताएं
--compile-time कंपाइल-टाइम दृश्य
--multi-release VERSION मल्टी-रिलीज JAR संस्करण
-q, --quiet लापता निर्भरताएं छुपाएं
jdeprscan - Java अप्रचलित API स्कैनर
मुख्य कमांड्स
# क्लास/जार/निर्देशिका में अप्रचलित API उपयोग स्कैन करें
jdeprscan MyClass.class
jdeprscan myapp.jar
jdeprscan /path/to/classes
# विशिष्ट JDK रिलीज़ के लिए अप्रचलित API सूचीबद्ध करें
jdeprscan --list --release 8
jdeprscan --list --release 11
# केवल हटाने के लिए अप्रचलित (--for-removal)
jdeprscan --for-removal myapp.jar
# वर्बोज आउटपुट
jdeprscan -v myapp.jar
# क्लासपथ सेट करें (निर्भरता समाधान के लिए)
jdeprscan --class-path lib/* myapp.jar
jdeprscan आउटपुट उदाहरण
$ jdeprscan myapp.jar
myapp.jar -> com.example.MyClass
com.example.MyClass -> method java.lang.Thread.stop() (deprecated)
com.example.MyClass -> method java.lang.System.runFinalizersOnExit() (deprecated, for removal)
com.example.MyClass -> constructor java.util.Date(int,int,int) (deprecated)
$ jdeprscan --list --release 8
java.lang.Thread.stop()
java.lang.Thread.suspend()
java.lang.Thread.resume()
java.lang.System.runFinalizersOnExit()
java.util.Date(int, int, int)
java.util.Date(int, int, int, int, int)
...
jdeprscan विकल्प
jdeprscan --help
विकल्प:
--class-path PATH निर्भरता समाधान के लिए क्लासपथ
--for-removal केवल हटाने के लिए अप्रचलित (Java 9+)
--full-version पूर्ण संस्करण स्ट्रिंग
-h, --help सहायता
-l, --list अप्रचलित API सूचीबद्ध करें (स्कैन न करें)
--release 6|7|8|9|10|11|12... लक्ष्य JDK रिलीज़
-v, --verbose वर्बोज आउटपुट
--version संस्करण जानकारी
व्यावहारिक माइग्रेशन वर्कफ्लो
चरण 1: निर्भरताओं का विश्लेषण (jdeps)
# 1. मॉड्यूलराइजेशन के लिए निर्भरताएं ढूंढें
jdeps --generate-module-info mods myapp.jar
# 2. JDK आंतरिक API पहचानें (Java 9+ में हटाए गए/कैप्सूलित)
jdeps --jdk-internals myapp.jar
# 3. थर्ड-पार्टी निर्भरताएं जांचें
jdeps -R --class-path "lib/*" myapp.jar
चरण 2: अप्रचलित API स्कैन करें (jdeprscan)
# 1. सभी अप्रचलित उपयोग स्कैन करें
jdeprscan --class-path "lib/*" myapp.jar
# 2. केवल हटाने के लिए अप्रचलित (तत्काल कार्रवाई आवश्यक)
jdeprscan --for-removal --class-path "lib/*" myapp.jar
# 3. लक्ष्य JDK के लिए क्या अप्रचलित है देखें
jdeprscan --list --release 17
CI/CD में एकीकरण
Maven प्लगइन
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<configuration>
<jdeprscan>true</jdeprscan>
</configuration>
</plugin>
Gradle टास्क
task jdeprscan(type: Exec) {
commandLine 'jdeprscan', '--for-removal', '--class-path',
configurations.runtimeClasspath.asPath,
"$buildDir/classes/java/main"
}
सारांश: कब क्या उपयोग करें
- jdeps उपयोग करें जब: मॉड्यूलराइज़ कर रहे हैं, निर्भरताएं विज़ुअलाइज़ कर रहे हैं, JDK आंतरिक उपयोग ढूंढ रहे हैं, मॉड्यूल जानकारी उत्पन्न कर रहे हैं
- jdeprscan उपयोग करें जब: नए JDK में माइग्रेट कर रहे हैं, कोड गुणवत्ता जांच रहे हैं, हटाने के लिए अप्रचलित API ढूंढ रहे हैं, अप्रचलन सूची उत्पन्न कर रहे हैं
- दोनों एक साथ उपयोग करें: पूर्ण माइग्रेशन मूल्यांकन के लिए - jdeps संरचनात्मक निर्भरताएं दिखाता है, jdeprscan API-स्तर की समस्याएं दिखाता है