2012-04-15 23 views
7

Quiero incluir jar externo a mi proyecto de Java. Estoy usando hormiga External .jar está en la carpeta lib. Mi build.xml se ve algo así:Ant incluye externa .jar

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <path id="classpath"> 
     <fileset dir="lib" includes="**/*.jar"/> 
    </path> 

    <target name="clean"> 
     <delete dir="build"/> 
    </target> 

    <target name="compile"> 
     <mkdir dir="build"/> 
     <javac srcdir="src" destdir="build" classpathref="classpath" /> 
    </target> 

    <target name="jar"> 
     <mkdir dir="trash"/> 
     <jar destfile="trash/test.jar" basedir="build"> 
      <zipgroupfileset dir="lib" includes="**/*.jar"/> 
      <manifest> 
       <attribute name="Main-Class" value="com.Test"/> 
      </manifest> 
     </jar> 
    </target> 

    <target name="run"> 
     <java jar="trash/test.jar" fork="true"/> 
    </target> 
</project> 

Pero no funciona. Cuando quiero importar algo del archivo .jar externo, aparece un error después del comando ant compile: paquete com.algo no existe. ¿Qué debo editar para que funcione?

error exacto:

Compiling 23 source files to xy/build 
    xy/src/com/Test.java:5: package com.thoughtworks.xstream does not exist 
    import com.thoughtworks.xstream.*; 
^
    1 error 
+0

¿Puede editar su pregunta para proporcionarnos el error exacto? – Tom

+0

He agregado el error exacto. – Pajushka

+0

no puede incluir bibliotecas externas fácilmente en un contenedor normal. Necesita tareas especiales como one-jar para lograr eso. – oers

Respuesta

4

Usted debe tratar sin la incluye atributos:

<fileset dir="lib" /> 

Y en la parte jarra que incluyen las clases de este tipo:

<zipgroupfileset includes="*.jar" dir="lib"/> 
0

también use ant para incluir un número de JAR de dependencia en mi JAR. Mi tarea de compilación se ve así. Tal vez algo similar funcione para usted.

<target name="compile" depends="init"> 
    <javac srcdir="${src}" destdir="${build}" includeantruntime="false"> 
    <classpath> 
     <pathelement path="${classpath}" /> 
     <fileset dir="${deps}"> 
     <include name="**/*.jar"/> 
     </fileset> 
    </classpath> 
    </javac> 
    <copy todir="${build}"> 
    <fileset dir="${src}" excludes="**/*.java"/> 
    </copy> 
</target> 
1

No puede colocar bibliotecas externas en un contenedor y esperar que el cargador de clases use esos archivos jar. Lamentablemente, esto no es compatible.

Hay tareas ant como one jar que lo ayudan a crear un archivo jar que contiene todo lo que necesita.

Este bit es del background information of one jar:

Unfortunately this is does not work. The Java Launcher$AppClassLoader does not know how to load classes from a Jar inside a Jar with this kind of Class-Path. Trying to use jar:file:jarname.jar!/commons-logging.jar also leads down a dead-end. This approach will only work if you install (i.e. scatter) the supporting Jar files into the directory where the jarname.jar file is installed.

Another approach is to unpack all dependent Jar files and repack them inside the jarname.jar file. This approach tends to be fragile and slow, and can suffer from duplicate resource issues.

otra alternativa:

  • jarjar: Jar Jar Links es una utilidad que hace que sea fácil de volver a empaquetar las bibliotecas de Java e incrustarlos en su propia distribución
+0

No es del todo exacto, algunas aplicaciones como Hadoop, por ejemplo, admiten la convención de poner jar en el directorio lib de un jar y la aplicación maneja cómo obtenerlos en classpath. –

+1

@DavidParks, pero eso es porque Hadoop usa un propio clasificador. Entonces esta es una aplicación específica y no es parte de la definición oficial de jar. – oers

0

a veces se puede utilizar el contenido del contenedor directamente, solo descomprimir

 <unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" /> 
Cuestiones relacionadas