Zielony Smok - logo witryny

jdeprscan (narzędzie JDK)

Narzędzie używane do statycznej analizy klas, archiwów i folderów na obecność elementów API oznaczonych jako deprecated.

Co to znaczy deprecated dowiesz się tutaj: Co to znaczy ‘deprecated’?. Narzędzie wykrywa tylko elementy oznaczone jako deprecated w Java SE. Nie
wykrywa tak oznaczonych elementów w innych bibliotekach. Wszystkie klasy, od których zależy badana klasa czy zestaw klas – muszą być dostępne – podobnie jak przy kompilowaniu czy uruchamianiu klasy. W przypadku braku klas zależnych narzędzie podaje listę niedostępnych klas poprzedzonych słowem error:

error: cannot find class ...

Składnia

jdeprscan [options] {dir|jar|class}

[options]

[options] Opis
--class-path path Scieżka wyszukiwania niezbędnych klas. Jeśli chcemy wskazać więcej niż jedną ścieżkę – ścieżki oddzielone są
średnikiem ; (w Windows) albo dwukropkiem : (Solaris, Linux, macOS)
(--class-path \some\directory;\another\different\dir). Jeśli chcesz wiedzieć
więcej zajrzyj do Co to jest CLASSPATH?
--for-removal Ogranicza skanowanie do API, które są oznaczone słowem deprecated i przeznaczone do uusnięcia w przyszłości.
Nie może być użyte w Java 6, 7, 8. Może być użyte w Java 9, 10, 11, 12
--full-version Wypisuje na konsoli pełny opis narzędzia
--help albo -h Wypisuje na konsoli pełną informację pomocy
--list albo -l Wyświetla na konsoli zestaw API oznaczonych jako deprecated
--release 7|8|9|10|11|12 Ogranicza wyszukiwanie do API, które były oznaczone deprecated w podanej wersji Java
--verbose albo -v Udostępnia wydruk dodatkowych informacji podczas przetwarzania
--version Wyświetla skróconą nazwę tego narzędzia

{dir|jar|class}

{dir|jar|class} Opis
dir folder
jar archiwum
class nazwa klasy lub pliku klasy
Nazwa klasy powinna być pełna (java.lang.Thread)
Nazwa klasy zagnieżdżonej powinna byc poprzedzona znakiem dolara $ (java.lang.Thread$State)
Nazwa pliku powinna obejmować ścieżkę (build/classes/java/lang/Thread$state.class)

Przykład (linia poleceń)

Mamy dwa projekty Netbeans 8.2 (Rys. 1)

jdeprscan
Rys. 1. Układ projektów Netbeans

Projekt jdeprscan1 zawiera 3 klasy. Nie ma klasy uruchamiającej.

Projekt jdeprscan2 wymaga obecności bibliotek Apache Derby. Klasa R007 zawiera metodę main.

Z trzech bibliotek derby.jar, derbyclient.jar oraz derby.net potrzebna jest jedynie pierwsza biblioteka.

Pliki do ściągnięcia: jdeprscan1 oraz jdeprscan2

Pliki archiwów jdeprscan1.jar oraz jdeprscan2.jar oraz biblioteki umieszczamy na dysku w folderze c:/assets/jdeprscan (Rys. 2).

jdeprscan
Rys. 2. Archiwa i foldery w folderze jdeprscan1

W folderze lib znajduje się biblioteka Apache Derby: derby.jar.

Użycie jdeprscan

Użycie jdeprscan przedstawia Rys. 3.

jdeprscan
Rys. 3. Użycie narzędzia jdeprscan – przykład 1

W przypadku badania zgodności z Java 8 otrzymujemy informację, o braku klasy, która pojawiła się dopiero w Java 9 – nie
jest obecna w pliku *.java, ale jest użyta w pliku *.class.

W Java 11 i 12 otrzymujemy informację o niewłaściwym użyciu konstruktora klasy Double, w klasie Vector2
i Polar. Zamiast nazwy metody jest <init>, co oznacza konstruktor.

Pojawienie się oznaczenia <clinit> oznaczałoby inicjalizator klasy statycznej.

(D)V oznacza odpowiednio listę argumentów – w tym przypadku double oraz typ zwracany (V) – w tym wypadku

void. Podwojone (II) oznaczałoby dwa argumenty typu int.

 @Override
    public int hashCode() {
        return 17 * new Double(x).hashCode() + 19 * new Double(y).hashCode();
    }

powinno być poprawione na:

 @Override
    public int hashCode() {
        return 17 * Double.valueOf(x).hashCode() + 19 * Double.valueOf(y).hashCode();
    }
jdeprscan
Rys. 4. Użycie narzędzia jdeprscan – przykład 2

W tym wypadku musimy wskazać obecność biblioteki derby.jar.

Można to uczynić na 3 sposoby:

  • Umieścić informację o położeniu pliku *.jar zmiennej środowiskowej CLASSPATH np. “.;C:\jtools08\lib\derby.jar;
  • Umieścić wpis --class-path \lib w wierszu poleceń przy wywołaniu narzędzia jdeprscan
    jak na Rys. 4
  • Umieścić informację w pliku META-INF\MANIFEST.MF w badanym pliku *.jar jak na poniższym zrzucie
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.7
Created-By: 1.8.0_221-b11 (Oracle Corporation)
Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: jdeprscan2.R007

Przykład (ToolProvider)

W przypadku tego narzedzia Oracle nie przewiduje uruchamiania przy użyciu klasy dziedziczącej po
ToolProvider

Przykład (ProcessBuilder)

Polecenie możemy wykonać z poziomu klasy Java (jdeprscan.PB_jdeprscan)

package jdeprscan;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PB_jdeprscan {
    public static void main(String[] args){
        try {
            ProcessBuilder pb = new ProcessBuilder();
            pb.command("jdeprscan", "--release", "8", "--class-path", "\\lib",
                    "C:/assets/jdeprscan/jdeprscan2.jar");
            pb.redirectError(ProcessBuilder.Redirect.INHERIT);
            Process p = pb.start();
            BufferedReader r = p.inputReader();
            String line;
            while ((line = r.readLine()) != null) {
                System.out.println(line);
            }
          int exitCode = p.waitFor();
           System.out.println("\nExited with code : " + exitCode);
            r.close();
            p.destroy();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Wynik wykonania jest dokładnie identyczny jak w przykładzie użycia przy pomocy linii poleceń.