1

我有以下项目结构:

项目目录
-src
-lib
-数据

src是 Java 源文件,lib包含我的项目使用的几个外部 JAR,并data包含程序用来存储和引用数据的各种文本文件。到目前为止,我已经在 IDE 中完成了所有开发(显然)并且一切都很好,但我正在尝试编写一个编译代码的构建文件(在类路径中使用 JAR)并且可以使用数据运行文件。自从我使用 ANT 进行构建以来已经有一段时间了,所以我确信这是一个简单的问题,但我无法让构建脚本正常工作。

下面是蚂蚁文件:

<project name="CMSC491Project" basedir="." default="main">

    <property name="src.dir"     value="src"/>

    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>
    <property name="lib.dir"     value="lib"/>

    <property name="main.class"  value="parse.Driver"/>
    <property name="args"     value="?"/>



    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <fileset id="lib" dir="${lib.dir}">
        <include name="*.jar"/>
    </fileset>

    <path id="build.classpath">
        <fileset refid="${lib.dir}"/>
    </path>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>

        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="build.classpath"/>
    </target>

    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
        <attribute name="Class-Path" value="${lib.dir}/javahash ${lib.dir}/twitter4j-core-2.2.5 ${lib.dir}/twitter4j-stream-2.2.5"/>
            </manifest>
        </jar>
    </target>

    <target name="clean-build" depends="clean,jar"/>

    <target name="main" depends="clean,jar"/>

    <target name="run" depends="compile" description="run the project">
        <java dir="${classes.dir}" classname="${main.class}" fork="yes">
            <arg line="${args}"/>
        </java>
    </target>

</project>

它编译得很好,但是如果我尝试ant run我会收到一条错误消息,指出 java 无法从数据目录中的一个 JAR 中找到其中一个类。

不知道它需要我做什么,但提前谢谢。

4

2 回答 2

2

dirjava蚂蚁任务中使用。这告诉您的 JVM 调用该目录中的进程。看看这里的文档。您应该通过jarclasspath属性引用 jar。尝试将您的构建配置更改为:

<path id="build.classpath">         
    <fileset refid="lib"/>
    <fileset dir="${classes.dir}"/>     
</path>

<target name="run" depends="compile" description="run the project">
    <java classpathref="build.classpath" classname="${main.class}" fork="yes">
        <arg line="${args}"/>
    </java>
</target>

编辑(在编译中包含 classpathref)

于 2012-05-13T04:41:11.960 回答
0

您尚未指定可执行 jar 所依赖的 jar 的正确相对链接。您的罐子位于此处:

build/jar

并且它在以下位置找不到罐子(取自清单中的“类路径”):

build/jar/lib/??.jar

解决这个问题的最好方法是使用 ANT 的manifestclasspath任务:

<manifestclasspath property="jar.classpath" jarfile="${jar.dir}/${ant.project.name}.jar">
    <fileset dir="lib" >
        <include name="*.jar"/>
    </fileset>
</manifestclasspath>

<jar jarfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
   <manifest>
      <attribute name="Main-Class" value="${main-class}"/>
      <attribute name="Class-Path" value="${jar.classpath}"/>
   </manifest>
</jar>

设置完所有这些后,您可以按如下方式运行 jar:

<java dir="${classes.dir}" jar="${jar.dir}/${ant.project.name}.jar" fork="yes">
    <arg line="${args}"/>
</java>

有两种方法可以运行 jar。使用jar参数来指定使用classname的主类。

只有jar参数将使用嵌入在您的 jar 文件清单中的类路径。如果您使用类路径,您将被迫指定它。

您最终应该考虑如何分发这个 jar。如果您将 jar 提供给其他人,他们需要将依赖项放在一个目录中,该目录位于 jar 的以下相对路径中

../../lib
于 2012-05-13T13:00:54.990 回答