ANT: ways to include libraries and license issues

Posted by Eric Tobias on Stack Overflow See other posts from Stack Overflow or by Eric Tobias
Published on 2014-06-02T08:52:28Z Indexed on 2014/06/02 15:27 UTC
Read the original article Hit count: 231

Filed under:
|

I have been trying to use Ant to compile and ready a project for distribution. I have encountered several problems along the way that I have been finally able to solve but the solution leaves me very unsatisfied. First, let me explain the set-up of the project and its dependencies.

I have a project, lets call it Primary which depends on a couple of libraries such as the fantastic Guava. It also depends on another project of mine, lets call it Secondary. The Secondary project also features some dependencies, for example, JDOM2. I have referenced the Jar I build with Ant in Primary.

Let me give you the interesting bits of the build.xml so you can get a picture of what I am doing:

<project name="Primary" default="all" basedir=".">  
    <property name='build' location='dist' />
    <property name='application.version' value='1.0'/>
    <property name='application.name' value='Primary'/>
    <property name='distribution' value='${application.name}-${application.version}'/>

    <path id='compile.classpath'>
        <fileset dir='libs'>
            <include name='*.jar'/>
        </fileset>
    </path>

    <target name='compile' description='Compile source files.'>
        <javac includeantruntime="false" srcdir="src" destdir="bin">   
            <classpath refid='compile.classpath'/>
        </javac>
    <target> 

    <target name='jar' description='Create a jar file for distribution.' depends="compile">
        <jar destfile='${build}/${distribution}.jar'>
            <fileset dir="bin"/>
            <zipgroupfileset dir="libs" includes="*.jar"/>
        </jar>
    </target>

The Secodnary project's build.xml is nearly identical except that it features a manifest as it needs to run:

<target name='jar' description='Create a jar file for distribution.' depends="compile">
    <jar destfile='${dist}/${distribution}.jar' basedir="${build}" >    
        <fileset dir="${build}"/>
        <zipgroupfileset dir="libs" includes="*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="lu.tudor.ssi.kiss.climate.ClimateChange"/>
        </manifest>
    </jar>      
</target>

After I got it working, trying for many hours to not include that dependencies as class files but as Jars, I don't have the time or insight to go back and try to figure out what I did wrong. Furthermore, I believe that including these libraries as class files is bad practice as it could give rise to licensing issues while not packaging them and merely including them in a directory along the build Jar would most probably not (And if it would you could choose not to distribute them yourself).

I think my inability to correctly assemble the class path, I always received NoClassDefFoundError for classes or libraries in the Primary project when launching Second's Jar, is that I am not very experienced with Ant. Would I require to specify a class path for both projects? Specifying the class path as . should have allowed me to simply add all dependencies to the same folder as Secondary's Jar, should it not?

© Stack Overflow or respective owner

Related posts about ant

Related posts about classpath