Ant入門之引用外部jar文件


  筆者在java項目開發中經常遇到引用外部Jar包的情況,使用ant打包過程中需要對其引用。現在此簡單記憶以饗來者。

      此處引用Log4j,具體程序HelloLog4j.java:

package oata;

import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;

public class HelloLog4j {
    static Logger logger = Logger.getLogger(HelloLog4j.class);

    public static void main(String[] args) {
        BasicConfigurator.configure();
        logger.info("Hello Log4j");
    }
}

  MyMath具體程序:

package com.iie.test.ant;

public class MyMath {
      public int multi(int number1, int number2) {
        return number1 * number2;
      }
} 

  Main.java具體程序:

package com.iie.test.ant;

public class Main {
      public static void main(String[] args) {
        MyMath math = new MyMath();
        System.out.println("Result is: " + math.multi(5, 10));
      }
} 

  builder文件:

<?xml version="1.0" encoding="UTF-8"?>
<!--project 用於定義一個ant工程,其中的三項name、default、basedir缺一不可。
作用分別為:定義工程名、制定默認執行的任務、以及工程基礎的路徑型(它是計算其它路徑的基礎,一般情況下使用.即在java工程根目錄即可)-->
<project name="HelloWorld" default="jar" basedir=".">
    <!--描述,個人覺得就是一提示作用,沒什么實際用途-->
    <description>use jar test</description>
    <!--定義源文件路徑,其中的value換成location也行,使用value的時候,${src}得到的就是src這個值,如果使用location,得到的是src這個目錄的絕對路徑-->
    <property name="src" value="src" />
    <property name="classes" value="bin/classes" />

    <!--構造打包時Class-Path需要的路徑 -->
    <!--pathconvert用於對目錄進行組合 property即這個組合的名字,pathsep作用是各個文件之間的分隔符,
        如果不寫,在windows平台默認是分號。但時在MANIFEST.MF這個文件中,各個jar包之間要用空格區分,
        因此。這里就寫成空格了
    -->
    <pathconvert property="lib" pathsep=" ">
        <!--mapper,對路徑組合方式進行控制-->
        <mapper>
            <!--chainedmapper 作用是聯合多個mapper-->
            <chainedmapper>
                <!--過濾文件,將路徑去掉,只保留文件名-->
                <flattenmapper />
                <!--過濾+轉換器,將所有的文件名前面都加上一個lib,我們知道lib目錄下面有jar包,
                    lib/*的作用其實是將jar包名與路徑進行組合形成如:lib/google.jar這樣的相對路徑
                 -->
                <globmapper from="*" to="lib/*" />
            </chainedmapper>
        </mapper>
        <!--按照mapper定義的格式組合lib目錄下面的所有jar文件,形成諸如lib/jar1.jar lib/jar2.jar的字符串-->
        <fileset dir="lib">
            <include name="*.jar" />
        </fileset>
    </pathconvert>

    <!--組合各個路徑,構成MANIFEST.MF文件中Class-Path所需的字符串-->
    <property name="libs" value="${lib}" />

    <!--打印一下剛才構造好的字符串,看看是否符合要求-->
    <echo>libs   ${libs}</echo>

    <!-- 構造打包時Class-Path需要的路徑 結束-->

    <!--創建任務init,負責初始化一些條件-->
    <target name="init">
        <!-- 創建存放編譯后的class的目錄
            mkdir可以創建多級目錄 
        -->
        <mkdir dir="${classes}" />
    </target>

    <!--創建編譯任務,名字是compile,depends指定了comiple任務依賴init任務-->
    <target name="compile" depends="init" description="comile target">
        <!--javac,編譯,對應java中的javac命令。
        其中srcdir定義源文件路徑 destdir定義編譯后文件路徑,
        includeantruntime作用是指定編譯任務是否包含ant的classpath,可有可無,不影響編譯,
        但不寫可能會出現警告,為了眼不見心不煩,加上吧-->
        <javac srcdir="${src}" destdir="${classes}" includeantruntime="true">
            <!-- classpath 定義編譯需要的claspath -->
            <classpath>
                <fileset dir="lib">
                    <include name="*.jar" />
                </fileset>
            </classpath>
        </javac>
    </target>

    <!--打包開始,名字為jar,依賴任務為compile-->
    <target name="jar" depends="compile" description="make jar file">
        <!--jar操作,jarfile指定jar包存放路徑,basedir為編譯后的class的目錄-->
        <property name="jarfilename" value="HelloLog4j.jar" />
        <jar jarfile="${jarfilename}" basedir="${classes}">
            <!--為jar包指定manifest,當然,如果jar包不需要打成runnable的形式,manifest可以不要-->
            <manifest>
                <!--指定main-class-->
                <attribute name="Main-Class" value="oata.HelloLog4j" />
                <!--指定Class-Path-->
                <attribute name="Class-Path" value="${libs}">
                </attribute>
            </manifest>
        </jar>
        
        <property name="jarfilename2" value="Main.jar" />
        <!--jar操作,jarfile指定jar包存放路徑,basedir為編譯后的class的目錄-->
        <jar jarfile="${jarfilename2}" basedir="${classes}">
            <!--為jar包指定manifest,當然,如果jar包不需要打成runnable的形式,manifest可以不要-->
            <manifest>
                <!--指定main-class-->
                <attribute name="Main-Class" value="com.iie.test.ant.Main" />
                <!--指定Class-Path-->
                <attribute name="Class-Path" value="${libs}">
                </attribute>
            </manifest>
        </jar>
        
    </target>

    <!--運行一下jar包,試試看效果-->
    <target name="run" depends="jar">
        <!--其實這里就是運行jar命令,注意fork一定加上,不然不起作用-->
        <java jar="${jarfilename}" fork="true">
        </java>
        <java jar="${jarfilename2}" fork="true">
        </java>
    </target>


    <!-- 清理 -->
    <target name="clean">
        <!-- 可以以遞歸的方式刪除目錄 -->
        <delete dir="${classes}" />
        <delete dir="." includes="${ant.project.name}*.jar" />
    </target>
</project>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM