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

ぃ、小莉子 提交于 2019-12-01 02:38:37

问题


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


回答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.




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




回答3:


I see that you have been trying to set your classpath for the <java> task.

Have you tried:

<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true">
  <classpath refid="classpath" />
</java>

EDIT: double check the values in your properties file. Do you have trailing spaces for the value of lib.dir or jar.dir?

http://ant.apache.org/faq.html#properties-not-trimmed

ant failed to build my program via javac even when I put the needed jars in an external build.properties file and reference them by pathelement or classpath refid.

When ant loads properties from an external file it doesn't touch the value of properties, trailing blanks will not be trimmed for example.

If the value represents a file path, like a jar needed to compile, the task which requires the value, javac for example would fail to compile since it can't find the file due to trailing spaces.



来源:https://stackoverflow.com/questions/4542529/how-to-include-external-libraries-in-ant-build-xml-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!