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

6
在我的Java源代码中,我想使用存储在应用程序“lib”目录中的Java档案(.jar)中的不同类。但是,如果我执行“ant run”,则始终会收到“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>

希望有人能够提供帮助。

谢谢!

Benny


你的 lib 目录长什么样子?所有的 jar 文件都倒在那个目录里,还是有子目录? - Mads Hansen
所有的jar文件都在该目录下(没有任何子目录)。结构看起来像这样:./lib/log4j-1.2.9.jar,./lib/cobertura.jar,./lib/easymock-3.0.jar,... 我该如何将这些库包含在我的jar文件中? - Benny Code
3个回答

3

classes.dir=${build.dir}/classes替换为classes.dir=build/classes,并将jar.dir=${build.dir}/jar替换为jar.dir=build/jar,来自您的build.properties文件将会生效。


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>


-1

我看到你一直在尝试为<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

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

当ant从外部文件加载属性时,它不会触及属性的值,例如尾随空格将不会被修剪。

如果该值表示文件路径,例如编译所需的jar包,则需要该值的任务(例如javac)将无法编译,因为由于尾随空格而找不到该文件。


当我使用它时,在“ant compile”期间会出现错误。目前,我提取每个外部jar文件的源代码文件并将它们放入自己的“src”目录中。然后,我可以在编译和运行我的项目时包含依赖项,因此没有问题。但是我认为这不是最佳用例。但是到目前为止,我还没有找到任何其他解决方案,可以将外部jar文件提供给我的jar文件。我认为我必须再次关注清单中的类路径声明,就像你告诉我的那样... - Benny Code
@Benny Neugebauer - 请仔细检查您的属性文件条目,看看路径值是否存在尾随空格。 - Mads Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接