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>