Taztingo
Taztingo

Reputation: 1945

Ant With Internal Dependencies

I have a a jar right now that uses external dependencies. I'm trying to create a jar that packages all the external dependencies inside, and will just give me one jar. I saw this question asked multiple times, but I still can't figure it out. I'm using Ant, and copied some of the examples I saw on here. I'm using zipgroupfileset to reference the external(now internal) jars. As soon as I added the zipgroupfileset I got a runtime error that said my Runner class could not be found.

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
              Any modifications will be overwritten.
              To include a user specific buildfile here, simply create one in the same
              directory with the processing instruction <?eclipse.ant.import?>
              as the first entry and export the buildfile again. -->
<project basedir="." default="build" name="ExcelDemo">
    <property environment="env"/>
    <property name="ECLIPSE_HOME" value="../../../../Program Files (x86)/eclipse"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
    <property name="external-lib-dir" value="lib\poi-3.9" />
    <property name="external-lib-dir2" value="lib\poi-3.9\lib" />
    <property name="external-lib-dir3" value="lib\poi-3.9\ooxml-lib" />
    <path id="ExcelDemo.classpath">
        <pathelement location="bin"/>
    </path>
    <target name="init">
        <mkdir dir="bin"/>
        <copy includeemptydirs="false" todir="bin">
            <fileset dir="src" excludes="**/*.launch, **/*.java"/>
        </copy>
    </target>
    <target name="clean">
        <delete dir="bin"/>
    </target>
    <target depends="clean" name="cleanall"/>
    <target depends="build-subprojects,build-project" name="build"/>
    <target name="build-subprojects"/>
    <target depends="init" name="build-project">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}">
            <src path="src"/>
            <classpath refid="ExcelDemo.classpath"/>
        </javac>
    </target>
    <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects">
        <ant antfile="${ExcelSensitize.location}/build.xml" inheritAll="false" target="clean"/>
        <ant antfile="${ExcelSensitize.location}/build.xml" inheritAll="false" target="build">
            <propertyset>
                <propertyref name="build.compiler"/>
            </propertyset>
        </ant>
    </target>
    <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
        <copy todir="${ant.library.dir}">
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </copy>
        <unzip dest="${ant.library.dir}">
            <patternset includes="jdtCompilerAdapter.jar"/>
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </unzip>
    </target>
    <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
        <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
        <antcall target="build"/>
    </target>
    <target name="RunnerClass">
        <java classname="runner.RunnerClass" failonerror="true" fork="yes">
            <classpath refid="ExcelDemo.classpath"/>
        </java>
    </target>
    <target name="jar" description="Create a jar for this project">
        <manifestclasspath property="lib.list" jarfile="Test.jar">
            <classpath refid="ExcelDemo.classpath" /> 
        </manifestclasspath>
        <jar jarfile="Test.jar" includes="*.class" basedir="bin">
            <zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
            <zipgroupfileset dir="${external-lib-dir2}" includes="*.jar"/>
            <zipgroupfileset dir="${external-lib-dir3}" includes="*.jar"/>
            <manifest>
                <attribute name="Class-Path" value="${lib.list}" /> 
                <attribute name="Main-Class" value="runner.RunnerClass" /> 
            </manifest>
        </jar>
    </target>
</project>

Upvotes: 0

Views: 512

Answers (2)

David W.
David W.

Reputation: 107040

To make things simpler:

  • Create a separate sources jar for compilation. Then, have a separate compiled jar without the sources.
  • Don't include the third party jars. Instead, use Ivy with Ant. Ant will automatically download the required jars. In fact, I've see sources that just include the ivy.jar, so Ivy will automatically be configured when you unjar the sources. You type in ant, and everything just builds.

As an alternative, you can look at Maven which is how many projects are now packaged. In fact, if your jar is an open source project, you can probably host it on the OSS Maven repository. This way, no one even needs to manually download your compiled jar. If they want it, they configure their Maven project to do it for them.

Upvotes: 1

Rasoul Taheri
Rasoul Taheri

Reputation: 822

i think the problem is that you use basedir="bin" in the your jar task. then path of your zipgroupfileset convert to bin/${external-lib-dir}

Upvotes: 0

Related Questions