How do I copy files into an existing JAR with Ant?

25,947

Solution 1

The Jar/Ear Ant tasks are subtasks of the more general Zip task. This means that you can also use zipfileset in your Jar task:

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

I've also seen that you define a separate manifest file for inclusion into the Jar. You can also use a nested manifest command:

<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>

Solution 2

<jar update="true">
...
</jar>

Solution 3

One way is to use the Ant tasks:

  1. Unzip - to explode the Jar is a temp folder
  2. Copy - to copy the folder that you want to the temp folder, and
  3. Jar - with 'update' set to true, to package the temp folder back to the original jar file.

The Ant Manual has examples of how to do it.

Share:
25,947
troyal
Author by

troyal

I'm working at getting better and getting better at working.

Updated on July 09, 2022

Comments

  • troyal
    troyal almost 2 years

    I have a project that needs to access resources within its own JAR file. When I create the JAR file for the project, I would like to copy a directory into that JAR file (I guess the ZIP equivalent would be "adding" the directory to the existing ZIP file). I only want the copy to happen after the JAR has been created (and I obviously don't want the copy to happen if I clean and delete the JAR file).

    Currently the build file looks like this:

    <?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>
    

    Some of the build tasks are called from another file (common-tasks.xml), which I can't display here.

  • troyal
    troyal about 15 years
    I'd like to avoid this method if possible. I've seen a way to do what I want, but I can't recall the details.
  • troyal
    troyal about 15 years
    I'm not sure what actually goes in the "..."