Classe manquante au déploiement
Par Cédric Tabin le samedi 20.07.2013, 19:00 - Java - Lien permanent
Je travaille sur un projet Java Enterprise Edition séparé en plusieurs modules. Il y a 2 projets directement lié à Java EE 6 (la partie business -ejb- et la partie interface -war-) et un troisième fournissant une API générique destinée à être utilisée par d'autres modules. Il arrive parfois, avec NetBeans d'avoir un NoClassDefFoundError au déploiement...
C'est un problème qui survient de manière aléatoire, du moins, je n'ai pas trouvé de procédure exacte pour le reproduire. Généralement, c'est suite à un clean & build sur le projet Java EE dans Netbeans que cela arrive.
Pour constater le souci, j'ai examiné le fichier EAR créé dont voici le résultat:
unzip -l dist/TBSRV.ear
Archive: dist/TBSRV.ear Length Date Time Name --------- ---------- ----- ---- 0 07-20-2013 18:46 META-INF/ 103 07-20-2013 18:46 META-INF/MANIFEST.MF 0 07-20-2013 18:46 lib/ 352017 07-20-2013 18:46 TBSRV-ejb.jar 22518 07-20-2013 18:46 TBSRV-war.war 0 07-20-2013 18:46 lib/TBSRV-apis.jar
La partie API (la dernière ligne) est un fichier avec une taille de 0 ! Mais évidemment, glassfish ne sort qu'une énorme stacktrace sans vraiment donner d'explication.
Après une analyse approfondie, il s'avère que le projet TBSRV-apis.jar est correctement compilé, mais que le fichier JAR n'est pas copié correctement lors de la création de l'EAR. J'ai fait plusieurs essais en ajoutant manuellement la librairie dans le projet Java EE et autre, sans succès.
Afin d'éviter cet écueil, j'ai simplement ajouter une target ANT qui permet de contrôler et de corriger cela de manière automatique:
<target name="check-apis"> <length property="apis.length" file="${build.dir}/lib/TBSRV-apis.jar" /> <if> <equals arg1="${apis.length}" arg2="0" /> <then> <echo>Build problem: TBSRV-apis.jar is an empty file: ${build.dir}/lib/TBSRV-apis.jar...</echo> <echo>The JAR will be copied from TBSRV-apis/dist and the EAR will be rebuilt.</echo> <copy file="TBSRV-apis/dist/TBSRV-apis.jar" todir="${build.dir}/lib" overwrite="true" /> <jar destfile="${dist.jar}" basedir="${build.dir}" /> </then> </if> </target>