爲了這個功能提了不少問題都沒能獲得解答,最後終於本身搞定了,如今把大致步驟總結下,供你們參考指正linux
分三種狀況:
(1)沒有配置spring自動掃描
(2)2.5.*版本的spring
(3)3.*版本的springweb
下面的內容只寫了3.*spring版本的狀況spring
先將class文件加密
而後寫個解密的類加載器,繼承自webappclassloader(項目須要引入catalina.jar,這個包位於tomcat的lib目錄下),並配置到tomcat中去apache
tomcat中類加載器分爲多層:tomcat
Bootstrap | System | Common / \
Webapp1 Webapp2 ...
添加自定義類加載器的時候只須要繼承webappclassloader就行了。
而後將編譯好的class文件複製到{$Catalina_home}lib中去,這裏要注意,若是包名爲A.B,那麼要在lib中新建這兩個目錄,也就是說...libABMywebappclassloader.class
lib包有commonclassloader加載,通常只用於加載Tomcat發佈的標準jar包,其餘的第三方jar包能夠在catalina.properties中配置shared.loader,這裏因爲偷懶就直接放在lib下了,僞裝本身寫了個第三方庫。app
-----而後配置<context.../>元素
根據官方文檔,有多個地方配置。
通常來講會在項目中的META-INF中添加一個context.xml,裏面配置:框架
<context> <Loader loaderClass="a.b.common.classloader.MyClassLoader" /> </context>
這個配置文件在部署時,會被複制到{$Catalina_home}confCatalinalocalhost中去,並被從新命名爲:項目名.xml。webapp
因爲使用的項目中配置了加密
<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="../aaaa/*.jar"/>
來加載第三方庫,配置了我自定義加載器後,"../aaaa/*.jar" 這些jar包都沒法加載了。
目前個人解決辦法是註釋掉spa
<!--<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="../aaaa/*.jar"/>-->
而後在mywebappclassloader中使用addRepository()方法添加jar路徑(倉庫),代碼以下:
File jarDir=new File("E:\\front_tc\\aaaa"); if(jarDir.isDirectory()){ File[] jarFiles=jarDir.listFiles(new JarFileNameFilter()); for(File jarFile:jarFiles){ try { addRepository(jarFile.toURI().toURL().toString()); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
PS:
出自How Tomcat Works
最後在SSH框架下,因爲在spring.xml中配置了自動掃描
<context:component-scan base-package="a.b" />
因此a.b包下的類都會被spring自動加載
而spring自動加載時使用的類是SimpleMetadataReader
,因此要改寫他用於加載的類SimpleMetadataReader
這個類是spring核心包org.springframework.core-3.0.2.RELEASE.jar
中的,咱們不須要解壓這個包而後替換SimpleMetadataReader.class這麼麻煩,只須要在項目中建一個同名的類便可,部署到tomcat後會覆蓋掉spring中的類。
創建org.springframework.core.type.classreading
包,而後建一個SimpleMetadataReader
類。隨便去哪下spring的源碼,而後複製過來改一下便可
寫在最後:對於要部署在linux的同窗,記得把分隔符換成 System.getProperty("file.separator")。我往開發機上打加密補丁的時候,web.xml老是無端消失,不知道爲何