jdeprscan Java 9 में पेश एक स्थैतिक विश्लेषण टूल है जो क्लास फ़ाइलों, JAR आर्काइव्स, और निर्देशिकाओं को @Deprecated एनोटेटेड API तत्वों (मेथड्स, कंस्ट्रक्टर्स, फील्ड्स, कक्षाएं) के उपयोग के लिए स्कैन करता है। यह केवल Java SE API में अप्रचलित तत्वों का पता लगाता है, थर्ड-पार्टी लाइब्रेरी में नहीं।
सिंटैक्स और विकल्प
jdeprscan [options] {dir | jar | class}
| विकल्प | विवरण |
--class-path PATH | निर्भर क्लासेस के लिए खोज पथ |
--for-removal | केवल हटाने के लिए अप्रचलित API तक सीमित (Java 9+) |
--full-version | पूर्ण संस्करण स्ट्रिंग प्रिंट करें |
-h, --help | सहायता संदेश |
-l, --list | अप्रचलित API सूचीबद्ध करें (स्कैन न करें) |
--release 6|7|8|9|10|11|12... | स्कैनिंग के लिए लक्ष्य JDK रिलीज़ |
-v, --verbose | प्रोसेसिंग के दौरान अतिरिक्त संदेश |
--version | संक्षिप्त संस्करण स्ट्रिंग |
आम उपयोग उदाहरण
1. JAR फ़ाइल स्कैन करें
$ 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)
2. निर्देशिका स्कैन करें (क्लास फ़ाइलें)
$ jdeprscan --class-path lib/* build/classes
build/classes/com/example/Service.class
com.example.Service -> method java.util.logging.Logger.getAnonymousLogger() (deprecated)
3. विशिष्ट JDK रिलीज़ के लिए अप्रचलित API सूचीबद्ध करें
$ jdeprscan --list --release 8
java.lang.Thread.stop()
java.lang.Thread.suspend()
java.lang.Thread.resume()
java.lang.Thread.destroy()
java.lang.System.runFinalizersOnExit()
java.util.Date(int, int, int)
java.util.Date(int, int, int, int, int)
java.util.Date(int, int, int, int, int, int)
...
$ jdeprscan --list --release 11
java.lang.SecurityManager (deprecated, for removal)
java.lang.Thread.countStackFrames()
java.lang.Thread.destroy()
java.lang.System.runFinalizersOnExit()
...
4. केवल हटाने के लिए अप्रचलित (तत्काल कार्रवाई)
$ jdeprscan --for-removal --class-path lib/* myapp.jar
myapp.jar -> com.example.LegacyCode
com.example.LegacyCode -> method java.lang.SecurityManager.checkTopLevelWindow() (deprecated, for removal)
com.example.LegacyCode -> field java.lang.SecurityManager.inCheck (deprecated, for removal)
5. वर्बोज मोड
$ jdeprscan -v --release 11 myapp.jar
Scanning myapp.jar...
Found: com.example.MyClass
-> method java.lang.Thread.stop() (deprecated since 1.2, for removal)
-> constructor java.util.Date(int,int,int) (deprecated since 1.1)
Scan complete.
आउटपुट प्रारूप समझना
-> <कक्षा नाम>
<कक्षा नाम> -> <सदस्य प्रकार> <पूरा नाम> (deprecated [since X] [, for removal])
- deprecated: उपयोग न करें, बेहतर विकल्प मौजूद है
- deprecated, for removal: भविष्य के संस्करण में हटाया जाएगा - तत्काल माइग्रेट करें
- since X: जिस संस्करण में अप्रचलित किया गया
मॉड्यूलर प्रोजेक्ट्स के साथ एकीकरण
# मॉड्यूलर प्रोजेक्ट के लिए
jdeprscan --module-path mods --release 11 -m com.example.app
# या संकलित मॉड्यूल निर्देशिका पर
jdeprscan --module-path mods --release 17 mods/com.example.app
सामान्य अप्रचलित API और प्रतिस्थापन (Java 9+ फोकस)
| अप्रचलित API | स्थिति | प्रतिस्थापन |
Thread.stop() | हटाने के लिए | इंटरप्शन/फ्लैग्स का उपयोग करें |
Thread.suspend()/resume() | हटाने के लिए | सिंक्रोनाइज़ेशन/लॉक्स का उपयोग करें |
System.runFinalizersOnExit() | हटाने के लिए | try-with-resources, Cleaner API |
SecurityManager (पूर्ण) | हटाने के लिए (Java 17) | अनुमति मॉडल, सैंडबॉक्सिंग |
Date(int, int, int) | अप्रचलित | LocalDate, Calendar |
String.getBytes() (नो-आर्ग) | अप्रचलित | getBytes(StandardCharsets.UTF_8) |
Collection.removeIf (कुछ ओवरलोड्स) | अप्रचलित | स्ट्रीम/लूप का उपयोग करें |
CI/CD एकीकरण
Maven
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jdeprscan-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<goals><goal>scan</goal></goals>
<configuration>
<forRemoval>true</forRemoval>
<release>17</release>
</configuration>
</execution>
</executions>
</plugin>
Gradle
task jdeprscan(type: Exec) {
commandLine 'jdeprscan', '--for-removal', '--release', '17',
'--class-path', configurations.runtimeClasspath.asPath,
"$buildDir/classes/java/main"
}
सीमाएं
- केवल Java SE API: थर्ड-पार्टी लाइब्रेरी अप्रचलन का पता नहीं लगाता
- स्थैतिक विश्लेषण: रनटाइम व्यवहार नहीं, केवल घोषित उपयोग
- निर्भरता समाधान: सभी निर्भर क्लासेस उपलब्ध होनी चाहिए (
--class-path)
- लापता क्लासेस: "cannot find class" त्रुटि लेकिन स्कैन जारी रहता है
@Deprecated ऑन कस्टम कोड: स्कैन नहीं करता (केवल JDK API)
jdeps के साथ तुलना
| विशेषता | jdeps | jdeprscan |
| उद्देश्य | निर्भरता विश्लेषण | अप्रचलित API स्कैनिंग |
| स्कोप | सभी निर्भरताएं (JDK + थर्ड-पार्टी) | केवल JDK API |
| JDK आंतरिक | --jdk-internals | --for-removal |
| आउटपुट | निर्भरता ग्राफ | अप्रचलित उपयोग सूची |
सारांश
jdeprscan JDK अप्रचलित API उपयोग के लिए आवश्यक स्थैतिक विश्लेषण टूल है
--for-removal का उपयोग तत्काल माइग्रेशन आवश्यकताओं की पहचान के लिए करें
--list --release N के साथ लक्ष्य JDK के लिए क्या अप्रचलित है खोजें
- बिल्ड पाइपलाइन में एकीकृत करें ताकि रिग्रेशन पकड़े जा सकें
- थर्ड-पार्टी अप्रचलन के लिए, लाइब्रेरी-विशिष्ट टूल्स या मैन्युअल समीक्षा का उपयोग करें