欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
One-Jar之旅
http://blog.csdn.net/itkbase/archive/2008/03/11/2169825.aspx
 
1             問(wèn)題的提出
作為一個(gè)經(jīng)常使用Java編程的程序員,當我在發(fā)布我的Java程序的時(shí)候,我習慣于這樣組織所有的程序和資源:主程序放到JVM系統變量“user.dir”所指向的目錄中(假設是MyAppDir目錄),程序所用到的工具類(lèi)(通常是打好包的jar文件)放到MyAppDir/lib/目錄,其他資源(如圖片等)放到MyAppDir/res/目錄,然后寫(xiě)一個(gè)批處理文件,在里面設置好環(huán)境變量和各種路徑,最后將所有的這些東西交給用戶(hù)。但是如果這個(gè)程序不是很大的話(huà),是不是心里覺(jué)得這么多目錄和文件有點(diǎn)不夠簡(jiǎn)潔?會(huì )不會(huì )覺(jué)得運行bat文件出來(lái)的那個(gè)Dos窗口有點(diǎn)礙眼?會(huì )不會(huì )羨慕Windows編程人員可以把所有資源和程序都放到一個(gè)exe文件中?下面我們就來(lái)著(zhù)手解決這些問(wèn)題。
2             解決方案
我們先提出一個(gè)實(shí)際的例子來(lái)說(shuō)明這個(gè)問(wèn)題:我的應用程序的主類(lèi)為cn.edu.hlju.ica.app.Main,它位于mainApp.jar。Main類(lèi)需要用到位于tools.jar中的com.util.Tool類(lèi)。通常的做法是將tools.jar放到MyAppDir/lib/目錄下,然后執行
java  –classpath  .;./lib/tools.jar  –jar  mainApp.jar
但是如果我想把tools.jar和mainApp.jar打包到一起,把它們都放到OneJarApp.jar中,然后只需要執行
java –jar OneJarApp.jar
這樣該多好啊,尤其是當你需要的jar文件比較多的時(shí)候,無(wú)論是這些jar包的組織,還是bat文件的書(shū)寫(xiě)都是挺麻煩的事。下面我們就分析一下解決方法。
n        第一種:也是最容易想到的方法,就上例來(lái)說(shuō),我們可以將tools.jar和mainApp.jar都展開(kāi),然后將com.util.Tool(本來(lái)位于tools.jar中)和cn.edu.hlju.ica.app.Main(本來(lái)位于mainApp.jar中)一起打包成OneJarApp.jar。有很多開(kāi)發(fā)環(huán)境如JBuilder或干脆用jar命令都可以很容易做到,但是這樣做會(huì )產(chǎn)生一些很?chē)乐氐膯?wèn)題:如果Main類(lèi)不只需要一個(gè)而是需要兩個(gè)分別位于toolsOne.jar和toolsTwo.jar中的類(lèi)com/a/A.class和com/b/B.class,而A和B都需要引用在各自的jar文件中com/目錄下的一個(gè)資源,比如說(shuō)是com/log4J.property,這時(shí)如果將它們展開(kāi),并入到一個(gè)jar文件的時(shí)候,你該選擇哪一個(gè)資源呢?再有,如果toolsTwo.jar的許可明確要求你再重新發(fā)布之前不能修改它,你該怎么辦?這種方法顯然不夠通用,而且在某些情況下回出現問(wèn)題。
n        第二種:在回過(guò)頭來(lái)看我們的實(shí)例,既然不能把現有的tools.jar文件展開(kāi),那我們干脆就把它和mainApp.jar一起打包成OneJarApp.jar中行嗎?即下面的組織形式:
OneJarApp.jar
              |--META-INF/MANIFEST.MF
              |--mainApp.jar
                     |--cn/edu/hlju/ica/app/Main.class
              |--tools.jar
                     |--com.util.Tool
然后我們在MANIFEST.MF中制定Class-Path屬性,希望類(lèi)裝載器在啟動(dòng)程序的同時(shí)也可以正確
的裝載其他jar文件。很不幸,這樣做是行不通的。因為系統類(lèi)裝載器并不能從嵌入的jar
(tools.jar就是嵌入到了OneJarApp.jar中)文件中讀取所需的類(lèi)。所以我們需要使用自定義類(lèi)
裝載器來(lái)完成這項工作,不過(guò)不用擔心,開(kāi)源工程O(píng)ne-JAR已經(jīng)為我們做好了相關(guān)工作,我們只需
很少幾步操作就可以達成目的。
3             One-Jar簡(jiǎn)介
One-Jar是SourceForge上的一個(gè)開(kāi)源工程,它使用自定義的類(lèi)裝載器從嵌入的jar文件中載入類(lèi)和資源,從而可以使原來(lái)的程序中所有用到的jar文件(包括主類(lèi)所在的jar文件)都打包到一個(gè)jar文件中,且原來(lái)的程序不需要做任何修改,然后我們就可以簡(jiǎn)單的通過(guò)java –jar OneJarApp.jar來(lái)運行該應用程序,是不是很理想?
該工程短小精悍,只有三個(gè)類(lèi),分別是:
com.simontuffs.onejar.JarClassLoader
com.simontuffs.onejar.Boot
com.simontuffs.onejar.Handler
它的實(shí)現原理是:程序運行之初首先由One-Jar接手,它先通過(guò)其自定義的類(lèi)裝載器裝載嵌入的各個(gè)jar文件,然后利用reflectionAPI調用你的應用程序的主函數,使你的應用程序得以執行。但是它對各個(gè)嵌入的jar文件在宿主jar文件中的位置有一定的要求,即含有主類(lèi)的jar文件必須放在宿主jar文件的main/目錄下,其他的jar文件放到宿主jar文件的lib/目錄下。還是上面的例子,主類(lèi)cn.edu.hlju.ica.app.Main位于mainApp.jar中,Main所用到的com.util.Tool位于tools.jar中,最終要將它們都打包成OneJarApp.jar,其目錄結構應如下
OneJarApp.jar
              |--META-INF/MANIFEST.MF
              |--main
|--mainApp.jar
                            |--META-INF/MANIFEST.MF
                            |--cn/edu/hlju/ica/app/Main.class
              |--bin
|--tools.jar
                            |--com.util.Tool
              |--com/simontuffs/onejar
                     |-- Boot.class
                     |-- Handler.class
                     |-- JarClassLoader.class
注意,這里的(紅色)MANIFEST.MFOne-JAR工程自帶的
,而不是你的應用程序的(綠色)MANIFEST.MF(你應用程序的MANIFEST.MFmainApp.jar中
);而One—Jar工程的三個(gè)類(lèi)也必須包含在OneJarApp.jar中。
下面是各個(gè)類(lèi)的代碼
Main.java
package cn.edu.hlju.ica.app;
import com.util.*;
public class Main {
                     public static void main(String[] args) { 
                            new Tool();
                     }
              }
 
              Tool.java
              package com.util;
public class Tool {
                     static {
                            System.out.println("創(chuàng )建了一個(gè)Win32版的Tool實(shí)例");
                     }    
}

目錄結構如下
最外層的MANIFEST.MF文件內容如下:
Manifest-Version: 1.0
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Expand: expand,doc
執行結果
4             擴展應用
僅僅做到以上功能是不夠的,我們在解決實(shí)際問(wèn)題時(shí)還會(huì )遇到一些更為復雜的情況。比如說(shuō)如果我們要做串口通信的程序,需要用到SUN的串口包c(diǎn)omm.jar,但是Windows平臺和Linux平臺的串口包雖然API名字相同但是內部實(shí)現卻不同。所以如果我的程序需要跨平臺使用的話(huà),就需要在執行期動(dòng)態(tài)選擇相應的串口包。但是按照上面的方法,我們的兩個(gè)串口包都要放宿主jar文件的lib/目錄下,這時(shí)會(huì )發(fā)生什么情況呢?會(huì )不會(huì )發(fā)生混淆呢?答案是會(huì ),并且One-Jar也作了一些比較初級的處理操作。還是拿我們上面那個(gè)例子。我的程序要同時(shí)支持Windows平臺和Linux平臺,所以我的com.util.Tool有兩個(gè)版本,分別打包到tools_windows.jar和tools_linux.jar中,然后我將它們都放到OneJarApp.jar的lib/目錄下,執行-Done-jar.verbose來(lái)查看執行的詳細信息:
我們看到,2的位置One-Jar的ClassLoader載入了Linux版的Tool;3的位置上,類(lèi)裝載器又試圖載入Tool類(lèi)的windows版,但是從下面畫(huà)線(xiàn)部分我們可以看到,Tool的windows版并沒(méi)有載入成功,因為類(lèi)裝載器不能兩次載入同一個(gè)類(lèi),雖然它們實(shí)現不同,但是它們的名字一樣,都是com.util.Tool,所以windows版就被之前載入的Linux版屏蔽了。從4看到程序可以正常運行。但是One-Jar并沒(méi)有給我們控制到底選哪一個(gè)的權力,所以我們需要對One-Jar修改和擴充。
我們的目標是One-Jar的自定義的類(lèi)裝載器,我們只需要控制其類(lèi)的裝載過(guò)程,即JarClassLoader的load(String,String)方法,就可以達到我們的目的。我們首先看一下load()方法的主要部分:
public String load(String mainClass, String jarName) {
………省略
       if (jarName == null) {
                            jarName = System.getProperty(JAVA_CLASS_PATH);
                     }
                     //獲得jarName所代表的jar文件中所包含的的全部項目
                     JarFile jarFile = new JarFile(jarName);
                     Enumeration myEnum = jarFile.entries();
                     Manifest manifest = jarFile.getManifest();
                     while (myEnum.hasMoreElements()) {
                            JarEntry entry = (JarEntry)myEnum.nextElement();
                            if (entry.isDirectory())
                                   continue;
                            ………省略
                            //打印提示信息
                            INFO("caching " + jar);
                                VERBOSE("using jarFile.getInputStream(" + entry + ")");
                                   {
// Note: loadByteCode consumes the input stream, so make sure //its scope
                                          // does not extend beyond here.
//注意以下部分
                                          InputStream is = jarFile.getInputStream(entry);
                                          if (is == null)
throw new IOException("Unable to load resource /" + jar + " using " + this);
                                          loadByteCode(is, jar);      
                                   }
                            ………省略
}
請注意看紅顏色的部分,One-Jar在這里直接用JarEntry entry生成輸入流,再由loadByteCode()載入其字節
碼,請注意,這里的entry就是要嵌入的jar文件對象,即tools_windows.jar或tools_linux.jar,如果我們在語(yǔ)句
InputStream is = jarFile.getInputStream(entry);
之前判斷一下本地操作系統的類(lèi)型,再結合jar文件的后綴”_windows”或”_linux”就可以選擇性的載入與
本地操作系統相配的jar文件了。為此,我生成了JarClassLoaderEx類(lèi),它是JarClassLoader的子類(lèi),并且只
覆些了JarClassLoader的load(String,String)方法。我們需要通過(guò)JVM屬性(我自己定義的屬:loader.type)
進(jìn)行控制,如果loader.type=exLoader,則選擇采用JarClassLoaderEx,否則保持不變,仍然采用
JarClassLoader。為達到這一目的,我們需要在com.simontuffs.onejar.Boot類(lèi)中判loader.type屬性的值如果
是ExLoader就生成JarClassLoaderEx實(shí)例,否則就生成JarClassLoader實(shí)例。重要代碼片斷如下:
這里我定義了一個(gè)osType,用來(lái)判定本地操作系統的類(lèi)型。接下來(lái)
我們通過(guò)jar文件的后綴,就可以判斷它是否是適合本地平臺了,如果不適合就跳過(guò)此jar文件的裝載過(guò)程。上
面已經(jīng)有了Windows版的Tool類(lèi),這里再給出Linux版的Tool類(lèi)的實(shí)現:
Tool.java--------Linux
              package com.util;
public class Tool {
                     static {
                            System.out.println("創(chuàng )建了一個(gè)Linux版的Tool實(shí)例");
                     }    
}
下面我們來(lái)看一下結果,首先我們設置JVM系統屬性”os.name”為Windows系統時(shí):
當我們設定”os.name”為L(cháng)inux系統時(shí):
5             后記
通過(guò)研究Boot類(lèi)的代碼我們可以看到,One-Jar有一個(gè)默認的設置JVM系統變量的的機制,即將一個(gè)one-jar.property的文件放到最終的jar文件的根目錄下:
你可以在其中設置一些你自己的屬性對,由One-Jar負責幫你將其添加加到JVM中。
6             結束語(yǔ)
至此,我們的One-Jar之旅也告一段落了,相信你看完這篇短文后也能自己動(dòng)手定制屬于你自己的One-Jar來(lái)實(shí)現更豐富的功能,充分享受開(kāi)源給我們帶來(lái)的美妙世界。我是用Eclipse來(lái)編寫(xiě)全部代碼的,如果有需要源碼的話(huà),請和我聯(lián)系。 

One-Jar主頁(yè):http://one-jar.sourceforge.net/

(#)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Android app中加載jar插件
idea打jar包沒(méi)有MANIFEST文件坑
使用Java Service Wrapper將Java程序發(fā)布成Windows Servi...
用 One-JAR 簡(jiǎn)化應用程序交付
制作可執行的jar文件包及jar命令詳解 - 老康的專(zhuān)欄
class文件打包
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久