Ant How To Create A Jar File with external libraries
In this tutorial, we will show you how to use Ant build script to create a Jar file and working with the project’s external libraries / dependencies.
Technologies used :
- Eclipse 4.2
- JDK 1.7
- Ant 1.9.4
- Ant-Ivy 2.4
- logback 1.1.2
- joda-time 2.5
P.S Previous Ant Java project will be reused.
1. Project Structure
Figure 1.1 : The final project directory structure, in Eclipse IDE.
2. Java Project + External Libraries
In Eclipse IDE, reopen the previous Java project AntDateUtils, update the source code to use logback and joda-time.
package com.mkyong.core.utils;
import org.joda.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DateUtils {
private static final Logger logger = LoggerFactory.getLogger(DateUtils.class);
public static void main(String[] args) {
logger.debug("[MAIN] Current Date : {}", getLocalCurrentDate());
System.out.println(getLocalCurrentDate());
private static String getLocalCurrentDate() {
LocalDate date = new LocalDate();
return date.toString();
Create a logback.xml and put it in the project src folder. Refer to figure 1.1
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
ANT + LogBack : %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
3. Ivy – Get External Libraries
We use Apache Ivy to get the project’s external libraries / dependencies.
3.1 Create this file ivy.xml :
<ivy-module version="2.0"> <info organisation="org.apache" module="dateUtilsProject" /> <dependencies> <dependency org="joda-time" name="joda-time" rev="2.5" /> <dependency org="org.slf4j" name="slf4j-api" rev="1.7.6" /> <dependency org="ch.qos.logback" name="logback-classic" rev="1.1.2" /> </dependencies> </ivy-module>
3.2 Update build.xml, add ivy namespace on top, and “ivy” task to download the ivy module, and “resolve” task to ask Ivy module to download the external libraries.
<project xmlns:ivy="antlib:org.apache.ivy.ant"
name="dateUtilsProject" default="main" basedir=".">
<!-- ivy start -->
<!-- ivy to get dependencies and copy to project lib folder automatically -->
<target name="resolve" description="retrieve dependencies with ivy">
<ivy:retrieve />
</target>
<!-- install ivy -->
<target name="ivy" description="Install ivy">
<mkdir dir="${user.home}/.ant/lib" />
<get dest="${user.home}/.ant/lib/ivy.jar"
src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0-rc1/ivy-2.4.0-rc1.jar" />
</target>
<!-- ivy end -->
</project>
For the first time, download the ivy module from Maven center repository to local ${user.home}/.ant/lib/ivy.jar.
$ ant ivy
To download the external libraries, run task “resolve”. The declared libraries will be downloaded to the project lib folder.
$ ant resolve
4. build.xml
Review the updated build.xml script, read comments for self-explanatory.
Main points :
- Manage the project external libraries with Apache Ivy, review the ivy namespace on top, and task “resolve”.
- To compile the source code, you need to declares the classpath. Review task “compile”, and “classpathref” attribute.
- In “jar” task, constructs the entire list of the external libraries and put it into the manifest.mf file.
- In “jar” task, the project jar will be packaged to folder “dist” and the entire external libraries will be copied to from “lib” to “dist/lib”.
<project xmlns:ivy="antlib:org.apache.ivy.ant"
name="dateUtilsProject" default="main" basedir=".">
<description>
Create a Java Project (JAR) with Ant build script
</description>
<property name="projectName" value="DateUtils" />
<property name="src.dir" location="src" />
<property name="build.dir" location="bin" />
<property name="dist.dir" location="dist" />
<property name="dist.lib.dir" location="dist/lib" />
<property name="lib.dir" value="lib" />
<property name="main-class" value="com.mkyong.core.utils.DateUtils" />
<!-- ivy start -->
<!-- ivy to get dependencies and copy to project lib folder automatically -->
<target name="resolve" description="retrieve dependencies with ivy">
<ivy:retrieve />
</target>
<!-- install ivy -->
<target name="ivy" description="Install ivy">
<mkdir dir="${user.home}/.ant/lib" />
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.4.0-rc1/ivy-2.4.0-rc1.jar" />
</target>
<!-- ivy end -->
<target name="init">
<mkdir dir="${build.dir}" />
</target>
<!-- external libraries classpath, we don't need sources and javadoc -->
<path id="classpath">
<fileset dir="${basedir}/">
<include name="${lib.dir}/*.jar" />
<exclude name="${lib.dir}/*sources.jar"/>
<exclude name="${lib.dir}/*javadoc.jar"/>
</fileset>
</path>
<!-- To work with external libraries, need classpath to compile -->
<target name="compile" depends="init" description="compile the source ">
<javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath" />
</target>
<!-- constructs the external libraries classpath name -->
<pathconvert property="classpath.name" pathsep=" ">
<path refid="classpath" />
<mapper>
<chainedmapper>
<flattenmapper />
<globmapper from="*.jar" to="lib/*.jar" />
</chainedmapper>
</mapper>
</pathconvert>
<target name="copy-dependencies">
<copy todir="${dist.lib.dir}">
<fileset dir="${lib.dir}" includes="**/*.jar" excludes="**/*sources.jar, **/*javadoc.jar" />
</copy>
</target>
<!-- jar it, and declares the ext libraries in manifest.mf file -->
<target name="jar" depends="compile, copy-dependencies" description="package, output to JAR">
<echo message="classpath.name : ${classpath.name} " />
<mkdir dir="${dist.dir}" />
<mkdir dir="${dist.lib.dir}" />
<jar jarfile="${dist.dir}/${projectName}.jar" basedir="${build.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="${classpath.name}" />
</manifest>
</jar>
</target>
<target name="clean" description="clean up">
<delete dir="${build.dir}" />
<delete dir="${dist.dir}" />
</target>
<!-- Default, run this -->
<target name="main" depends="clean, compile, jar" />
</project>
5. Test
Test the Java project with Ant build script.
5.1 Jar it.
$ pwd
/Users/mkyong/Documents/workspace/AntDateUtils
$ ant
Buildfile: /Users/mkyong/Documents/workspace/AntDateUtils/build.xml
clean:
[delete] Deleting directory /Users/mkyong/Documents/workspace/AntDateUtils/bin
[delete] Deleting directory /Users/mkyong/Documents/workspace/AntDateUtils/dist
init:
[mkdir] Created dir: /Users/mkyong/Documents/workspace/AntDateUtils/bin
compile:
[javac] Compiling 1 source file to /Users/mkyong/Documents/workspace/AntDateUtils/bin
copy-dependencies:
[copy] Copying 12 files to /Users/mkyong/Documents/workspace/AntDateUtils/dist/lib
jar:
[echo] classpath.name : ... lib/joda-time-2.5.jar lib/logback-classic-1.1.2.jar lib/logback-core-1.1.2.jar lib/mail-1.4.jar ...
[jar] Building jar: /Users/mkyong/Documents/workspace/AntDateUtils/dist/DateUtils.jar
main:
BUILD SUCCESSFUL
Total time: 1 second
5.2 Inspects the generated jar file.
$ jar -tf dist/DateUtils.jar META-INF/ META-INF/MANIFEST.MF com/ com/mkyong/ com/mkyong/core/ com/mkyong/core/utils/ com/mkyong/core/utils/DateUtils.class
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.9.4 Created-By: 1.7.0_05-b05 (Oracle Corporation) Main-Class: com.mkyong.core.utils.DateUtils Class-Path: lib/activation-1.1.jar lib/commons-compiler-2.6.1.jar lib/ geronimo-jms_1.1_spec-1.0.jar lib/groovy-all-2.0.7.jar lib/janino-2.6 .1.jar lib/joda-convert-1.2.jar lib/joda-time-2.5.jar lib/logback-cla ssic-1.1.2.jar lib/logback-core-1.1.2.jar lib/mail-1.4.jar lib/servle t-api-2.5.jar lib/slf4j-api-1.7.6.jar
5.3 Run the Jar file.
$ pwd /Users/mkyong/Documents/workspace/AntDateUtils $ java -jar dist/DateUtils.jar 16:28:43.957 [main] DEBUG com.mkyong.core.utils.DateUtils - [MAIN] Current Date : 2014-11-21 2014-11-21
5.4 Run the Jar file again, with logback.xml.
$ pwd /Users/mkyong/Documents/workspace/AntDateUtils $ java -jar -Dlogback.configurationFile=src/logback.xml dist/DateUtils.jar 16:34:43,746 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [src/logback.xml] at [file:/Users/mkyong/Documents/workspace/AntDateUtils/src/logback.xml] //... ANT + LogBack : DEBUG com.mkyong.core.utils.DateUtils - [MAIN] Current Date : 2014-11-21 2014-11-21
References
- Apache Ant Hello World Official Guide
- How To Create A Jar File With Maven
- Ant Jar task
- Ant Copy task
From:一号门
Previous:Java AWT Layouts

COMMENTS