国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在jar包中動態載入第三方jar class問題

2019-11-18 15:21:21
字體:
來源:轉載
供稿:網友

  一、前言

在商業化開發中經常是將開發的類打成jar包發布.由于有很多第三方的提供功能集合Jar包,所以經常會用到這些功能包.以下情景是很多java開發人員經常碰到的:在開發,調試階段,通過在CLASSPATH中設置第三方的jar包路徑,自己編寫的class工作正常.開發完畢,部署的時候,將開發的class打成一個可執行jar包,會發現通過Class.forName(String classname) 或ClassLoader.getSystemClassLoader().loadClass(String classname)來動態載入存在于第三方jar包中的class會拋出異常” ClassNotFoundException.

這種問題存在于通過jar ?jar yourself.jar 來運行jar包,并在jar中的class中通過Class.forName(String classname)來動態載入第三方的class的時候.

常見的應用,比如根據用戶的選擇配置,動態載入不同廠商的JDBC Driver.

二、背景知識

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

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

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

3.1 Bootstrap classes

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

3.2 Extension classes

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

3.3 User classes

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

3.3.1 缺省值:調用Java或javawa的當前路徑(.),是開發的class所存在的當前目錄

3.3.2 CLASSPATH環境變量設置的路徑.假如設置了CLASSPATH,則CLASSPATH的值會覆蓋缺省值

3.3.3 執行Java的命令行-classpath或-cp的值,假如制定了這兩個命令行參數之一,它的值會覆蓋環境變量CLASSPATH的值

3.3.4 -jar 選項:假如通過java ?jar 來運行一個可執行的jar包,這當前jar包會覆蓋上面所有的值.換句話說,-jar 后面所跟的jar包的優先級別最高,假如指定了-jar選項,所有環境變量和命令行制定的搜索路徑都將被忽略.JVM APPClassloader將只會以jar包為搜索范圍.有關可執行jar有許多相關的安全方面的描述,可以參考http://java.sun.com/docs/books/tutorial/jar/ 來全面了解.

這也是為什么應用程序打包成可執行的jar包后,不能引用第三方jar包的原因.

四、解決方案.

首先我們簡要歸納一下,為了方便理解,簡化一下上面描述的架構,

Java定義了三種級別的class,分別為BootStrap class,Extend Class,User class.

其中User class限制規則最復雜.在User class中可執行的jar包,更包含獨立安全規則.所以解決方案基于Java三種不同級別的class擴展機制,有三種不同的方案.

4.1 BootStrap class擴展方案

Java 命令行提供了如何擴展bootStrap 級別class的簡單方法.

-Xbootclasspath:基本核心的Java class 搜索路徑.不常用,否則要重新寫所有Java 核心class

-Xbootclasspath/a: 后綴在核心class搜索路徑后面.常用.

-Xbootclasspath/p:前綴在核心class搜索路徑前面.不常用,避免引起不必要的沖突.

語法如下:

java ?Xbootclasspath/a:/path/myclass/account.jar: -jar yourself.jar(Unix用:號隔開)

java ?Xbootclasspath:/d:/myclass/account.jar; -jar yourself.jar(Window用;號隔開)

4.2 extend class 擴展方案

Java exten class 存放在{Java_home}jrelibext 目錄下.當調用Java時,對擴展class路徑的搜索是自動的.總會搜索的.這樣,解決的方案就很簡單了,將所有要使用的第三方的jar包都復制到ext 目錄下.

4.3 User class擴展方案

當使用-jar執行可執行Jar包時,JVM將Jar包所在目錄設置為codebase目錄,所有的class搜索都在這個目錄下開始.所以假如使用了其他第三方的jar包,一個比較可以接受的可配置方案,就是利用jar包的Manifest擴展機制.步驟如下

1.將需要的第三方的jar包,復制在同可執行jar所在的目錄或某個子目錄下.

比如:jar 包在 d:crmluncher.jar 那么你可以把所有jar包復制到d:crm目錄下或d:crmlib 子目錄下.

2.修改Manifest 文件

在Manifest.mf文件里加入如下行

Class-Path:classes12.jar lib/class12.jar

Class-Path 是可執行jar包運行依靠的要害詞.具體內容可以參考http://java.sun.com/docs/books/tutorial/ext/index.html

另外編寫自己的ClassLoader,來動態載入class,是更加復雜和高級技術.限于篇幅,不贅述.有愛好了解可以去Google一下custom classloader

4.4 推薦方案 4.1,擴展性非常好.

五、總結

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

本文所測試基于jdk 1.4.1_03 for windows 。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝坻区| 桃源县| 泰顺县| 北流市| 南平市| 彩票| 福安市| 邹城市| 泾阳县| 比如县| 宜兰市| 贺州市| 高密市| 沁水县| 罗甸县| 巴林左旗| 阿荣旗| 徐闻县| 水富县| 吉林市| 都昌县| 阳东县| 筠连县| 大英县| 周宁县| 武川县| 丰台区| 怀来县| 东丽区| 陆河县| 东阳市| 常熟市| 通渭县| 比如县| 安达市| 儋州市| 尼木县| 类乌齐县| 两当县| 克拉玛依市| 普定县|