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 Nombre de paquetages, métodes, interfaces Sources non commentés PMD 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 # de classes, d'interfaces et de package Couplage de classes 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 Basé sur POM (Project Object Model) Beaucoup d'extensions possibles Qualité de projet 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 DEBUG < INFO < WARN < ERROR < FATAL Propose différentes cibles Fichiers, consoles, GUI, sockets,... Possibilité de définir différentes Loggers 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 Modification de la hiérarchie, des noms de classes, de méthodes... Comment? Par rétro-compilation 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 Jar, Fichiers ressources, icones, Manfest Dépendances Vérification de l'environnement (Jvm, versions, extensions...) Comment? Outils Jar file, OSGi bundle, Jpackage InstallShield, SuperPimp, IZPack, Ant, RPM Java Plugin/Java Web Start
Licences Etat des lieux 50% d'utilisation illégale en Europe 95% en Asie, Amérique latine, Europe Pertes financières importantes Vérification software 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 Jython (jython.sourceforge.net Interpréteur de Bytecode Compilateur natif Permet de passer un.class en.c puis.exe Compilateur à la volée 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 Généralement 5% du bytecode occupe 96% du CPU On ne compile à la volée que ces sections Jikes RVM 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