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