MokaByte Numero 23 - Ottobre 1998  


di
Lorenzo Bettini
  Java tools

gli strumenti del jdk

Questa vuole essere una breve rassegna dei tool presenti nel jdk


Introduzione

Uno dei vantaggi di Java, che forse ha contribuito alla sua immensa diffusione sia in ambito commerciale che in ambito universitario, è senz'altro la disponibilità gratuita del kit per la programmazione: non è necessario acquistare costosi programmi con immensi ambienti di sviluppo per scrivere applicazioni; non si parla di applicazioni semplici e banali, ma anche applicazioni di un certo livello. E' anche vero che avere dei tool per la programmazione visuale non guasterebbe, tuttavia il kit gratuito di Java è già sufficiente per poter programmare discretamente, e, col succedersi delle varie versioni, si arricchisce sempre più di varie utilità.

Il kit in questione è scaricabile gratuitamente da Internet presso il sito della Sun o presso uno dei tanti mirror sparsi in tutto il mondo; fra questi ve ne sono molti di carattere universitario, ed in questo modo non diventa proibitivo per il povero studente scaricarsi diversi Mega di programmi.

Il kit è in questione è appunto il JDK, che sta per giungere alla versione 1.2 (fino ad adesso la 1.2 è ancora in fase di beta); già dalle prime versioni di qualche anno fa, questo pacchetto comprendeva diversi tool interessanti ed utili.

Senz'altro i più conosciuti sono:

Ma la lista dei tool disponibili non finisce qui, anche se questi sono i più utilizzati...

jar-The Java Archive Tool

Questo tool permette di memorizzare in uno stesso archivio (detto appunto archivio JAR) diversi file. In realtà JAR è un tool di archiviazione e compressione general-purpose, che utilizza il formato di compressione ZIP e ZLIB, anche se è nato con lo scopo di memorizzare in uno stesso file più classi Java (i file .class) che costituiscono un'applet o un'applicazione, insieme ai vari file grafici, sonori, o altri archivi utili alle applet o alle applicazioni. Poiché Java è nato per le applicazioni distribuite ed anche per inserire applicazioni nelle pagine web (applet), memorizzando tutto in un unico archivio, l'applicazione può essere scaricata con una sola transazione HTTP, ottenendo così successivamente un'esecuzione che non richiede più accessi alla rete per il recupero dei dati dell'applet.

Inoltre utilizzando questi file archivio, è possibile applicare una firma digitale all'applet in modo che si possa risalire all'autore, e, se quest'ultimo è fidato, concedere all'applet più diritti di quanti di solito le sono concessi (a causa di problemi di sicurezza e protezione).

La sintassi di JAR non si discosta molto dal comando tar in ambiente Unix, che in pratica svolge le stesse mansioni:

jar cf myjarfile *.class 

L'opzione c sta per create ed f per file; in questo modo si memorizzano nel file myjarfile tutti i file con estensione .class. Per estrarre i file si utilizzerà l'opzione x (extract), mentre se si vuole solo ottenere a schermo la lista dei file contenuti nell'archivio si potrà utilizzare l'opzione t. Ad esempio

jar xf myjarfile

Estrae i file contenuto nell'archivio specificato.

Come già accennato queste opzioni sono identiche a quelle del comando Unix tar; una differenza con quest'ultimo comando è che mentre in tar quando si crea un file non viene applicata di default nessuna compressione, in jar, i file vengono memorizzati in formato compresso, se si vuole evitare che questo avvenga (cioè se si vuole solo effettuare uno store dei file nell'archivio si dovrà specificare in fase di creazione dell'archivio l'opzione -O. Specificando anche v si esegue il comando in modalità verbose, cioè si ottiene l'output di tutto quello che viene memorizzato (o estratto).

jarsigner - JAR Signing and Verification Tool

Come accennato è possibile firmare digitalmente i file jar; questo è possibile tramite questo tool: jarsigner. In questo modo è possibile:

  1. Firmare i file JAR
  2. Verificare la firma e l'integrità di un file JAR

Una firma digitale è una stringa di bit che viene calcolata tramite i dati che vengono firmati e tramite la chiave privata della persona o della compagnia che ha realizzato l'applicazione; questa può essere verificata tramite la chiave pubblica, distribuita dall'entità che ha posto la firma; in questo modo solo chi ha la chiave privata può effettuare la firma, ma tutti quelli che hanno la chiave pubblica la possono verificare.

L'utilizzo di questo comando è un po' più complesso e richiederebbe molto più spazio, e quindi si rimanda alla documentazione in linea del jdk.

javadoc - The Java API Documentation Generator

Spesso quando si effettua il browsing della documentazione ufficiale di Java, o comunque di una libreria Java di un certo livello, si nota che lo stile è alquanto uniforme.

Si tenga presente che la documentazione di una libreria è molto importante, ma mantenere sincronizzate la libreria con la documentazione può essere spesso molto faticoso, e non sono rari errori di allineamento. La cosa ideale sarebbe quella di scrivere la documentazione direttamente nei sorgenti, ma dopo si dovrebbero distribuire i sorgenti, o comunque, anche se questo può non rappresentare un problema per il programmatore, lo può rappresentare per l'utente che deve andare direttamente nei sorgenti della libreria per cercare di capire a cosa serve una certa funzione.

Questo tool, javadoc, basandosi su una certa convenzione sulla scrittura dei commenti in un programma, genera automaticamente la documentazione in formato html, settando ovviamente anche i link all'interno dei file; si potrà così ottenere lo stesso look della documentazione Java, e senz'altro l'applicazione o la libreria assumerà un certo livello professionale.

I commenti riconosciuti da javadoc hanno il seguente formato

/**
* Questo è un commento <b>doc</b>.
*/

Notare che è possibile utilizzare i tag standard dell'HTML (tranne alcuni, come quelli degli header). Vi sono poi dei tag particolari interpretati da javadoc che permettono di realizzare documentazione come quella del jdk. Per una trattazione completa si rimanda alla documentazione ufficiale, comunque vale la pena di vedere qualche esempio:

/**
* Classe Window (finestra).
* esempio:
* <pre>
* Window win = new Window(parent);
* win.show();
* </pre>
*
* @author Lorenzo Bettini
* @version %I%, %G%
* @see java.awt.BaseWindow
* @see java.awt.Button
*/
class Window extends BaseWindow {
	...
}

I campi introdotti dovrebbero essere abbastanza auto esplicativi, e rispecchiano la documentazione che siamo abituati a leggere. Vale la pena di notare i tag @see che permettono di introdurre automaticamente dei link ad altre classi.

Se si vogliono commentare dei membri della classe si scriverà qualcosa di simile:

/**
* Coordinata x della finestra.
*
* @see window#1
*/
int x = 1263732;

E se si vuole commentare un metodo:

/**
* Restituisce il carattere all'indice specificato. L'indice 
* va da <code>0</code> a <code>length() - 1</code>.
*
* @param index l'indice del carattere.
* @return il carattere richiesto.
* @exception StringIndexOutOfRangeException 
* Se l'indice non è nel range <code>0</code> 
* to <code>length()-1</code>.
* @see java.lang.Character#charValue()
*/
public char charAt(int index) {
	...
}

Per produrre la documentazione in html si dovrà utilizzare il comando javadoc; vediamo un esempio di utilizzo; supponiamo che i file .java siano nella directory C:\ws\src\java\awt\*java e che la directory di destinazione sia C:\ws\html. Il comando da lanciare è

cd C:\ws\src\
javadoc -d C:\ws\html java.awt java.awt.event

In questo modo si genera la documentazione html per le classi pubbliche nei package java.awt and java.awt.event inserendola nella directory di destinazione C:\ws\html.

Se invece si vogliono documentare singole classi:

cd C:\ws\src\java\awt
javadoc -d C:\ws\html Button.java Canvas.java

javap - The Java Class File Disassembler

Questo comando effettua il disassembling dei file .class. Se non sono specificate ulteriori opzioni (si veda la documentazione ufficiale) il comando javap stampa sullo standard output i campi ed i metodi pubblici della classe passata; ad esempio se si è compilata la seguente classe

import java.awt.*;
import java.applet.*;

public class DocFooter extends Applet {
	String date;
	String email;
	public void init() {
		resize(500,100);
		date = getParameter("LAST_UPDATED");
		email = getParameter("EMAIL");
	}
	public void paint(Graphics g) {
		g.drawString(date + " by ",100, 15);
		g.drawString(email,290,15);
	}
}

L'output del comando

javap DocFooter 

darà in output:

Compiled from DocFooter.java
public class DocFooter extends java.applet.Applet {
	java.lang.String date;
	java.lang.String email;
	public void init();
	public void paint(java.awt.Graphics);
	public DocFooter();
}

javah - C Header and Stub File Generator

Questo comando genera un header C ed i file sorgenti necessari per implementare metodi nativi; i file generati (header e programmi C) potranno essere utilizzati dai programmi C per riferirsi alle variabili di un certo oggetto all'interno del codice nativo.

In particolare il file .h contiene una definizione di struct che rappresenta il layout della classe corrispondente, ed i campi della struttura corrispondono alle variabili istanza della classe.

native2ascii - Native-to-ASCII Converter

Questo comando torna comodo quando si prendono file che contengono caratteri non standard, o dovuti al passaggio da un sistema operativo ad un altro: converte un file con caratteri native-encoded (caratteri che non sono non-Latin 1 e non-Unicode) in uno che contiene caratteri Unicode-encoded.

Questo comando è spesso necessario, oltre che utile, in quanto il compilatore Java e gli altri tool sono in grado di processore solo file che contengono caratteri Latin-1 e/o Unicode-encoded (notazione \udddd). Con questo tool si ovvia a problemi che possono insorgere nel caso si debbano utilizzare questi file con caratteri non standard.

Conclusioni

Si è voluto semplicemente fare una rapida carrellata sui tool che sono inclusi nella versione standard del jdk; tutti questi tool sono ovviamente documentati nella documentazione ufficiale, tuttavia a volte se ne ignora l'esistenza...

Si è volutamente escluso da questa trattazione tutti quei tool per utilizzare l'RMI (Remote Method Interface), in quanto l'argomento è già stato trattato su MokaByte, e quelli inclusi nell'ultime versioni del jdk per utilizzare la tecnologia CORBA (anche questo argomento è e sarà trattato su MokaByte).

E' inoltre presente un altro tool molto importante per la programmazione: il debugger. Anche il jdk include un debugger, il jdb. L'utilizzo di questo debugger non è molto immediato soprattutto se si è abituati ai vari debugger visuali presenti negli IDE di tutti i compilatori visuali e non.

Probabilmente si analizzerà questo tool in un articolo a parte.

A presto :-)

Lorenzo Bettini