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

Java 9 में jdeprscan टूल का उपयोग: अप्रचलित API स्कैनिंग

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 के साथ तुलना

विशेषताjdepsjdeprscan
उद्देश्यनिर्भरता विश्लेषणअप्रचलित API स्कैनिंग
स्कोपसभी निर्भरताएं (JDK + थर्ड-पार्टी)केवल JDK API
JDK आंतरिक--jdk-internals--for-removal
आउटपुटनिर्भरता ग्राफअप्रचलित उपयोग सूची

सारांश

  • jdeprscan JDK अप्रचलित API उपयोग के लिए आवश्यक स्थैतिक विश्लेषण टूल है
  • --for-removal का उपयोग तत्काल माइग्रेशन आवश्यकताओं की पहचान के लिए करें
  • --list --release N के साथ लक्ष्य JDK के लिए क्या अप्रचलित है खोजें
  • बिल्ड पाइपलाइन में एकीकृत करें ताकि रिग्रेशन पकड़े जा सकें
  • थर्ड-पार्टी अप्रचलन के लिए, लाइब्रेरी-विशिष्ट टूल्स या मैन्युअल समीक्षा का उपयोग करें
  1. - जावा में ऑब्जेक्ट क्लोनिंग का उपयोग क्या है?

    ऑब्जेक्ट क्लोनिंग एक ऑब्जेक्ट की सटीक कॉपी बनाने का तरीका है। इस उद्देश्य के लिए, ऑब्जेक्ट क्लास के clone() मेथड का उपयोग ऑब्जेक्ट को क्लोन करने के लिए किया जाता है। जिस क्लास के ऑब्जेक्ट को क्लोन करना है, उसे Cloneable इंटरफेस को लागू करना होगा। यदि हम Cloneable इंटरफेस को लागू नहीं करते हैं, तो c

  1. - Java में StrictMath क्लास का उपयोग क्या है?

    java.lang.StrictMath एक फाइनल क्लास है और यह Object क्लास का एक सबक्लास है। StrictMath क्लास में बेसिक न्यूमेरिक ऑपरेशन करने के लिए मेथड्स होते हैं जैसे कि प्राथमिक एक्सपोनेंशियल, लॉगरिदम, स्क्वायर रूट, और ट्रिग्नोमेट्रिक फंक्शन्स। हमें StrictMath क्लास के लिए इंस्टेंस बनाने की आवश्यकता नहीं है क्यो

  1. Java में setBounds() विधि का उपयोग क्या है? Java में setBounds() विधि का उपयोग क्या है?

    लेआउट प्रबंधक जोड़े गए घटकों की स्थिति और आकार को स्वचालित रूप से तय करने के लिए उपयोग किए जाते हैं। लेआउट प्रबंधक की अनुपस्थिति में, घटकों की स्थिति और आकार को मैन्युअल रूप से सेट करना पड़ता है। ऐसी स्थिति में setBounds() विधि का उपयोग स्थिति और आकार सेट करने के लिए किया जाता है। घटकों की स्थिति औ