Primera aplicación de tomcat: error 'ant install' “NoClassDefFound”

Los JSP / servlets son algo que me gustaría aprender, así que me puse a crear mi primera aplicación tomcat.

He seguido el tutorial de apache aquí y he progresado para intentar instalar mi aplicación en tomcat (archivo html de prueba simple con la estructura de directorios adecuada). Ahora, me doy cuenta de que es una ilusión tener la esperanza de usar el stock build.xml provisto por el tutorial, pero necesito comenzar en algún lugar, todavía no estoy seguro de cómo escribir uno. He buscado ejemplos, pero no parecen tener objetivos de 'instalación', quizás no son aplicaciones web.

Mi proyecto se construye, pero no se instala en Tomcat a través de Ant. Cuando intento 'instalar' las salidas de mi consola ...

 ant install
Buildfile: /home/mark/svn/tomcatapp/build.xml
Trying to override old definition of datatype resources

prepare:

compile:
    [javac] /home/mark/svn/tomcatapp/build.xml:299: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

install:

BUILD FAILED
/home/mark/svn/tomcatapp/build.xml:375: java.lang.NoClassDefFoundError: org/apache/tomcat/util/buf/B2CConverter
    at org.apache.catalina.util.Base64.encode(Base64.java:173)
    at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:204)
    at org.apache.catalina.ant.DeployTask.execute(DeployTask.java:211)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    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:392)
    at org.apache.tools.ant.Target.performTasks(Target.java:413)
    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:811)
    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:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 19 more

Total time: 0 seconds

¿Por qué no se puede encontrar una clase, no estaría contenida dentro de la instalación de tomcat? Hay una pregunta similar, pero no estoy tratando de usar la aplicación de administrador, y no estoy seguro de cómo editar la ruta de clase. ¿Necesitaría haber compilado una clase .java para crear una para el proyecto?

Estoy seguro de que un archivo de compilación más simple sería suficiente, pero no estoy seguro de qué componentes son relevantes. Perdón por las preguntas potencialmente muy estúpidas.

Aquí está mi objetivo de instalación desde mi archivo build.xml.

  <target name="install" depends="compile"
   description="Install application to servlet container">

    <deploy url="${manager.url}"
       username="${manager.username}"
       password="${manager.password}"
           path="${app.path}"
       localWar="file://${build.home}"/>

  </target>
Respuesta 1

Si está utilizando el ejemplo build.xml, cambie

localWar="file://${build.home}"

a

war="${dist.home}/${app.name}-${app.version}.war"

Si tiene catalina-ant.jar en ANT_HOME / lib. Intenta eliminarlo de esta ubicación.

Reiniciar tomcat.

Eso ha funcionado para mi.

Respuesta: 2

Respuesta corta:

  • copie el archivo tomcat-util.jar de CATALINA_HOME/liba ANT_HOME/lib OR
  • al emitir comandos ant, agregue la -libopción con una ruta a ese archivo, por ejemplo
    ant -lib C:\Tomcat8\lib\tomcat-util.jar install
    ( CATALINA_HOMEpuntos proporcionados a C:\Tomcat8)

Explicación:

He encontrado un problema similar con Tomcat 8.0.36. De acuerdo con el mensaje de error, org.apache.tomcat.util.codec.binary.Base64no se encontró la clase . El comando ant install del tutorial ejecuta la tarea de implementación , que no es una tarea estándar en Ant, sino una tarea personalizada proporcionada por Tomcat. La tarea de implementación se implementa por DeployTaskclase (el nombre completo de la clase es org.apache.catalina.ant.DeployTask) que se coloca en CATALINA_HOME/lib/catalina-ant.jar. Las tareas personalizadas (como DeployTask) generalmente dependen de bibliotecas externas, por lo que debe agregar esas bibliotecas al classpath de Ant. Para obtener más información, consulte Tareas opcionales en Ant .

Respuesta: 3

Has accedido a https://issues.apache.org/bugzilla/show_bug.cgi?id=52148

Actualice a la última versión de Tomcat 7 y el problema desaparecerá.

Respuesta: 4

Estoy tratando de convertir un mapa en un mapa de valores múltiples, pero obtengo la siguiente excepción de compilación: 1er tipo de argumento incorrecto. Encontrado: java.util.Map <java.lang.String, java.util.List <java.lang ....

Así que estoy tratando de hacer que el texto en un JTextPane sea a doble espacio. Aquí está mi código: MutableAttributeSet attrs = editor.getInputAttributes (); StyleConstants.setLineSpacing (attrs, 2); editor....

Tengo un problema con mi objeto de escáner. Parece que si paso el escáner a un método estático, el escáner no puede leer el archivo que se le dio en la función principal. Cuando paso el archivo ...

Tengo una aplicación de usuario simple. Tengo un Servlet MainController que se encargará de la interacción general en la aplicación. Este servlet estará "escuchando" los patrones de URL: /, / index, etc. (...