Pregunta

Tengo un montón de archivos .java en una carpeta "src" que dependen de tres frascos en una carpeta "lib". Tengo el siguiente archivo build.xml:

<?xml version="1.0"?>
<project name="MyProj" basedir=".">
 <property name="src"   value="src"/>
 <property name="build" value="build"/>
 <property name="lib"   value="lib"/>


 <path id="master-classpath">
   <fileset dir="${lib}">
     <include name="activemq-all-5.1-SNAPSHOT.jar"/>
     <include name="geronimo-jms_1.1_spec-1.1.1.jar"/>
     <include name="activemq-core-5.3.0.jar"/>
   </fileset>
 </path>

 <javac destdir="${build}">
   <src path="${src}"/>
   <classpath refid="master-classpath"/>
 </javac>

</project>

Esta compila bien, pero cuando intento y correr consigo

  

"java.lang.NoClassDefFoundError:   javax / jms / destino "

Este programa se ejecuta y compila bien cuando incluyo los vasos de la BuildPath utilizando Eclipse, sin embargo.

EDIT: Así que he copiado los frascos en la carpeta que tiene las clases compiladas. La clase con el método principal es NDriver.class. Cuando intento:

  

java -classpath   ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar   NDriver

Esto da:

  

Excepción en hilo "principal"   java.lang.NoClassDefFoundError:   NDriver

Te agradecería cualquier ayuda.

¿Fue útil?

Solución

Es necesario poner los frascos utilizados en tiempo de compilación en la ruta de clase cuando ejecutar la aplicación. Lamentablemente, no proporcionó ningún detalle sobre cómo en realidad se está ejecutando es así que es difícil proporcionar una mayor orientación.

ACTUALIZACIÓN: necesita ser añadido a la ruta de clase demasiado El directorio que contiene las clases compiladas. Si inicia java desde el directorio que contiene las clases compiladas, entonces se puede utilizar . para designar el directorio actual. Añadirlo a la ruta de clase, como se muestra abajo para avisarle java para buscar clases allí también (He añadido . justo después activemq-all-5.1-SNAPSHOT.jar):

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar:. NDriver

Otros consejos

Una forma (ligeramente diferentes variables que la tuya)

<path id="classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<manifestclasspath property="manifest.classpath" jarfile="${jarfile}">
    <classpath refid="classpath"/>
</manifestclasspath>

<target name="jar" depends="compile" description="create the jar">
    <jar destfile="${jarfile}" basedir="${build.dir}">
        <manifest>
            <attribute name="Manifest-Version" value="${manifest-version}"/>
            <attribute name="Created-By" value="${ant.java.version}"/>
            <attribute name="Main-Class" value="${main-class}"/>
            <attribute name="Class-Path" value="${manifest.classpath}"/>
        </manifest>
    </jar>
</target>

Por supuesto que aquí estoy suponiendo que se está creando un tarro y ejecutarlo (incluyendo la ruta de clase allí). Otra opción sería tener un objetivo run que utilizan la etiqueta <java> y utilizar explícitamente la ruta de clase allí.

¿Son los frascos de bibliotecas incluidas en la ruta de clase cuando se ejecuta el programa? Eclipse automáticamente agrega estos, pero hay que especificarlos cuando se ejecuta el programa desde la línea de comandos.

A partir de mi experiencia parece Eclipse a menudo incluyen clases y tarros en la ruta de clase sin utilizar explícitamente la declaración de ruta de clases. De hecho, a veces puede ser muy difícil de eliminar las clases de acumulación de Eclipse (que tienen que ser eliminados o clean'ed).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top