How to include external libraries in Ant build.xml file?

40,931

Solution 1

Replacing classes.dir=${build.dir}/classes with classes.dir=build/classes and jar.dir=${build.dir}/jar with jar.dir=build/jar from your build.properties file will work.

Solution 2

Please edit target jar as follows. I am sure it will work.

<target name="jar" depends="compile">

<delete dir="${jar.dir}"/>
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}">
  <manifest>
    <attribute name="Class-Path" value="${lib.dir}"/>
    <attribute name="Main-Class" value="${main.class}"/>
  </manifest>
   <zipgroupfileset  dir="${lib.dir}"/>

</jar>

Share:
40,931
Benny Neugebauer
Author by

Benny Neugebauer

Hi there 👋 🙂 My name is Benny (he/him). ☀️️ I code for South Pole during the day. 🌑 I record for TypeScript TV during the night. 💦 And if there is some time left, I go wakeboarding.

Updated on February 13, 2020

Comments

  • Benny Neugebauer
    Benny Neugebauer about 4 years

    In my Java source-code I want to use different classes from java archives (.jar) stored in my application's "lib" directory. But if I do "ant run" then I always get a "java.lang.NoClassDefFoundError" message. I tried several things to fix it but nothing worked... Maybe someone here can help me?

    This is my build.properties file:

    app.name=MyApplication
    app.version=1.0
    main.class=mypackage.MyMain
    build.dir=build
    classes.dir=${build.dir}/classes
    jar.dir=${build.dir}/jar
    dist.dir=dist
    src.dir=src
    test.dir=test
    lib.dir=lib
    

    This is my build.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <project name="My Project" default="run" basedir=".">
      <description>My description.</description>
    
      <property file="build.properties" />
      <path id="classpath">
        <fileset dir="${lib.dir}" includes="*.jar"/>
      </path>
    
        <!-- Initialization -->
      <target name="init" description="Prepare needed directories.">
        <mkdir dir="${build.dir}" />
        <mkdir dir="${classes.dir}" />
        <mkdir dir="${jar.dir}" />
        <mkdir dir="${dist.dir}" />
        <mkdir dir="${lib.dir}" />
      </target>
    
        <!-- Cleanup -->
      <target name="clean" description="Remove all files created by the build/test process.">
        <delete dir="${classes.dir}" />
        <delete dir="${dist.dir}" />
      </target>
    
        <!-- Compile application -->
      <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" 
           destdir="${classes.dir}" 
           debug="yes"
           includeantruntime="false">
          <!-- <classpath refid="classpath" /> -->
        </javac>
      </target>
    
        <!-- Java Archive -->
      <target name="jar" depends="compile">
        <!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>-->
        <delete dir="${jar.dir}"/>
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}">
          <manifest>
            <attribute name="Class-Path" value="${lib.dir}"/>
            <attribute name="Main-Class" value="${main.class}"/>
          </manifest>
        </jar>
      </target>
    
        <!-- Run application -->
      <target name="run" depends="jar">
    
        <java jar="${jar.dir}/${app.name}-${app.version}.jar" 
            fork="true">
        </java>
        <!--
        <java fork="true" classname="${main.class}">
          <classpath>
             <path refid="classpath"/>
             <path location="${jar.dir}/${app.name}-${app.version}.jar"/>
          </classpath>
        </java>
        -->
      </target>
    </project>
    

    It would be nice if anyone could help.

    Cheers!

    Benny

    • Mads Hansen
      Mads Hansen over 13 years
      what does your lib directory look like? Are all of the jar files dumped in that directory, or are there subdirectories?
    • Benny Neugebauer
      Benny Neugebauer over 13 years
      All jar files are in that directory (without any sub-directories). The structure looks like: ./lib/log4j-1.2.9.jar, ./lib/cobertura.jar, ./lib/easymock-3.0.jar, ... How can I include those libraries in my jar file?
  • Benny Neugebauer
    Benny Neugebauer over 13 years
    When I use this, then I get an error while "ant compile". At the moment I extract every source-code files of my external jar files and put them into my own "src" directory. Then I can run my project without problems because the dependencies are included when compiling and running my project. But I think that this is not the best use-case. But until now I have not found any other solution that will provide the external jar files in my own jar file. I think I have to focus again on the classpath declaration in the manifest as you told me...
  • Mads Hansen
    Mads Hansen over 13 years
    @Benny Neugebauer - double check your properties file entries to see if there is any trailing whitespace for your path values.