Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有外部jar文件的java构建ant文件_Java_Ant_Build - Fatal编程技术网

带有外部jar文件的java构建ant文件

带有外部jar文件的java构建ant文件,java,ant,build,Java,Ant,Build,我创建了一个ant构建文件,将我的JavaSRC编译成一个.jar文件。它使用外部jar文件 我的文件目录: +src ----android ------------Address.java ------------HelloServer.java ------------HelloServerResource.java +lib ------------org.codehaus.jackson.core.jar ------------org.codehaus.jackson.mapper.

我创建了一个ant构建文件,将我的JavaSRC编译成一个.jar文件。它使用外部jar文件

我的文件目录:

+src
----android
------------Address.java
------------HelloServer.java
------------HelloServerResource.java
+lib
------------org.codehaus.jackson.core.jar
------------org.codehaus.jackson.mapper.jar
------------org.json.jar
------------org.restlet.ext.jackson.jar
------------org.restlet.jar
build.xml
外部库位于lib文件夹中。 主类位于HelloServer.java中

这是我的ant构建文件:

<project name="helloworld">
    <property name="src-dir" location="src"/>
    <property name="build-dir" location="build"/>
    <property name="classes-dir" value="${build-dir}/classes"/>
    <property name="dist-dir" location="dist"/>
    <property name="lib-dir" value="lib"/>
    <property name="jar-dir"     value="${build-dir}/jar"/>
    <property name="main-class"  value="android.HelloServer"/>

    <path id="classpath">
        <fileset dir="${lib-dir}" includes="**/*.jar"/>
    </path>

    <target name="clean" description="compile the source">
        <delete dir="${build-dir}" />
        <delete dir="${dist-dir}" />
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="init">
        <!-- Create the build directory structure used by compile -->
        <mkdir dir="${build-dir}"/>
        <mkdir dir="${classes-dir}"/>
        <mkdir dir="${jar-dir}"/>
        <!--<mkdir dir="${dist-dir}"/>-->
    </target>

    <target name="compile" depends="init" description="compile the source " >
        <javac srcdir="${src-dir}" destdir="${classes-dir}" classpathref="classpath" includeantruntime="false" />
        <!--<javac srcdir="${src-dir}" destdir="${build-dir}"/>-->
    </target>

    <target name="jar" depends="compile">
        <jar destfile="${jar-dir}/${ant.project.name}.jar" basedir="${classes-dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>

    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <classpath>
                <path refid="classpath"/>
                <path location="${jar-dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>

</project>
<project name="helloworld">
    <property name="src-dir" location="src"/>
    <property name="build-dir" location="build"/>
    <property name="classes-dir" value="${build-dir}/classes"/>
    <property name="dist-dir" location="dist"/>
    <property name="lib-dir" value="lib"/>
    <property name="jar-dir"     value="${build-dir}/jar"/>
    <property name="main-class"  value="android.HelloServer"/>

    <path id="classpath">
        <fileset dir="${lib-dir}" includes="**/*.jar"/>
    </path>

    <target name="clean" description="compile the source">
        <delete dir="${build-dir}" />
        <delete dir="${dist-dir}" />
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="init">
        <!-- Create the build directory structure used by compile -->
        <mkdir dir="${build-dir}"/>
        <mkdir dir="${classes-dir}"/>
        <mkdir dir="${jar-dir}"/>
        <!--<mkdir dir="${dist-dir}"/>-->
    </target>

    <target name="compile" depends="init" description="compile the source " >
        <javac srcdir="${src-dir}" destdir="${classes-dir}" 
            classpathref="classpath" includeantruntime="false" />
        <!--<javac srcdir="${src-dir}" destdir="${build-dir}"/>-->
    </target>

    <target name="jar" depends="compile">
        <manifestclasspath property="jar.classpath" jarfile="${jar-dir}/${ant.project.name}.jar">
          <classpath refid="classpath"/>
        </manifestclasspath>    
        <jar destfile="${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>
    </target>

    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <classpath>
                <path refid="classpath"/>
                <path location="${jar-dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>

</project>

为什么说找不到类文件?我认为通过创建helloworld jar文件,我实际上包括了外部库。

您需要使用
zipgroupfileset将所有jar组合在一起:

<target name="jar" depends="compile">
    <jar destfile="${jar-dir}/${ant.project.name}.jar" basedir="${classes-dir}">
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
        </manifest>
        <zipgroupfileset dir="${lib-dir}" includes="*.jar"/>
    </jar>
</target>


我找到了解决办法。基本上,我编译我的jar文件,并使用manifest文件将其指向外部jar文件

这是我的构建文件:

<project name="helloworld">
    <property name="src-dir" location="src"/>
    <property name="build-dir" location="build"/>
    <property name="classes-dir" value="${build-dir}/classes"/>
    <property name="dist-dir" location="dist"/>
    <property name="lib-dir" value="lib"/>
    <property name="jar-dir"     value="${build-dir}/jar"/>
    <property name="main-class"  value="android.HelloServer"/>

    <path id="classpath">
        <fileset dir="${lib-dir}" includes="**/*.jar"/>
    </path>

    <target name="clean" description="compile the source">
        <delete dir="${build-dir}" />
        <delete dir="${dist-dir}" />
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="init">
        <!-- Create the build directory structure used by compile -->
        <mkdir dir="${build-dir}"/>
        <mkdir dir="${classes-dir}"/>
        <mkdir dir="${jar-dir}"/>
        <!--<mkdir dir="${dist-dir}"/>-->
    </target>

    <target name="compile" depends="init" description="compile the source " >
        <javac srcdir="${src-dir}" destdir="${classes-dir}" classpathref="classpath" includeantruntime="false" />
        <!--<javac srcdir="${src-dir}" destdir="${build-dir}"/>-->
    </target>

    <target name="jar" depends="compile">
        <jar destfile="${jar-dir}/${ant.project.name}.jar" basedir="${classes-dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>

    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <classpath>
                <path refid="classpath"/>
                <path location="${jar-dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>

</project>
<project name="helloworld">
    <property name="src-dir" location="src"/>
    <property name="build-dir" location="build"/>
    <property name="classes-dir" value="${build-dir}/classes"/>
    <property name="dist-dir" location="dist"/>
    <property name="lib-dir" value="lib"/>
    <property name="jar-dir"     value="${build-dir}/jar"/>
    <property name="main-class"  value="android.HelloServer"/>

    <path id="classpath">
        <fileset dir="${lib-dir}" includes="**/*.jar"/>
    </path>

    <target name="clean" description="compile the source">
        <delete dir="${build-dir}" />
        <delete dir="${dist-dir}" />
    </target>

    <target name="cleanall" depends="clean"/>

    <target name="init">
        <!-- Create the build directory structure used by compile -->
        <mkdir dir="${build-dir}"/>
        <mkdir dir="${classes-dir}"/>
        <mkdir dir="${jar-dir}"/>
        <!--<mkdir dir="${dist-dir}"/>-->
    </target>

    <target name="compile" depends="init" description="compile the source " >
        <javac srcdir="${src-dir}" destdir="${classes-dir}" 
            classpathref="classpath" includeantruntime="false" />
        <!--<javac srcdir="${src-dir}" destdir="${build-dir}"/>-->
    </target>

    <target name="jar" depends="compile">
        <manifestclasspath property="jar.classpath" jarfile="${jar-dir}/${ant.project.name}.jar">
          <classpath refid="classpath"/>
        </manifestclasspath>    
        <jar destfile="${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>
    </target>

    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <classpath>
                <path refid="classpath"/>
                <path location="${jar-dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>

</project>

主要区别在于我在targer“jar”中添加了以下内容:



你好,凯文,谢谢你的回复。我读到用外部jar编译不是一个好主意?对吗?标准的做法是什么?这完全取决于你想如何包装你的应用程序。您可以使用lib dir进行打包,并提供一个启动脚本,将第三方jar放在类路径上。或者你可以把所有的东西组合成一个“法特加”。我不知道有一种方法一定更好——它们只是不同的方法。