<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一個簡單的Ant的build.xml示例(附:jar包的正確運行方法)

         以前在寫作業時曾經嘗試用過Ant去編譯和運行Java程序,不過后來好久沒用,都不怎么會用了。下邊是前幾天寫的一個build.xml文件的例子,以后可以拿來當參照了,不過有點小問題還不知道怎么改!以前忘了Jar包的正確運行方式,導致不能正確運行打包以后的jar包,現已更正!

          說明:lib目錄存放第三方類庫,src目錄存放待編譯的Java源文件!

    <?xml version="1.0" encoding="GB2312" ?>

    <!DOCTYPE project>

    <project name="JavaMailClient" default="usage" basedir=".">
          <property name="project-name" value="JavaMailClient"/>

          <property name="build" value="build"/>
          <property name="lib" value="lib"/>
          <property name="src" value="src"/>
          <property name="build.classes"      value="${build}/classes" />
          <property file="build.properties"/>
     

          <property name="jar.dir"     value="jar"/>
          <property name="jar-file-name"      value="${project-name}" />

          <path id="Third-Part Lib">
                <fileset dir="${lib}">
                      <include name="**/*.jar" />
                </fileset>
          </path>
     
          <target name="usage" description="Build file usage info (default task)">
                <echo message=" " />
                <echo message="${project-name} " />
                <echo message="-------------------------------------------------------" />
                <echo message="Available Targets:" />
                <echo message=" ***" />
                <echo message=" Compiling:" />
                <echo message="  compile  - Compiles the source code" />
                <echo message=" ***" />
                <echo message=" Cleaning up:" />
                <echo message="  clean - Delete class files" />
                <echo message=" ***" />
                <echo message=" JAR:" />
                <echo message="  jar  - Generate an .jar for source code" />
                <echo message=" ***" />
                <echo message=" Executing:" />
                <echo message="  run  - Execute the  JavaMail client ! Get email of the latest two days  from server" />
                <echo message=" ***" />
                <echo message="-------------------------------------------------------" />
          </target>

          <target name="prepare" >
                <mkdir dir="${build.classes}" />
                <mkdir dir="${jar.dir}" />
          </target>

          <target name="clean" >
                <delete dir="${build}" />
                <delete dir="${jar.dir}" />
          </target>
     
          <target name="compile" depends="clean,prepare">
          <echo message="Compiling the source code!"/>
                <javac
                      srcdir="${src}"
                      destdir="${build.classes}"
                      deprecation="true"
                      failonerror="true" debug="true"
                      >
                      <classpath refid="Third-Part Lib"/> 
                </javac>
          </target>


          <!-- <target name="run" description="Receive email! "  depends="compile"> -->
          <!-- 已經可以正確運行!注意:classpath="${build.classes}" 一定要加上,否則會報"java.lang.NoClassDefFoundError"的錯誤!-->
          <!--
          <target name="run" description="Receive email! ">
                <java classname="POP3MailReceiver" classpath="${build.classes}" fork="true" maxmemory="256m">
                      <classpath refid="Third-Part Lib"/> 
                </java>
          </target>
          -->

          
          <target name="run"  description="Receive email! ">
                <java jar="${jar.dir}/${jar-file-name}.jar" fork="true" maxmemory="256m"/>
          </target>

          <target name="jar" depends="compile">
                <jar destfile="${jar.dir}/${jar-file-name}.jar" basedir="${build.classes}">
                      <manifest>
                            <!-- 此處需要根據需要進行修改 -->
                            <attribute name="Main-Class" value="POP3MailReceiver"/>
                            <attribute name="Class-Path" value="../${lib}/commons-email-1.0.jar ../${lib}/mail.jar ../${lib}/activation.jar"/>
                      </manifest>
                </jar>
          </target>
    </project>


    附:Jar包的正確運行方法(轉)

    -jar參數運行應用時classpath的設置方法 

           你是否在使用java -jar參數運行打包好的jar應用程序的時候發現應用程序無法找到classpath下設置好的第三方類庫的內容?無論怎么設置classpath參數都無濟于事,總是會報ClassNotFound的錯誤?那么本篇帖子可以幫助你擺脫煩惱 :)
          當用java -jar yourJarExe.jar來運行一個經過打包的應用程序的時候,你會發現如何設置-classpath參數應用程序都找不到相應的第三方類,報ClassNotFound錯誤。實際上這是由于當使用-jar參數運行的時候,java VM會屏蔽所有的外部classpath,而只以本身yourJarExe.jar的內部class作為類的尋找范圍。

    解決方案

    一 BootStrap class擴展方案
          Java 命令行提供了如何擴展bootStrap 級別class的簡單方法:
                -Xbootclasspath:     完全取代基本核心的Java class 搜索路徑.
                                       不常用,否則要重新寫所有Java 核心class
                -Xbootclasspath/a: 后綴在核心class搜索路徑后面.常用!!
                -Xbootclasspath/p: 前綴在核心class搜索路徑前面.不常用,避免
                                       引起不必要的沖突.
    語法如下:
     (分隔符與classpath參數類似,unix使用:號,windows使用;號,這里以unix為例)
     java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

    二 extend class 擴展方案
          Java exten class 存放在{Java_home}\jre\lib\ext目錄下.當調用Java時,對擴展class路徑的搜索是自動的.總會搜索的.這樣,解決的方案就很簡單了,將所有要使用的第三方的jar包都復制到ext 目錄下.
          (自評:不推薦使用,自適應性很差?。?/font>

    三 User class擴展方案
         
    當使用-jar執行可執行Jar包時,JVM將Jar包所在目錄設置為codebase目錄,所有的class搜索都在這個目錄下開始.所以如果使用了其他第三方的jar包,一個比較可以接受的可配置方案,就是利用jar包的Manifest擴展機制.
    步驟如下:
    1.將需要的第三方的jar包,復制在同可執行jar所在的目錄或某個子目錄下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包復制到/usrhome目錄下或/usrhome/lib 等類似的子目錄下.
    2.修改Manifest 文件
     在Manifest.mf文件里加入如下行
     Class-Path:classes12.jar lib/thirdlib.jar
     Class-Path 是可執行jar包運行依賴的關鍵詞.詳細內容可以參考:http://java.sun.com/docs/books/tutorial/ext/index.html


          以上三種方法推薦第一種,擴展性好,操作起來也最方便.
          另外編寫自己的ClassLoader,來動態載入class,是更加復雜和高級技術.限于篇幅,不贅述.有興趣了解可以去google一下custom classloader

          Java的安全機制隨不同的JDK版本有不同的變化,會影響很多核心CLASS,比如Thread,所以很多大型商業軟件,要求JDK的版本很嚴格.部分原因也在此.這也要求在發布自己編寫的應用時候,不管大小,都要說明開發和測試的JDK版本.


    本文所述方法測試基于j2sdk 1.4.2_04-b05

    ----------------------------------------------------------------------------------------------

    附:背景知識

          自JDK 1.2以后,JVM采用了委托(delegate)模式來載入class.采用這種設計的原因可以參考http://java.sun.com/docs/books/tutorial/ext/basics/load.html

          歸納來講:是基于JVM sandbox(沙盒)安裝模型上提供應用層的可定制的安全機制.

          Java虛擬機(JVM)尋找Class的順序

    1. Bootstrap classes

    屬于Java 平臺核心的class,比如java.lang.String等.及rt.jar等重要的核心級別的class.這是由JVM Bootstrap class loader來載入的.一般是放置在{java_home}\jre\lib目錄下

    2. Extension classes

    基于Java擴展機制,用來擴展Java核心功能模塊.比如Java串口通訊模塊comm.jar.一般放置在{Java_home}\jre\lib\ext目錄下

    3. User classes

    開發人員或其他第三方開發的Java程序包.通過命令行的-classpath或-cp,或者通過設置CLASSPATH環境變量來引用.JVM通過放置在{java_home}\lib\tools.jar來尋找和調用用戶級的class.常用的javac也是通過調用tools.jar來尋找用戶指定的路徑來編譯Java源程序.這樣就引出了User class路徑搜索的順序或優先級別的問題.

     3.1 缺省值:調用Java或javawa的當前路徑(.),是開發的class所存在的當前目錄
     3.2 CLASSPATH環境變量設置的路徑.如果設置了CLASSPATH,則CLASSPATH的值會覆蓋缺省值
     3.3 執行Java的命令行-classpath或-cp的值,如果制定了這兩個命令行參數之一,它的值會覆蓋環境變量CLASSPATH的值
     3.4 -jar 選項:如果通過java -jar 來運行一個可執行的jar包,這當前jar包會覆蓋上面所有的值.換句話說,-jar 后面所跟的jar包的優先級別最高,如果指定了-jar選項,所有環境變量和命令行制定的搜索路徑都將被忽略.JVM APPClassloader將只會以jar包為搜索范圍.
    有關可執行jar有許多相關的安全方面的描述,可以參考http://java.sun.com/docs/books/tutorial/jar/ 來全面了解.

    這也是為什么應用程序打包成可執行的jar包后,不管你怎么設置classpath都不能引用到第三方jar包的東西了.
     

    posted on 2008-01-08 18:43 靈! 閱讀(5596) 評論(1)  編輯  收藏 所屬分類: Java專題-部署打包

    評論

    # re: 一個簡單的Ant的build.xml示例(附:jar包的正確運行方法) 2014-01-22 23:19 xyy

    謝謝  回復  更多評論   

    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    • 隨筆 - 53
    • 文章 - 0
    • 評論 - 3
    • 引用 - 0

    隨筆分類

    隨筆檔案

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲∧v久久久无码精品| 亚洲不卡AV影片在线播放| 久久久久久亚洲av成人无码国产| 男人免费视频一区二区在线观看| 国产最新凸凹视频免费| 国产亚洲精品第一综合| 国产大片91精品免费看3| 亚洲精品无码久久久久APP | 国产免费拔擦拔擦8X高清在线人| 久久久久亚洲av成人无码电影| 日韩免费在线中文字幕| 亚洲午夜AV无码专区在线播放| j8又粗又长又硬又爽免费视频| 亚洲色欲一区二区三区在线观看| 久久久久久久99精品免费观看| 亚洲一区二区三区电影| 免费黄色福利视频| 亚洲精品自偷自拍无码| 亚洲精品无码你懂的网站| 久久毛片免费看一区二区三区| 亚洲av无码一区二区三区网站| 久久久久av无码免费网| 亚洲欧美自偷自拍另类视| 亚洲精品视频久久久| 免费精品一区二区三区第35| 亚洲人成网站在线观看播放动漫| 国语成本人片免费av无码| 欧洲精品码一区二区三区免费看| 国产V亚洲V天堂无码久久久| 在线观看永久免费| 一级毛片不卡免费看老司机| 国产AV无码专区亚洲AVJULIA| 四虎在线视频免费观看视频| 久久久久久久久无码精品亚洲日韩| 亚洲日韩涩涩成人午夜私人影院| 久久免费视频网站| 亚洲人AV在线无码影院观看| 亚洲国产黄在线观看| 亚洲免费在线播放| MM1313亚洲国产精品| 亚洲AV无码一区东京热久久|