2009-02-05 12 views
20

Tengo un proyecto que necesita acceder a recursos dentro de su propio archivo JAR. Cuando creo el archivo JAR para el proyecto, me gustaría copiar un directorio en ese archivo JAR (supongo que el equivalente en ZIP sería "agregar" el directorio al archivo ZIP existente). Solo quiero que la copia se realice después de que se haya creado el JAR (y obviamente no quiero que la copia se realice si limpio y elimino el archivo JAR).¿Cómo copio archivos en un JAR existente con Ant?

Actualmente el fichero de construcción es similar a esto:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="foobar" basedir=".." default="jar"> 

    <!-- project-specific properties --> 
    <property name="project.path" value="my/project/dir/foobar" /> 

    <patternset id="project.include"> 
     <include name="${project.path}/**" /> 
    </patternset> 
    <patternset id="project.jar.include"> 
     <include name="${project.path}/**" /> 
    </patternset> 

    <import file="common-tasks.xml" /> 

    <property name="jar.file" location="${test.dir}/foobar.jar" />  
    <property name="manifest.file" location="misc/foobar.manifest" /> 
</project> 

Algunas de las tareas de construcción son llamados desde otro archivo (común-tasks.xml), que no puedo mostrar aquí.

+0

¿Por qué no agrega los recursos en el momento de crear el archivo JAR? Eso es lo que hago en las compilaciones donde tengo archivos JAR que incluyen recursos sin código dentro de ellos. – Eddie

+0

Porque la tarea que se define para crear el archivo JAR se define en otro archivo que no puedo cambiar. – troyal

+0

¡Eso lo haría! Oh bien. Me alegra que otros respondieron de manera que resuelva tu problema. – Eddie

Respuesta

12

Las tareas Jar/Ear Ant son subtareas del más general Zip task. Esto significa que también se puede utilizar en su tarea zipfileset Jar:

<jar destfile="${jar.file}" basedir="..."> 
    <zipfileset dir="${project.path}" includes="*.jar" prefix="libs"/> 
</jar> 

También he visto que defina un archivo de manifiesto por separado para su inclusión en el frasco. También puede usar un comando anidado manifest:

<jar destfile="@{destfile}" basedir="@{basedir}"> 
    <manifest> 
     <attribute name="Built-By" value="..."/> 
     <attribute name="Built-Date" value="..."/> 

     <attribute name="Implementation-Title" value="..."/> 
     <attribute name="Implementation-Version" value="..."/> 
     <attribute name="Implementation-Vendor" value="..."/> 
    </manifest> 
</jar> 
4

Una forma es utilizar las tareas Ant:

  1. Unzip - a explotar el tarro es una carpeta temporal
  2. Copy - para copiar la carpeta que desee a la carpeta de archivos temporales, y
  3. Jar - con 'update' establecido en true, para empaquetar la carpeta temporal de nuevo en el archivo jar original.

El Ant Manual tiene ejemplos de cómo hacerlo.

+0

@Handerson: Yeap +1 – OscarRyz

+0

Me gustaría evitar este método si es posible. He visto una manera de hacer lo que quiero, pero no recuerdo los detalles. – troyal

17
<jar update="true"> 
... 
</jar> 
+5

No estoy seguro de qué va realmente en el "..." – troyal

Cuestiones relacionadas