




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、背景 項目上使用的Weblogic版本為12.1.1,我們用JAWR來減少壓縮JS和CSS,JAWR默認使用JSMin來壓縮JS,我嘗試修改JAWR的JS壓縮器為壓縮率更高的YUI Compressor,YUI依賴javascript解析器js.jar,由于Weblogic自身已經包含了js.jar中的class,所以我們將js.jar放在weblogic的domain lib下,并修改了weblogic的啟動腳本使得啟動的時候先加載項目用到的js.jar。問題 修改JAWR的JS壓縮器為YUI后,在Tomcat下測試通過,但在Weblogic下報如下的錯誤:1 Ileg
2、eAccessException2 Caused By: java.lang.IllegalAccessError: tried to access class org.mozilla.javascript.DefaultErrorReporter from class pilerEnvirons3 apilerEnvirons.<init>(CompilerEnvirons.java:48)4 apressor.JavaScriptCompressor.parse(JavaScriptCompressor.java:310)5 apressor.JavaScriptCompres
3、sor.<init>(JavaScriptCompressor.java:533)6 at net.jawr.web.resource.bundle.postprocess.impl.yui.YUIJSCompressor.doPostProcessBundle(YUIJSCompressor.java:66)7 at net.jawr.web.resource.bundle.postprocess.AbstractChainedResourceBundlePostProcessor.postProcessBundle(AbstractChainedResourceBundlePo
4、stProcessor.java:71)8 Truncated. see log complete stacktrace初步懷疑是jar包沖突。可能是因為錯誤里涉及的2個類是由不同的類加載器加載引起的。Java類加載器解決問題前,先了解下Java類加載器的原理。我們知道java中所有類都是通過類加載器ClassLoader來加載的,Java提供了四種類加載器:1. BootStrap:在java虛擬機啟動的時候會利用這個類加載器來加載System.getProperty("sun.boot.class.path")所指定的路徑或jar,一般為JDK安裝目錄下的 /JRE/L
5、IB/rt.jar,這個類加載器不是類 ,只是作為一個java中類的起源工具。BootStrap是用C+語言寫的。2. ExpClassLoader:這個類加載器加載System.getProperty("java.ext.dirs")所指定的路徑或jar,一般為JDK安裝目錄下的/JRE/LIB/ext 目錄中的類 我們只要把我們的類打包成JAR包放在這里即可。3. AppClassLoader:這個類加載器加載System.getProperty("java.class.path")所指定的路徑或jar。我們在java程序中classpath對應的類
6、都由這個AppClassLoader導入進來。4. URLClassLoader用來加載網絡上遠程的類。這4種ClassLoader的優先級依次從高到低。在java中,一個類通過認證的類全名來唯一標識。認證的類全名是由包名和類名兩部分組成。但是在一個類被加載到JVM中則是通過認證的類全名,還有加載這個類的加載器來唯一標識。因此,一個類的類名為C1,包名為Pg,被類加載器類KClassLoader的一個實例k1加載,則C1,也就是C1.class ,的類實例,在JVM中將被解釋為(C1,Pg,k1)。這就意味著兩個不同的類加載器實(Cl, Pg, kl1)
7、;和 (Cl, Pg, kl2) ,加載的類在JVM中將有不同的類實例對象,不是類型可比型(type-compatible)的。雙親委派模型如果一個網絡類裝載器被請求裝載一個java.lang.Integer,它會首先把請求發送給上一級的類路徑裝載器,如果返回已裝載,則網絡類裝載器將不會裝載這個java.lang.Integer,如果上一級的類路徑裝載器返回未裝載,它才會裝載java.lang.Integer。類似地,類路徑裝載器收到請求后(無論是直接請求裝載還是下一級的ClassLoader上傳的請求),它也會先把請求發送到上一級的標準擴展類裝載器,這
8、樣一層一層上傳,于是啟動類裝載器優先級最高,如果它按照自己的方式找到了java.lang.Integer,則下面的ClassLoader 都不能再裝載java.lang.Integer,盡管你自己寫了一個java.lang.Integer,試圖取代核心庫的java.lang.Integer是不可能的,因為自己寫的這個類根本無法被下層的ClassLoader裝載。 Weblogic類加載器Weblogic默認情況下采用的是parent first的方式。但這個parent first,是有“講究”(tricky)的。 1. 父類加載器和子類加載器之間的關系類似于Java中,父
9、類和子類之間的對象關系。 2. Weblogic會將所有load到的class緩存到cache中。(子類classloader能看到父類classloader加載到cache中的class)。 默認情況下,當我們的應用程序(ear,war)運行時,會先去cache中查找class,如果找不到。就去System Classpath loader 里去找class。如果System Classpath loader里能找到你需要的類,那么不好意思,你在ear和war包里包含的class就沒用了。如果System ClassPath Loader找不到,接下來去ear的class
10、 path里找,接著去EJB class path里找,最后到war的class path里找。一旦找到了該類,就會load起這個類,并將該類放入cache中。 總的來說,Weblogic的ClassLoader有如下幾個層次,按照從高到低順序排列:1. JDK Classloader2. JDK ext Class Loader3. Weblogic System Class Loader4. Domain Class Loader(Child of System Class Loader)5. App Class Loader6. Web
11、 Class Loader7. JSP Class Loader可以從Weblogic官方文檔獲取更多的關于Weblogic ClassLoader的信息:Root CauseJava語言規定,在同一個包中的class,如果沒有修飾符,默認為Package權限,包內的class都可以訪問。但是這還不夠準確。確切的說,只有由同一個ClassLoader裝載的class才具有以上的Package權限。比如啟動類裝載器裝載了java.lang.String,類路徑裝載器裝載了我們自己寫的java.lang.Test,它們不能互相訪問對方具有Package權限的方法。這樣就阻止了惡意代碼訪問
12、核心類的Package權限方法。在上面的問題中,當應用啟動時,WAR包的加載器會加載類CompilerEnvirons,這個類有一個static的屬性引用了DefaultErrorReporter,然后到Cache中查找該類是否加載,可能Weblogic在啟動的時候已經用到了類DefaultErrorReporter(待驗證,可以通過getClassLoader來獲取加載器類,也可以通過weblogic提供的CAT工具來分析), 也就是說該類已經存在Cache中了,所以導致CompilerEnvirons和DefaultErrorReporter由不同的加載器加載,CompilerEnviro
13、ns不能訪問只有包訪問級別的DefaultErrorReporter(該類沒有加public修飾符)。解決辦法修改weblogic的啟動腳本startWebLogic.sh,將YUI Compressor jar放在所有jar包的前面加載,修改如下:CLASSPATH= "js.jar: $SAVE_CLASSPATH"。另外,weblogic提供了一個標簽<prefer-web-inf-classes> ,這個標簽默認是false的,只要設置這個標簽為true,就可以讓WEB-INF里的類先被load到了。但這個并不能解決上面的問題,因為類DefaultErr
14、orReporter已經被更高級別的加載器加載了,當應用需要使用該Class時,只會從Cache中獲取。參考Weblogic與Java類加載器原理試驗解析Weblogic10 Classloading 問題java中的類加載機制(一)java中的類加載機制(二) 深入研究java類加載機制Weblogic 官方文檔原文來自:I updated the Rhino (js.jar) to 1.7R1 and updated the weblogic.xml to <weblogic-web-app xmlns="" xmlns:xsi="&
15、quot; xsi:schemaLocation=" "> <jsp-descriptor> <keepgenerated>true</keepgenerated> <debug>true</debug> </jsp-descriptor> <container-descriptor> <prefer-application-packages>
16、160; <package-name>org.mozilla.javascript.*</package-name> <package-name>org.mozilla.classfile.*</package-name> </prefer-application-packages> </container-descriptor></weblogic-web-app>原文來自:s
17、aintrenault saintrenault saintrenault 等級: New Member 帖子: 4 加入日期: 2009年3月15日 最近的帖子 I also encountered the same problem, and I got a solution.1.If you startup weblogic in enclipse, you can configure the weblogic, in the Paths configurations, you can add the rhino.jar to the "Prepend to classpath&
18、quot; , restart your weblogic and it will be ok.2.If you startup using startweblogic.cmd, you just need to change the set classpath property.in windows enviroment:you need to change the file : beauser_projectsdomainsyourdomainbin startweblogic.cmd,change this row -set CLASSPATH=%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%-to -set CLASSPATH=E:bea9user_projectsdomainsliferaylibrhino.jar;%CLA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司視頻腳本策劃方案
- 公司美食類活動方案
- 公司水果采摘活動方案
- 公司植樹掛牌活動方案
- 公司深圳灣公園活動方案
- 公司組織騎單車活動方案
- 公司旅游業余活動方案
- 公司羽毛球例行活動方案
- 公司溫泉團建策劃方案
- 公司線上周年慶活動方案
- 消毒規范課件教學課件
- 生態養殖羊圈施工合同
- 撤并小學資產移交方案
- 手繪玻璃杯創意課程設計
- 傳感器的種類課件
- 2023年國網山西省電力公司提前批招聘考試真題
- 《珍愛生命拒絕毒品》主題班會課件
- 墻布窗簾購銷合同協議書
- 計算機網絡的拓撲結構 教學課件
- 華為質量回溯(根因分析與糾正預防措施)模板
- 山東省煙臺市牟平區(五四制)2023-2024學年八年級下學期期末語文試題(原卷版)
評論
0/150
提交評論