如何在Ant build.xml文件中包含外部库?

时间:2010-12-27 23:15:28

标签: apache ant properties libraries build.xml

在我的Java源代码中,我想使用存储在我的应用程序的“lib”目录中的java archives(.jar)中的不同类。但是,如果我做“蚂蚁运行”,那么我总是得到一个“java.lang.NoClassDefFoundError”消息。我尝试了几件事来解决它,但没有任何效果......也许这里有人可以帮助我吗?

这是我的 build.properties 文件:

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

这是我的 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>

如果有人能提供帮助,那就太好了。

干杯!

3 个答案:

答案 0 :(得分:3)

classes.dir=${build.dir}/classes替换为classes.dir=build/classes,将jar.dir=${build.dir}/jar替换为jar.dir=build/jar文件中的build.properties将会有效。

答案 1 :(得分:2)

请按如下方式编辑目标jar。我相信它会奏效。

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

答案 2 :(得分:0)

我发现您一直在尝试为<java>任务设置类路径。

你试过了吗?

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

编辑:仔细检查属性文件中的值。您是否有lib.dirjar.dir

值的尾随空格

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

  

ant无法通过构建我的程序   即使我放了所需的罐子,也是javac   在外部build.properties文件中   并通过pathelement或引用它们   classpath refid。

     

当ant加载来自的属性时   外部文件它没有触及   属性值,尾随空白   例如,不会修剪。

     

如果值表示文件路径,   像一个需要编译的jar,任务   这需要价值,javac   示例将无法编译,因为它   由于尾随而无法找到该文件   空格。