2009-07-27 16 views
20

Estoy tratando de modificar mi técnica de compilación para crear archivos Java jar que dependen de archivos jar de terceros comunes. (GlazedLists, Apache Commons, etc.)hormiga, archivos jar y Class-Path oh my

Había estado colocándolos todos en {Java JRE dir}/lib/ext para que el JRE los viera automáticamente, pero eso me llevó a problemas como no recordar que necesito para distribuir ciertos archivos jar, por lo que me gustaría aprender a ser más explícito.

Así que todos ellos se trasladaron a c: \ apl \ Java \ \ común, que añadido a la Eclipse construir camino, A y define esto en mi archivo de hormigas:

<path id="javac_classpath"> 
    <fileset dir="${libDir}"> 
     <include name="*.jar"/> 
    </fileset> 
    <fileset dir="c:/appl/java/common"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 

tengo mi El encabezado del manifiesto de la ruta de clase se establece en "." en mi tarea jar pero eso no parece funcionar incluso si coloco los archivos jar relevantes en el mismo directorio que mi archivo jar de aplicación. Puedo agregarlos todos uno por uno al encabezado de la ruta de clase, pero me pregunto si existe alguna forma más fácil de configurar correctamente la configuración del encabezado de la ruta de clase.

Respuesta

36

Esto es todo lo que necesita:

<path id="build-classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar"> 
    <classpath refid="build-classpath"/> 
</manifestclasspath> 
<jar jarfile="${dist}/lib/myprog.jar" 
    basedir="${build}" 
    includes="com/my/prog/**" > 
    <manifest> 
     <attribute name="Main-Class" value="com.my.prog.MyProg"/> 
     <attribute name="Class-Path" value="${lib.list}"/> 
    </manifest> 
</jar> 

Como podrán ver, se asume que ha compilado las clases Java y almacenarlas en ${build}. También asume que ha copiado sus jarfiles al ${dist}/lib.

Dicho esto, valdría la pena investigar otros sistemas de compilación que tienen soporte integrado para dependencias, como Maven y Gradle. Estos otros sistemas de compilación ya han pensado en muchas estructuras de proyectos y operaciones de compilación comunes, por lo que no tiene que guiar todo hasta el último detalle.

+1

ahhhh ... eso es lo que estaba buscando. ¡Excelente! –

+0

Hmmm. Corrección: no funciona para una compilación nueva, porque el directorio $ {dist}/lib aún no existe. ¿Hay alguna forma de retrasar la ejecución de la tarea ? –

+0

DOH! no importa, puse el y en la sección raíz de mi archivo ant, simplemente lo arreglé poniéndolo en la tarea jar. ¡¡¡¡¡gracias de nuevo!!!!! –

0

Los directorios Classpath no incluyen, de forma predeterminada, archivos Jar por motivos de seguridad. Alguien podría colocar un archivo jar allí, y podría cargarse, anulando tu código, sin tu conocimiento. Sé que hubo una discusión acerca de agregar otro marcador o token final para permitir que los archivos Jar se agreguen a la ruta de clase, pero, si mi memoria funciona, está programada para la versión 7. Sin embargo, podría estar equivocado en la última parte.

0

El encabezado del manifiesto de la ruta de clase para los archivos jar requiere que enumere explícitamente los archivos jar que desea incluir. La inclusión de un directorio en classpath significa que java buscará los archivos .class en ese directorio, no jarfiles.

4

Lo que quiere es un mapper. Flattenmapper es probablemente el más fácil, pero esencialmente necesitas crear un elemento de ruta que especifique tu ruta de clase, luego usa una conversión de ruta para convertirla en una cadena que se puede incluir en tu manifiesto.

Edit: se pueden utilizar incluyen reglas para construir el elemento de la ruta, así que todo en un directorio que termina con el tarro sería **/*.jar

-1

Ya que estás en hormiga, es probable que no quiere cambiar, pero Maven es bastante bueno para identificar todas sus dependencias, y tiene varias facilidades para copiar o combinar sus jar de lib juntos para propósitos de distribución. Para mis propósitos, tengo un plugin de Maven que crea un script de ejecución durante la compilación, que a su vez establece el classpath para mí, así que no tengo que preocuparme por eso.

+0

Ivy es una manera compatible con la hormiga bastante que hacer gestión de la dependencia. –

3

Con ant 1.7 y después, la tarea manifestclasspath es el camino a seguir. Si está utilizando una versión de ant antes de 1.7, la tarea manifestclasspath no existe.

A continuación se da el mismo resultado: -

<path id="build.classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar" /> 
     <exclude name="myprog.jar" /> 
    </fileset> 
</path> 

<pathconvert property="lib.list" pathsep=" "> 
    <path refid="build.classpath" /> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper /> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

<target name="generate.jar"> 
    <jar destfile="${dist}/lib/myprog.jar"> 
     <manifest> 
      <attribute name="Main-Class" 
       value="com.mypackage.MyClass" /> 
      <attribute name="Class-Path" value="${manifest.classpath}" /> 
     </manifest> 
    </jar> 
</target> 
Cuestiones relacionadas