7
votes

Findbugs refuse de trouver BCEL JAR sur CLASSPATH

Pour la vie de moi, j'essaie d'obtenir des Findbugs (2.0.1) pour fonctionner dans le cadre de ma construction de ligne de commande. J'ai téléchargé le jar Findbugs et l'extrait à /home/myuser/java/repo/umd/finindbugs/2.0.1/findbugs-2.0.1:

 Entrez la description de l'image ici p>

Comme vous pouvez le voir dans la capture d'écran, sous /home/myuser/java/repo/umd/finindbugs/2.0.1/findbugs- 2.0.1 / LIB Il y a un pot appelé bcel-1.0.jar code>, et si vous l'ouvrez, vous pouvez voir que j'ai foré à une classe appelée org.apache.bel. Classfile.classformatExceptionXception code>. Tenez cette pensée. P>

J'ai ensuite copié /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib/finindbugs-ant.jar à $ {env.ant_home } / lib pour le rendre accessible à la version de la fourmi qui est dirigé à partir de la ligne de commande (au lieu de l'instance de fourmis qui est intégrée à Eclipse). p>

Ma structure de répertoire de projet est la suivante: xxx pré>

intérieur build.xml code>: p> xxx pré>

mais quand je cours ant - buildfile build.xml echomsg code> à partir de la ligne de commande, je reçois une erreur dans Findbugs: p>

run-findbugs:
    [echo] Creating gen/staging/myapp-build-findbugs-temp.jar for FindBugs.
    [jar] Building jar: /home/myuser/sandbox/workbench/eclipse/workspace/myapp/gen/staging/myapp-build-findbugs-temp.jar
    [echo] Conducting code quality tests with FindBugs.
[fb:findbugs] Executing findbugs from ant task
[fb:findbugs] Running FindBugs...
[fb:findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
[fb:findbugs] Caused by: java.lang.ClassNotFoundException: org.apache.bcel.classfile.ClassFormatException
[fb:findbugs]   at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
[fb:findbugs]   at java.security.AccessController.doPrivileged(Native Method)
[fb:findbugs]   at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
[fb:findbugs]   at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
[fb:findbugs]   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[fb:findbugs]   at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
[fb:findbugs] Could not find the main class: edu.umd.cs.findbugs.FindBugs2.  Program will exit.
[fb:findbugs] Java Result: 1
[fb:findbugs] Output saved to gen/audits/qual/findbugs.html

echoMsg:
    [echo] The build is still alive!!!


6 Réponses :


1
votes

Je suppose que vous avez réellement BCEL dans la classe de classe deux fois. Et le fichier est chargé du pot en dehors de la bibliothèque Findbugs. Ensuite, lorsque Findbugs essaie de charger le pot, il trouve le BCEL dans la bibliothèque FindBugs et ne peut pas le charger, car il est déjà chargé.

La solution serait de trouver où d'autre BCEc existe dans la classe de classe et supprimez-la.


3 commentaires

C'est une excellente suggestion @Zagrev (+1) Je vais essayer d'essayer quelques minutes ici. Juste hors de curiosité, qu'est-ce qui vous a fait soupçonner cela pour être le cas? Je demande seulement parce que je n'en aurais pas pensé dans 1 000 ans et ça a du sens! (J'ai définitivement ajouté ce pot ailleurs ailleurs ...)


Expérience horrible et horrible :)


Eh bien, cela a fallu un moment, mais j'ai traversé tous les fichiers de jar sous ant_home / lib ainsi que dans mon répertoire de base Findbugs, et que bcel-1.0.jar est Le bocal seulement contenant cette classe. Toute autre idée ?? Merci encore!



1
votes

Vous devrez peut-être avoir à définir un AuxClassPath pour inclure le point de classe que votre code> utilisée lors de la compilation de vos fichiers de classe.

Vous ne montrez pas comment la compilée a eu lieu, alors je Je suppose que votre référence a créé un compile.classapath code> de classePath Référence: P>

<javac destdir="gen/bin/main"
   srcdir="src/main/java"
   classpathref="compile.classpath"/>

<fb:findbugs home="/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1"
    output="html" outputFile="gen/audits/qual/findbugs.html" stylesheet="fancy-hist.xsl" failOnError="true">
    <auxClasspath refid="compile.classpath"/>
    <sourcePath refid="findbugs.source.path"/>
    <class location="${fb.tmp.jar}"/>
</fb:findbugs>


2 commentaires

Merci @david W. (+1) - Ajout du AuxClassPath et toujours la même erreur. J'ai vraiment l'impression que Zagagev aurait pu être sur quelque chose avec l'idée de Jar en double, mais je ne peux pas sembler le trouver. Je me demande, y a-t-il un outil là-bas que je pourrais pointer mon Ant_Home / Lib Annuaire et avoir imprimer une liste de chaque classe Java à l'intérieur de chaque bocal dans ce répertoire? De cette façon, je pourrais scanner la sortie pour des classes de BCEcle en double.


@pnongrata "S est un outil là-bas que je pourrais pointer mon Ant_Home / Lib Annuaire vers et d'imprimer une liste de chaque classe Java à l'intérieur de chaque bocal dans ce répertoire?" Jetez un coup d'oeil chez TATINE TALE de JBoss .



3
votes

Vous pouvez déboguer lorsque BCEL est chargé d'utiliser l'argument -verbose: argument de classe à la JVM.

Pour transmettre cet argument à la JVM Exécuter lesbugs, utilisez le drapeau JVMargs sur le plug-in Trouver Bugs

jvmargs

Attribut facultatif. Il spécifie les arguments qui devraient être passé à la machine virtuelle Java utilisée pour exécuter des tremblements de recherche. Tu pourrais avoir besoin de Pour utiliser cet attribut pour spécifier des indicateurs pour augmenter la quantité de Mémoire La JVM peut utiliser si vous analyse un très grand programme.

Comment avez-vous peuplé la recherche de Bugs Lib Jar? Quand je télécharge que Findbugsts.zip, je reçois un annuaire libéré qui a l'air très différent de ce que vous montrez. En particulier, le mien contient un BCEC avec une version de 5.3, pas 1,0 comme vous le montre.


2 commentaires

Merci @sbridges je vais vérifier - et j'utilise une fourchette 1.8.4


Je pense que vous avez la mauvaise version BCEL. Si je télécharge le téléchargement de Findbugs 2.0.1.zip, la BCEL informatique inclut est 5.0.3



1
votes

Je ne vois pas de votre script de fourmis que BCEC atterrit sur n'importe quel plan de classe que la tâche Findbugs serait capable de le charger. Vous voudrez peut-être essayer de faire explicitement votre tâche d'inclure explicitement toutes les besoins de Findbugs.

<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
    uri="antlib:edu.umd.cs.findbugs">
  <classpath>
    <fileset dir="/home/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1">
      <include name="*.jar"/>
    </fileset>
  </classpath>
</taskdef>


0 commentaires

1
votes

chose drôle parce que j'utilise la même version de Findbugs et le fichier JAR est nommé bcel.jar pas bcel-1.0.jar . Je suis également en cours d'exécution dans un script ant . Aussi fou que cela puisse sonner, essayez de télécharger à nouveau les tremblements Findbugs, décompressez-la à la place de votre actuel et exécutez votre script une fois de nouveau.


0 commentaires

0
votes

La plupart des problèmes de classe de classe que vous pouvez déboguer avec hochette . Cela vous rendra compte de tous les bocaux de votre projet. Toutes les classes dupliquées, etc. m'ont sauvé beaucoup de temps.

Il y a aussi une tâche de fourmis prête: http: / /docs.jboss.org/tattletale/userguide/1.2/fr-us/html/ant.html


0 commentaires