2010-12-27 16 views
6

En mi código fuente de Java, quiero usar diferentes clases de archivos java (.jar) almacenados en el directorio "lib" de mi aplicación. Pero si lo hago "ant run", siempre aparece el mensaje "java.lang.NoClassDefFoundError". Intenté varias cosas para arreglarlo pero nada funcionó ... ¿Tal vez alguien aquí puede ayudarme?¿Cómo incluir bibliotecas externas en el archivo Ant build.xml?

Ésta es mis build.properties archivo:

app.name=MyApplication 
app.version=1.0 
main.class=mypackage.MyMain 
build.dir=build 
classes.dir=${build.dir}/classes 
jar.dir=${build.dir}/jar 
dist.dir=dist 
src.dir=src 
test.dir=test 
lib.dir=lib 

Ésta es mi build.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<project name="My Project" default="run" basedir="."> 
    <description>My description.</description> 

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

    <!-- Initialization --> 
    <target name="init" description="Prepare needed directories."> 
    <mkdir dir="${build.dir}" /> 
    <mkdir dir="${classes.dir}" /> 
    <mkdir dir="${jar.dir}" /> 
    <mkdir dir="${dist.dir}" /> 
    <mkdir dir="${lib.dir}" /> 
    </target> 

    <!-- Cleanup --> 
    <target name="clean" description="Remove all files created by the build/test process."> 
    <delete dir="${classes.dir}" /> 
    <delete dir="${dist.dir}" /> 
    </target> 

    <!-- Compile application --> 
    <target name="compile"> 
    <mkdir dir="${classes.dir}"/> 
    <javac srcdir="${src.dir}" 
     destdir="${classes.dir}" 
     debug="yes" 
     includeantruntime="false"> 
     <!-- <classpath refid="classpath" /> --> 
    </javac> 
    </target> 

    <!-- Java Archive --> 
    <target name="jar" depends="compile"> 
    <!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>--> 
    <delete dir="${jar.dir}"/> 
    <mkdir dir="${jar.dir}"/> 
    <jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
     <manifest> 
     <attribute name="Class-Path" value="${lib.dir}"/> 
     <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 
    </target> 

    <!-- Run application --> 
    <target name="run" depends="jar"> 

    <java jar="${jar.dir}/${app.name}-${app.version}.jar" 
     fork="true"> 
    </java> 
    <!-- 
    <java fork="true" classname="${main.class}"> 
     <classpath> 
     <path refid="classpath"/> 
     <path location="${jar.dir}/${app.name}-${app.version}.jar"/> 
     </classpath> 
    </java> 
    --> 
    </target> 
</project> 

Sería bueno si alguien puede ayudar.

¡Salud!

Benny

+0

lo que se ve su directorio 'lib' como? ¿Están todos los archivos jar abandonados en ese directorio, o hay subdirectorios? –

+0

Todos los archivos jar están en ese directorio (sin ningún subdirectorio). La estructura se ve como: ./lib/log4j-1.2.9.jar,./lib/cobertura.jar, ./lib/easymock-3.0.jar, ... ¿Cómo puedo incluir esas bibliotecas en mi archivo jar? –

Respuesta

0

veo que usted ha estado tratando de establecer la ruta de clases para la tarea <java>.

Ha intentado:

<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true"> 
    <classpath refid="classpath" /> 
</java> 

EDIT: doble Vea los valores en el archivo de propiedades. ¿Tiene espacios finales para el valor de lib.dir o jar.dir?

http://ant.apache.org/faq.html#properties-not-trimmed

hormiga fracasó en la construcción a través de mi programa javac aun cuando puse los frascos necesarios en un archivo externo de build.properties y hacer referencia a ellas por pathelement o ruta de clase RefID.

Cuando hormigas propiedades carga desde un archivo externo que no toque el valor de propiedades, los blancos de cola no se recortará por ejemplo.

Si el valor representa una ruta de archivo, como un tarro necesaria para compilar, la tarea que requiere el valor, javac para ejemplo podría dejar de compilar ya que no puede encontrar el archivo de salida debido a espacios .

+0

Cuando uso esto, aparece un error mientras "compilación de hormigas". Por el momento, extraigo todos los archivos de código fuente de mis archivos jar externos y los pongo en mi propio directorio "src". Entonces puedo ejecutar mi proyecto sin problemas porque las dependencias se incluyen al compilar y ejecutar mi proyecto. Pero creo que este no es el mejor caso de uso. Pero hasta ahora no he encontrado ninguna otra solución que proporcione los archivos jar externos en mi propio archivo jar. Creo que tengo que volver a centrarme en la declaración de classpath en el manifiesto como me dijiste ... –

+0

@Benny Neugebauer - comprueba dos veces las entradas del archivo de propiedades para ver si hay algún espacio en blanco al final para tus valores de ruta. –

3

Sustitución classes.dir=${build.dir}/classes con classes.dir=build/classes y jar.dir=${build.dir}/jar con jar.dir=build/jar de su archivo build.properties va a funcionar.

2

Edite el jar de destino de la siguiente manera. Estoy seguro de que funcionará.

<target name="jar" depends="compile"> 

<delete dir="${jar.dir}"/> 
<mkdir dir="${jar.dir}"/> 
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
    <manifest> 
    <attribute name="Class-Path" value="${lib.dir}"/> 
    <attribute name="Main-Class" value="${main.class}"/> 
    </manifest> 
    <zipgroupfileset dir="${lib.dir}"/> 

</jar> 

Cuestiones relacionadas