Showing posts with label ant. Show all posts
Showing posts with label ant. Show all posts

Friday, December 9, 2011

Ant classpath Tip #2 : afficher les problèmes de classpath à la compilation

Pour ce tip, on va s'appuyer sur une option non standard du compilateur Oracle : -Xlint:path
Elle permet d'afficher des warnings sur des éléments déclarés au classpath mais que le compilateur n'arrive pas à trouver et qui du coup ne sont pas pris en compte.

J'ai trouvé cette option utile au moins pour les 2 cas suivants :

  • on a un jar qui déclare des dépendances via le classpath de son fichier manifest, en particulier via des chemins relatifs
  • détection des erreurs dans les chemins menant à un répertoire ou un jar qu'on déclare au classpath


La mise en oeuvre avec Ant est très simple.

<javac srcdir="${src.dir}" destdir="${classes.dir}"> 
  <classpath refid="core.classpath" /> 
  <compilerarg value="-Xlint:path" /> 
<javac>



Ça m'a bien aidé dans un contexte weblogic où $WL_HOME/modules/features/weblogic.server.modules_10.0.2.0.jar ne contient aucune classe et ne référence que des dépendances. Dans mon cas, une des dépendances manquait suite à une suppression involontaire dans mon installation weblogic
Le coupable en gras dans le Manifest qui suit. Ouf!


Manifest-Version: 1.0 
Class-Path: weblogic.server.modules.L10N_10.0.2.0.jar ../com.bea.core. 
 antlr.runtime_2.7.5.jar ../org.apache.ant.patch_1.6.5.1.jar ../org.ap 
 ache.ant_1.6.5/lib/ant-all.jar ../com.bea.core.apache.bcel_5.2.0.0.ja 
 r ../com.bea.core.repackaged.apache.bcel_5.2.0.0.jar ../com.bea.core. 
 apache.commons.collections_3.2.0.jar ../com.bea.core.apache.commons.l 
 ang_2.1.0.jar ../com.bea.core.apache.commons.pool_1.3.0.jar ../com.be 
 a.core.apache.dom_1.0.0.0.jar ../com.bea.core.apache.logging_1.0.0.0. 
 jar ../org.apache.openjpa_1.0.0.1.jar ../com.bea.core.apache.xml.secu 
 rity_1.3.0.jar ../com.bea.core.xml.xmlbeans_2.3.1.0.jar ../com.bea.co 
 re.logging_1.0.2.0.jar ../com.bea.core.bea.opensaml_2.0.0.0.jar ../co 
 m.bea.core.xml.staxb.buildtime_1.0.2.0.jar ../com.bea.core.xml.staxb. 
 runtime_1.0.2.0.jar ../com.bea.core.annogen_1.0.2.0.jar ../com.bea.co 
 re.kodo_4.1.3.1.jar ../com.bea.core.kodo.integration_1.0.1.0.jar ../c 
 om.bea.core.kodo.integration.tools_1.0.1.0.jar ../com.bea.core.proces 
 s_5.3.0.0.jar ../com.bea.core.xml.beaxmlbeans_2.3.1.0.jar ../com.bea. 
 core.repackaged.aspectj.aspectjweaver_5.0.0.jar ../com.bea.core.repac 
 kaged.apache.commons.logging_1.1.0.jar ../com.bea.core.repackaged.spr 
 ingframework.spring_2.0.2.jar ../com.bea.core.repackaged.springframew 
 ork.pitchfork_1.0.0.jar ../com.bea.core.common.engine.impl_2.0.2.0.ja 
 r ../com.bea.core.common.engine.api_2.0.2.0.jar ../com.bea.core.commo 
 n.security.api_2.0.2.0.jar ../com.bea.core.common.security.impl_2.0.2 
 .0.jar ../com.bea.core.common.security.jdkutils_2.0.2.0.jar ../com.be 
 a.core.common.security.utils_2.0.2.0.jar ../com.bea.core.common.secur 
 ity.providers.utils_2.0.2.0.jar ../com.bea.core.common.security.provi 
 ders.env_2.0.2.0.jar ../com.bea.core.apache.commons.net_1.4.1.jar ../ 
 glassfish.el_1.0.1.0_2-1.jar ../glassfish.jaxb_1.0.2.0_2-0-5.jar ../g 
 lassfish.jaxws.resolver_2.0.1.jar ../glassfish.jaxws.rt_1.0.1.0_2-0-1 
 .jar ../glassfish.jaxws.saaj.impl_2.0.1.jar ../glassfish.jaxws.sjsxp_ 
 2.0.1.jar ../glassfish.jaxws.tools_1.0.1.0_2-0-1.jar ../glassfish.sta 
 x.ex_1.0.0.jar ../glassfish.xmlstreambuffer_0.1.117.jar ../com.bea.co 
 re.apache.oro_2.0.8.jar ../javax.activation_1.1.jar ../javax.annotati 
 on_1.0.jar ../javax.interceptor_1.0.jar ../javax.ejb_3.0.jar ../javax 
 .jdo_2.0.jar ../javax.enterprise.deploy_1.2.jar ../javax.jms_1.1.jar 
 ../javax.jsp_1.0.1.0_2-1.jar ../javax.jws_2.0.jar ../javax.mail_1.4.0 
 .2.jar ../javax.management.j2ee_1.0.jar ../javax.persistence_1.0.1.0_ 
 1-0.jar ../javax.resource_1.5.jar ../javax.servlet_1.0.1.0_2-5.jar .. 
 /javax.transaction_1.1.jar ../javax.xml.bind_2.0.jar ../javax.xml.soa 
 p_1.3.0.0.jar ../javax.xml.stream_1.0.1.0_1-0.jar ../javax.xml.ws_2.0 
 .jar ../javax.xml.rpc_1.1.jar ../com.bea.core.apache.log4j_1.2.13.jar 
  ../monfox.dsnmp.agent_1.0.1.0_4-6-5.jar ../com.bea.core.jsafe_3.5.0. 
 jar ../com.bea.core.serp_1.12.0.jar ../com.bea.core.apache_1.0.1.0.ja 
 r ../com.bea.core.beangen_1.0.2.0.jar ../com.bea.core.beaninfo_1.0.1. 
 0.jar ../com.bea.core.datasource_1.0.2.0.jar ../com.bea.core.descript 
 or_1.0.3.0.jar ../com.bea.core.repackaged.asm_1.5.2.jar ../com.bea.co 
 re.diagnostics.core_1.0.1.0.jar ../com.bea.core.diagnostics.instrumen 
 tor_1.0.1.0.jar ../com.bea.core.i18n_1.0.1.0.jar ../com.bea.core.i18n 
 .generator_1.0.1.0.jar ../com.bea.core.management.core_1.0.1.0.jar .. 
 /com.bea.core.mbean.maker_1.0.1.0.jar ../com.bea.core.mbean.support_1 
 .0.1.0.jar ../com.bea.core.messaging.kernel_1.0.2.0.jar ../com.bea.co 
 re.resourcepool_1.0.2.0.jar ../com.bea.core.weblogic.rmi.client_1.0.1 
 .0.jar ../com.bea.core.weblogic.security.wls_2.0.2.0.jar ../com.bea.c 
 ore.weblogic.saaj_1.0.2.0.jar ../com.bea.core.weblogic.stax_1.0.2.0.j 
 ar ../com.bea.core.store_1.0.2.0.jar ../com.bea.core.store.gxa_1.0.1. 
 0.jar ../com.bea.core.transaction_2.0.2.0.jar ../com.bea.core.utils.f 
 ull_1.0.2.0.jar ../com.bea.core.utils.classloaders_1.0.1.0.jar ../com 
 .bea.core.utils.expressions_1.0.1.0.jar ../com.bea.core.utils.wrapper 
 _1.0.1.0.jar ../com.bea.core.timers_1.0.2.0.jar ../com.bea.core.weblo 
 gic.workmanager_1.0.2.0.jar ../com.bea.core.workarea_1.0.1.0.jar ../c 
 om.bea.core.jatmi_1.0.1.2.jar ../com.bea.core.weblogic.security_2.0.2 
 .0.jar ../com.bea.core.nodemanager.plugin_1.0.1.0.jar ../com.bea.core 
 .jmspool_1.0.2.0.jar 
Feature-Name: weblogic.server.modules

Thursday, September 29, 2011

Ant classpath Tip #1 : afficher un classpath de manière lisible

Préambule : ces derniers mois, j'ai pas mal retravaillé avec Ant dans un contexte Weblogic. Je propose donc en commençant par ce post, une série de notes sur la problématique du classpath et de Ant



Supposons qu'on veuille afficher un classpath qu'on a précédemment défini dans Ant. Dans tout ce qui va suivre,  path.classpath.compile correspondra à l'identifiant du classpath qui doit être préalablement défini et qu'on veut afficher

On utilise habituellement quelque chose du genre :
<property name="echo.path.compile" refid="path.classpath.compile">
<echo level="info" message="${echo.path.compile}" /> 

Ce qui génère dans la console quelque chose du style (suivant l'os, le séparateur des éléments du classpath pourra être différent)


[echo] /tomcat/common/lib/jsp-api.jar:/tomcat/common/lib/ant.jar:/tomcat/common/lib/jmx.jar:/tomcat/common/lib/commons-collections-3.1.jar:/tomcat/common/lib/commons-dbcp-1.2.1.jar:/tomcat/common/lib/commons-el.jar:/tomcat/common/lib/commons-lang-2.1.jar:/tomcat/common/lib/commons-pool-1.2.jar:/tomcat/common/lib/tools.jar


C'est n'est vraiment pas très lisible, surtout dans le cas où on a beaucoup de jars (par exemple, avec l'ami Weblogic).
Du coup, ce serait par exemple plus clair d'avoir tous les éléments les uns en dessous des autres.


Cette problématique étant loin d'être nouvelle, je me suis complètement inspiré d'un post de 2005 intitulé  Pretty printing Java classpaths using Ant's pathconvert task qui détaille parfaitement la solution et sa mise en oeuvre.


Je reproduis ici telle quelle la solution proposée.

<!-- get the source compile classpath in a printable form -->
<pathconvert pathsep="${line.separator}|   |-- "
             property="echo.path.compile"
             refid="path.classpath.compile">
</pathconvert>


<echo message="|-- compile classpath"/>
<echo message="|   |"/>
<echo message="|   |-- ${echo.path.compile}"/>



[echo] |-- compile classpath
[echo] |   |
[echo] |   |-- /tomcat/common/lib/jsp-api.jar
[echo] |   |-- /tomcat/common/lib/ant.jar
[echo] |   |-- /tomcat/common/lib/jmx.jar
[echo] |   |-- /tomcat/common/lib/commons-collections-3.1.jar
[echo] |   |-- /tomcat/common/lib/commons-dbcp-1.2.1.jar
[echo] |   |-- /tomcat/common/lib/commons-el.jar
[echo] |   |-- /tomcat/common/lib/commons-lang-2.1.jar
[echo] |   |-- /tomcat/common/lib/commons-pool-1.2.jar
[echo] |   |-- /tomcat/common/lib/tools.jar
[echo] |   |-- ...

Si on souhaite factoriser cette technique pour l'utiliser à plusieurs endroits, on peut passer par un macrodef comme décrit dans un commentaire du même post que précédemment.