Outils de développement pour Java Marc Christie LPMI

publicité
Outils de développement pour Java
Marc Christie
LPMI – Techniques de Développement
Plan
●
●
●
●
●
●
●
Documentation
Organisation de code
Deboggage
Précompilation et rétrocompilation
Ofuscation
Analyse de code
Analyses lexicales et grammaticales
Documentation
●
●
Javadoc (je ne vous apprends rien !)
Fonctionne par instrumentation du code
–
–
–
●
●
@author, @deprecated, @exception,@param
@see, @serial, @serialField,@serialData
@return, @link, @version, @since, @throws
Possibilité d'ajout de format HTML dans la
doc
Génère les formats HTML, XML, RTF,
LaTeX, Man, ...
Documentation
●
Exemple pour une classe
/**
* A class representing a window on the screen.
* For example:
* <pre>
* Window win = new Window(parent);
* win.show();
* </pre>
*
* @author Sami Shaio
* @version %I%, %G%
* @see
java.awt.BaseWindow
* @see
java.awt.Button
*/
class Window extends BaseWindow {
...
}
Documentation
Exemple pour un attribut de classe
●
/**
* The X-coordinate of the component.
*
* @see #getLocation()
*/
int x = 1263732;
Documentation
●
Exemple pour une méthode
/**
* Returns the character at the specified index. An index
* ranges from <code>0</code> to <code>length() - 1</code>.
*
* @param
index the index of the desired character.
* @return the desired character.
* @exception StringIndexOutOfRangeException
*
if the index is not in the range <code>0</code>
*
to <code>length()-1</code>.
* @see
java.lang.Character#charValue()
*/
public char charAt(int index) {
...
}
Normes de Programmation
●
●
●
●
Facilite la relecture des sources (80% de la durée de
vie d'un logiciel est consacré à la maintenance)
Il existe plusieurs normes, celle de SUN étant la
principale (java.sun.com/docs/codeconv)
Définit :
– Nom des classes, méthodes, attributs
– Organisation des structures de contrôle (itératives,
conditionnelles, exception)
Il existe des outils de vérification (CheckStyle)
Normes de Programmation
●
Exemple :
– Packetages en minuscule
– Classe MajusculePourLaPremiereLettreDeChaqueMot
– Interface MajusculePourLaPremiereLettreDeChaqueMot
– Méthodes minusculePourLaPremiereLettre()
– Constantes MAJUSCULES_AVEC_UNDERSCORE
– Variables minusculePourLaPremiereLettre
– Méthode de conversion vers X: X toX()
– Accesseur get : X getY()
– Accesseur set : void setY(X val)
Outil CheckStyle
●
Vérfie :
–
–
–
–
–
–
–
–
–
–
–
–
Conventions de nommage
Entetes
Imports
Commentaires Javadoc
Longueurs de structures, fichiers, méthodes, ...
Formattage du code (gestion des blancs)
Ordre des modificateurs (public, protected,...static...final...)
Formattage des accolades sur les blocs
Codage (pb d'initialisation, default switch, throws,
simplification d'expressions booléennes...)
Design de classes (visibilité, extension possible...)
Code dupliqué
Métriques (couplage de classes, nombre cyclomatique)
Portabilité
●
●
Identifie les problèmes de portabilité
(vérification des normes Java car les
compilateurs présentent des différences)
Outils :
–
●
JavaPureCheck (Sun)
Ouvrage Web
–
100% PureJava CookBook
●
●
Guide le développeur vers “a 100% compliance”
Donne des règles
Outils de reformatage & qualité
●
Reformatage
●
●
●
●
Jindent
Jalopy
Javastyle
Qualité : Métriques sur le code
●
JMetra
–
–
●
PMD
–
–
–
–
●
Nombre de paquetages, métodes, interfaces
Sources non commentés
Variables inutilisées, non initialisées
Blocs (catch, if, while) vides
Imports identiques multiples
Méthodes privées inutilisées
JDepend
Outil JDepend
●
Métriques classiques
–
●
Couplage de classes
–
–
●
# de classes, d'interfaces et de package
Couplage afferent (qui dépend de cette classe ?)
Couplage efferent (quelles classes dépendent
de cette classe ?)
Cycles de dépendances de classes
Jalopy
●
Outil paramétrable de reformatage de sources
(jalopy.sourceforge.net)
●
●
●
●
●
●
●
Gestion des accolades
Gestion des espaces
Indentation
Wrapping de lignes
Séparation de code
Autogénération de Javadoc (classes, méthodes,
arguments de méthodes)
Templates header (entête) et footer (bas de page)
Organisation
●
●
●
Make, gmake
Ant
Maven
–
–
Outil d'automatisation des tâches
Regroupe et automatise les “bonnes” pratiques :
●
●
●
–
–
–
Build, docs, reporting
Dépendences, Vesionning
Releases, Distributions
Créee une organisation uniforme des répertoires
Gère des informations de qualité sur le code
Propose toutes les cibles courantes
Outils de Tests
●
Tests unitaires
–
Junit
●
●
●
Automatise la tâche de tests
Suites de Tests
Tests de couverture
–
Clover (www.cenqua.com/clover) :
●
●
●
●
●
Couverture des tests unitaires : quelles sections de
code n'ont pas été couvertes par les tests ?
Donne une indication de la qualtié des tests
Reporting (PDF, HTML)
Intégration dans Eclipse, NetBeans, JBuilder ...
Extensions pour Maven et Ant
Outils de Tests
●
Tests de performance server en applications
réparties (tests d'intégration)
–
Cactus(jakarta.apache.org/cactus
●
●
●
●
Tests des Servlets, EJB, Tag Libs, Filters...
Facilite l'écriture et le reporting de tests
Intégration par plugin dans Ant, Maven, Eclipse
Tests d'applications Web
–
HttpUnit (httpunit.sourceforge.net)
●
●
Prend la place d'un browser
Maintien des sessions, cookies, ...
Maven
●
Un build uniforme
●
●
●
Qualité de projet
●
●
●
●
●
Basé sur POM (Project Object Model)
Beaucoup d'extensions possibles
Changelog
Mailing lists
Dépendences des jar
Tests unitaires et de couverture
Bonnes pratiques
● Tests maintenus à part des sources
● Conventions de nommage des tests
● Release Management et Tracking (bugs/features)
Organisation : Maven (1)
Fichier pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/mavenv4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Organisation : Maven(2)
●
●
●
●
●
●
●
Compilation : mvn compile
JAR : mvn jar
Tests : mvn test
Package : mvn package
Installation : mvn install
Nettoyage : mvn clean
Site Web : mvn site
Déboggage
●
Symbolique
–
–
–
●
Option de compilation: -g, -g:source,vars,lines
Accès en ligne de commande : jdb
Accès par des interfaces
Permet :
–
–
–
–
Pas à pas
Point d'arrêts (simples ou conditionnelles)
Exploration des structures de données
Traces (pile, mémoire, procédures ...)
Traces et Journalisation
●
Traces
–Principe
: instrumenter le code
–Mais ralentit l'execution
●
Journalisation
–Enregistrement
d'évènements dans un journal
–Outil Log4J, ObjectWeb MonoLog
Journalisation(1)
●
Log4J
–
Propose différents niveaux de logs
●
–
Propose différentes cibles
●
–
●
–
–
Fichiers, consoles, GUI, sockets, ...
Possibilité de définir différentes Loggers
●
–
DEBUG < INFO < WARN < ERROR < FATAL
Par classe, par package, par hiérarchie, par
fonctionnalité
Pratique pour du client/server (log client/log server)
Configuration à l'execution
Formatage des sorties
Faible surcoût à l'execution
Journalisation(2)
// cree un logger nommé "com.foo"
Logger logger = Logger.getLogger("com.foo");
logger.setLevel(Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
// affiché à l'écran car WARN >= INFO.
logger.warn("Low fuel level.");
// non affiché car DEBUG < INFO.
logger.debug("Starting search for nearest gas station.");
// herite des propriétés de com.foo
barlogger.info("Located nearest gas station.");
// non affiché car DEBUG < INFO.
barlogger.debug("Exiting gas station search");
Vérification(1)
●
Par assertion (une hypthèse qui doit être
vérifiée)
–
●
●
Ex : assert x >0 && x < MAX_VALUE
Vérification des pré/post conditions et des
invariants de boucle
Outils :
–
–
–
–
J2SE1.4
AssertMate
Icontract
JavaFAQ
Vérification(2)
●
Exemple :
int toto(int x) {
// precondition
assert x > 0 && x < MAX_VALUE;
... traitement ...
// postcondition
assert x > 0 && x < MAX_VALUE;
}
...
// invariant de classe, de boucle ...
assert balanced();
●
Activation :
–
java -ea:<class> -da:<class> main.class
Précompilation
●
Objectifs : à partir d'un seul fichiers source,
générer différents fichiers java
–
–
–
●
●
Avec trace/sans trace
Avec assertion/sans assertion
Avec optimisation/sans optimisation
Comment ? Directives de précompilation et
symboles #include, #define, #ifdef
Exemple : Mocha Source Obfuscator
Refactoring
●
Refactoring = réorganisation d'un ensemble
de sources
–
●
Comment? Par rétro-compilation
–
●
Modification de la hiérarchie, des noms de
classes, de méthodes ...
Génération d'un .java à partir d'un .class
(décompilation du bytecode)
Imaginez les risques industriels
–
Droits d'auteurs, piratage, espionnage industriel
Ofuscateur
●
●
Objectif : éviter la rétro-compilation
Comment ?
–
–
–
●
Brouillage des noms de classe/méthode/variable
Mélange des propriétés d'accès
Suppression de l'info de débuggage
Outils :
–
–
Décompilateurs : Javap, WingDis, NMI's code
viewer, JAD, DeCafe
Ofuscateurs : Mocha Source Ofuscator, Jmange,
...
Inspection de code
●
●
Objectifs : inspecter, transformer et générer
du bytecode
Comment ? L'AOP (Aspect Oriented
Programming)
–
–
●
Pose des points de coupe dans le
source/bytecode
Insère/remplace/supprime des trairements
Outils
–
AspectJ, JAC, AOP
Distributions & Installations
●
Objectifs : faciliter la création et l'installation
des packages
●
●
●
●
Comment ?
●
●
Jar, Fichiers ressources, icones, Manfest
Dépendances
Vérification de l'environnement (Jvm, versions,
extensions...)
Jar file, OSGi bundle, Jpackage
Outils
●
●
InstallShield, SuperPimp, IZPack, Ant, RPM
Java Plugin/Java Web Start
Licences
●
Etat des lieux
●
●
●
●
Vérification software
●
●
50% d'utilisation illégale en Europe
95% en Asie, Amérique latine, Europe
Pertes financières importantes
Utilisateur, société, adresse MAC et clé
Vérification hardware
●
Par dongle ou smartcard
Mesure de Performances
●
Outils :
●
Java – Xrunhprof
–
–
–
–
–
–
●
Profiling du tas (heap)
Usage CPU (temps, pourcentage du temps, et nbre d'appels
de toutes les méthodes)
Sorties fichiers
Threads...
Sortie sur fichier, socket, ...
Exemple : java -Xrunhprof:heap=dump,cpu=times,file=log.txt
JVMStat (java.sun.com/performance/jvmstat)
Optimisation des performances
●
Moteur de script Java
–
●
●
Interpréteur de Bytecode
Compilateur natif
–
●
Permet de passer un .class en .c puis .exe
Compilateur à la volée
–
●
Jython (jython.sourceforge.net
JIT (Just-In-Time)
Optimiseur HotSpot
–
–
Garbage collector
Inlining
Compilateur natif
●
●
●
●
●
Permet la transformation d'un fichier java en
code C
Très performant
Empreinte mémoire réduite (pr embarqué)
Evidemment dépendant de la cible
Outils :
–
–
–
GCJ (gcc.gnu/org/java)
www.towerj.com
sourceware.cygnus.com/java
Compilateur à la volée
●
●
Compilateur Just In Time (Symantec)
Comment ça marche ?
–
●
Compilation du bytecode vers le langage
machine puis exécution
Mais :
–
–
Consommation mémoire
Durée de compilation
Optimisation
●
HotSpot(tm)
–
Compilation à la volée des sections critiques
●
●
●
Jikes RVM
–
●
Généralement 5% du bytecode occupe 96% du CPU
On ne compile à la volée que ces sections
JVM écrite en Java
Benchmark sur les JVM
–
–
–
–
Sun,
Symantes,
IBM,
Kaffe
Analyse Lexicale et
grammaticale
●
●
Permet de faire un parser en Java à partir
d'une grammatire et d'action
Outils :
–
Analyse grammaticale (LALR)
●
●
●
●
–
JavaCC
AntLR
BYACC
QJJ
Analyse Lexicale
●
JavaLex
Bibliographie
●
●
●
●
Cours Didier DONSEZ
J. Shirazi “Java Performance Tuning”, Ed. Oreilly,
2000
R. Hightower, Nicholas Lesiecki, “Java Tools for
Extreme Programming: Mastering Open Source
Tools, including Ant, JUnit and Cactus”, Ed. Wiley,
2001
E. Burke, B. Coyner, “Java Extreme Programming
Cookbook”, Ed. Oreilly, 2003
Téléchargement