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)
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).
W folderze lib znajduje się biblioteka Apache Derby: derby.jar.
Użycie jdeprscan
Użycie jdeprscan
przedstawia Rys. 3.
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(); }
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ędziajdeprscan
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ń.