web-dev-qa-db-fra.com

Ant, Tomcat Build Erreur: Java.lang.NoClassDefFoundError: org/Apache/Tomcat/util/buf/B2CConverter

Version Tomcat: 7.0.20

Je tente de parcourir le didacticiel suivant Spring MVC: http://static.springsource.org/docs/Spring-MVC-step-by-step/part1.html

Dans ce tutoriel, un script de construction ant est configuré pour être déployé sur Tomcat à l'aide du gestionnaire. Cependant, je rencontre des problèmes lorsque j'essaie d'exécuter l'une des tâches de Tomcat.

Tout d'abord, dans le tutoriel, ils utilisent toujours org.Apache.catalina.ant.InstallTask qui est obsolète, alors j'ai changé pour org.Apache.catalina.ant.DeployTask.

Maintenant, le problème est que lorsque j'essaie d'exécuter les tâches Tomcat, je reçois:

Java.lang.NoClassDefFoundError: org/Apache/Tomcat/util/buf/B2CConverter
    at org.Apache.catalina.util.Base64.encode(Base64.Java:177)
    at org.Apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.Java:204)
    at org.Apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.Java:150)
    at org.Apache.catalina.ant.ReloadTask.execute(ReloadTask.Java:45)
    at org.Apache.tools.ant.UnknownElement.execute(UnknownElement.Java:291)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.Java:106)
    at org.Apache.tools.ant.Task.perform(Task.Java:348)
    at org.Apache.tools.ant.Target.execute(Target.Java:390)
    at org.Apache.tools.ant.Target.performTasks(Target.Java:411)
    at org.Apache.tools.ant.Project.executeSortedTargets(Project.Java:1399)
    at org.Apache.tools.ant.Project.executeTarget(Project.Java:1368)
    at org.Apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.Java:41)
    at org.Apache.tools.ant.Project.executeTargets(Project.Java:1251)
    at org.Apache.tools.ant.Main.runBuild(Main.Java:809)
    at org.Apache.tools.ant.Main.startAnt(Main.Java:217)
    at org.Apache.tools.ant.launch.Launcher.run(Launcher.Java:280)
    at org.Apache.tools.ant.launch.Launcher.main(Launcher.Java:109)
 Caused by: Java.lang.ClassNotFoundException: org.Apache.Tomcat.util.buf.B2CConverter
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:306)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:247)
    ... 21 more

J'ai donc cherché un article dans Google et trouvé des informations indiquant que Tomcat-utils.jar devrait figurer dans le chemin de la classe; j'ai donc ajouté cela dans le jeu de fichiers contenant catalina-ant.jar, mais apparemment, la classe org.Apache.Tomcat.util.buf.B2CConverter ne s'y trouve pas.

Alors ensuite, j'ai commencé à sonder les pots avec jar -tf pour savoir si certains d'entre eux contenaient la classe. J'ai découvert que Tomcat-coyote.jar avait la classe. Même en incluant ceci dans le groupe de fichiers, le problème n'est pas résolu.

Quelqu'un a-t-il une idée?

32
Jason Turner

J'ai eu ce travail en changeant le classpath à

<path id="catalina-ant-classpath">
    <!-- We need the Catalina jars for Tomcat -->
    <!--  * for other app servers - check the docs --> 
    <fileset dir="${appserver.lib}">
        <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
    </fileset>
    <fileset dir="${appserver.home}/bin">
                <include name="Tomcat-juli.jar"/>
    </fileset>
</path>
29
Aidan Skinner

Comme Jason, j'ai essayé la réponse de Aidan et cela n'a pas fonctionné. Avec Tomcat 7, l'interface de gestion a un peu changé. Au lieu d'utiliser/manager/list dans l'URL, vous devez utiliser/manager/text/list. J'ai donc modifié la tâche de liste dans build.xml comme suit:

<target name="list" description="List Tomcat applications">
    <list url="${Tomcat.manager.url}/text"
             username="${Tomcat.manager.username}"
             password="${Tomcat.manager.password}"/>
</target>

J'ai également dû ajouter le rôle "manager-script" à mon utilisateur administrateur pour qu'il dispose des privilèges appropriés pour cette opération:

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <user username="admin" password="admin" roles="manager-gui,manager-script"/>
15
wholladay

J'ai trouvé la même erreur en suivant le même tutoriel .J'ai dû faire 3 changements pour que les cibles fonctionnent correctement.

Commencez par changer la cible "liste" build.xml pour ajouter le/texte mentionné ci-dessus:

<target name="list" description="List Tomcat applications">
    <list url="${Tomcat.manager.url}/text"
          username="${Tomcat.manager.username}"
          password="${Tomcat.manager.password}"/>
</target>

Deuxièmement, changez le classpath de catalina ant:

<path id="catalina-ant-classpath">
    <fileset dir="${appserver.home}/lib">
        <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
    </fileset>
    <fileset dir="${appserver.home}/bin">
        <include name="Tomcat-juli.jar"/>
    </fileset>
</path>

Et enfin, ajoutez ceci au fichier Tomcat-users.xml:

<role rolename="manager-script"/>
  <user username="Tomcat" password="s3cret" roles="manager-gui,Tomcat,manager-script"/>

Et puis ça a marché pour moi =)

12
Neets

Afin que toutes les commandes ant fonctionnent, l'URL du gestionnaire peut être modifiée dans le fichier build.properties au lieu de changer l'URL lors de la définition de la cible "list" dans le fichier build.xml.

Tomcat.manager.url=http://localhost:8080/manager/text
3
Liz

Cela semblait fonctionner pour moi (Tomcat 7.0.21, OS X):

<path id="catalina-ant-classpath">
  <fileset dir="${Tomcat_dir}/lib">
    <include name="catalina-ant.jar"/>
    <include name="Tomcat-coyote.jar"/>
    <include name="Tomcat-util.jar"/>
  </fileset>
  <fileset dir="${Tomcat_dir}/bin">
    <include name="Tomcat-juli.jar"/>
  </fileset>
</path>
<taskdef name="deploy" classname="org.Apache.catalina.ant.DeployTask" classpathref="catalina-ant-classpath"/>
<taskdef name="undeploy" classname="org.Apache.catalina.ant.UndeployTask" classpathref="catalina-ant-classpath"/>
<taskdef name="list" classname="org.Apache.catalina.ant.ListTask" classpathref="catalina-ant-classpath"/>
3
napu

Jetez également un coup d’œil à mon article sur Catalina-Ant pour Tomcat 7 ici:

http://paulgrenyer.blogspot.co.uk/2011/11/catalina-ant-for-Tomcat-7.html

2
Paul Grenyer

ce qui a fonctionné pour moi a été d'ajouter les quatre fichiers jar au chemin de génération

Exécuter -> Exécuter la configuration -> Choisissez votre programme, sélectionnez l’onglet Chemin de classe à droite, cliquez sur Entrées utilisateur, puis ajoutez 4 fichiers JAR externes à partir du répertoire Tomcat.

Après cela, mon build.xml fonctionne comme avant

1
Alfus yang

Aucune des autres réponses ne fonctionne pour moi. Au lieu de cela, j'ai copié Tomcat_HOME/lib/catalina-ant.jar, Tomcat_HOME/lib/Tomcat-coyote.jar, Tomcat_HOME/lib/Tomcat-util.jar et Tomcat_HOME/bin/Tomcat-juli.jar dans le répertoire ANT_HOME/lib.

Il semble que la classe classref n'inclue pas ces fichiers correctement.

1
Christian Nilsson

Après avoir effectué les modifications ci-dessus et exécuté "ant list", j'ai reçu une erreur en tant que, Java.io.FileNotFoundException: ..../manager/text/list ".. Cela a été résolu en démarrant Tomcat à partir de son répertoire d'installation. et ne pas utiliser Eclipse pour le démarrer . Après avoir démarré Tomcat, essayez d’abord "localhost: 8080" dans le navigateur. Ceci devrait afficher la page tomcats. Ensuite, essayez de lancer "ant list". Cela fonctionne et le problème ci-dessus est résolu.

0
2ab

Trois choses-

  • Si vous utilisez Tomcat 7.x Changez le groupe de fichiers pour catalina-ant-classpath

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
      </fileset>
      <fileset dir="${appserver.home}/bin">
        <include name="Tomcat-juli.jar"/>
      </fileset>        
    

  • changez l'utilisateur dans Tomcat-users.xml pour donner l'autorisation à l'utilisateur en tant que manager-script

  • Changez la propriété Tomcat.manager.url en http://localhost:8080/manager/text
0
Mad Scientist

Je découvre Spring ou même une première utilisation de Tomcat. J'essaie simplement d'ajouter un chemin de classe à la tâche Tomcat de la sous-section dans build.xml (dans chaque tâche Tomcat) et je ne sais pas pourquoi, mais cela fonctionne.

<taskdef name="deploy" classname="org.Apache.catalina.ant.DeployTask">
    <classpath>
        <path location="${appserver.home}/lib/catalina-ant.jar"/>
        <path location="${appserver.home}/lib/Tomcat-coyote.jar"/>
        <path location="${appserver.home}/lib/Tomcat-util.jar"/>
        <path location="${appserver.home}/bin/Tomcat-juli.jar"/>
    </classpath>
</taskdef>
0
Somy A

Je suis sur Mac OS X. Cela a fonctionné pour moi: 

<!-- ============================================================== -->
<!-- Tomcat tasks - remove these if you don't have Tomcat installed -->
<!-- ============================================================== -->

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
      </fileset>
      <fileset dir="${appserver.home}/bin">
        <include name="Tomcat-juli.jar"/>
      </fileset>        
    </path>
0
Manu

Trois choses-

Si vous utilisez Tomcat 7.x Modifier le groupe de fichiers pour catalina-ant-classpath

    <path id="catalina-ant-classpath">
    <fileset dir="${appserver.lib}">
        <include name="catalina-ant.jar"/>
    <include name="Tomcat-coyote.jar"/>
    <include name="Tomcat-util.jar"/>
  </fileset>
  <fileset dir="${appserver.home}/bin">
    <include name="Tomcat-juli.jar"/>
  </fileset> 
</path> 

changez l'utilisateur dans Tomcat-users.xml pour donner l'autorisation à l'utilisateur en tant que manager-script

Changez la propriété Tomcat.manager.url en http://localhost:8080/manager/text

0
Mad Scientist

Il vous suffit d’ajouter les noms catalina-ant.jarTomcat-coyote.jar et Tomcat-util.jar du répertoire Tomcat_home/lib/ au répertoire ant_home/lib/.

0
kaushal kanjariya

Je ne sais pas pourquoi cela se produit, mais voici une solution de contournement: http://www.coderanch.com/t/553582/Tomcat/Java-lang-NoClassDefFoundError-org-Apache

Je cherche la solution, une fois que je l'aurai obtenue, j'essaierai de ne pas oublier de la poster ici.

J'utilise opensuse.

0
Krystian

Je suggérerais une modification mineure aux réponses précédentes.

Il est vivement déconseillé de configurer un utilisateur pour qu'il assigne les rôles manager-gui et manager-script dans la documentation de Tomcat 7 1 . Cela peut laisser votre site ouvert aux attaques CSRF.

Définir des utilisateurs distincts avec des mots de passe différents pour chaque rôle serait plus sûr:

<role rolename="manager-"/>
<role rolename="manager-script"/>
<user username="admin-gui" password="s3cret1" roles="manager-gui"/>
<user username="admin-script" password="s3cret2" roles="manager-script"/>

En général, il suffit de mémoriser le nom d'utilisateur et le mot de passe de l'utilisateur GUI. Il n'est donc pas contraignant de disposer d'une configuration plus sûre.

0
user3051600