¿Cómo puede incluir varios frascos en la ruta de clase utilizando hormiga?
-
21-09-2019 - |
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.
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).