solr6.4.2之webservice兼容升級

摘要:此次solr底層升級是一次比較大的升級。從底層搜索引擎 solr4.8 升級到 solr6.4.2,因爲solr底層從6.x開始以來的jdk必須指定爲1.8,並且不少內部實現類都已經廢棄或者乾脆被砍掉了,這樣就致使了不少實現類都須要進行兼容性的處理,第三方依賴的庫也須要跟着進行升級改造。例如IK詞庫加載,就須要手動編譯修改源代碼,具體能夠參考個人另一篇博客: http://www.cnblogs.com/liang1101/articles/6395016.html 本篇主要是從應用實現、兼容修改以及項目發佈遇到的問題和對應解決辦法進行詳細的講解。
應用項目:公司內部本身搭建的一套對外提供webservice服務,提供相應的接口爲各個項目組調用使用。該webservice服務底層使用spring容器管理、hibernate數據庫鏈接管理的方式,結合 solr、lucene 相關依賴包所實現的系統。
起始背景:原始版本使用:eclipse4.3 + JDK1.7 + solr-solrj-4.8.0 + lucene-core-4.8.0 + spring-core2.5.6 等主要相關依賴包。固然還有相應的 lucene-queryparser、lucene-highlighter、lucene-memory、hibernate-core-4.3.0 以及 spring 不少相關包等等。
開始升級:
1. eclipse4.6.2,即下載的2017年1月最新eclipse版本,由於 eclipse4.6 開始才能支持 jdk1.8 的編譯。具體下載地址能夠到個人百度雲盤上下載: http://pan.baidu.com/s/1hsJs2De
  固然,目前不少人已經使用了IntelliJ IDEA,目前咱們也使用了該編輯器,這裏提供我使用的版本 idea-15.0.6 下載地址: http://pan.baidu.com/s/1o7Ceyeu
2. jdk1.8.0_112,由於solr和lucene升級到當前6.4.0最高版本其底層依賴必須指定爲jdk1.8,故需下載2017年1月最新jdk1.8穩定版本,具體下載地址能夠到個人百度雲盤上下載:
  服務器版本的jdk下載地址: http://pan.baidu.com/s/1boOCea7
  windows之64位系統的jdk下載地址: http://pan.baidu.com/s/1jIJoz4a
3. 用solr-solrj-6.4.二、lucene-core-6.4.二、lucene-highlighter-6.4.二、lucene-memory-6.4.二、lucene-queryparser-6.4.2,若是調用到solr核心類,則還須要引入:solr-core-6.4.2 這些包替換原有的 4.8.0 的包
4. 修改底層用到的方法新舊不兼容的代碼(注意:這裏只是我用到的方法和類,必定會有我沒有遇到的,可是方法是相同的,查看對應的api均可以很easy的解決掉)
1. org.apache.solr.client.solrj.impl.HttpSolrServer 修改成:org.apache.solr.client.solrj.impl.HttpSolrClient 2. SolrClient solrClient = new CloudSolrClient(zkHost);
   new方式在新版已經被廢棄,採用新版鏈式賦值法進行建立對象
   SolrClient solrClient = new CloudSolrClient.Builder().withZkHost(Arrays.asList(zkHost.split(","))).build();

3. solrClient = new ConcurrentUpdateSolrClient(url, queueSize, threadCount);
   採用鏈式賦值法
   solrClient = new ConcurrentUpdateSolrClient.Builder(url).withQueueSize(queueSize).withThreadCount(threadCount).build();

4. solrClient = new HttpSolrClient(baseURL);
   採用鏈式賦值法
   solrClient = new HttpSolrClient.Builder(baseURL).build();

5. ClusterState clusterState = zkStateReader.getClusterState();
   Map<String, Slice> map = clusterState.getActiveSlicesMap(collection);
   api已經將getActiveSlicesMap廢棄
   map = clusterState.getCollection(collection).getActiveSlicesMap();

6. List<String> collections = zkStateReader.getAllCollections();
   api已經將getAllCollections()廢棄掉
   Map<String, DocCollection> map = zkStateReader.getClusterState().getCollectionsMap();

7. Collection<Slice> slices = clusterState.getSlices(Collection);
   api已經將getSlices(collection)廢棄,採用更加方便、安全的中間類DocCollection
   DocCollection docCollection = clusterState.getCollection(collection);
   Collection<Slice> slices = docCollection.getActiveSlices();

8. CollectionAdminRequest.Create req = new CollectionAdminRequest.Create();
   req.setCollectionName(name);
   req.setNumShards(numShards);
   req.setConfigName(cluster);
   req.setCreateNodeSet(getNodeSet(cluster));
   req.setReplicationFactor(numReplicas);
   修改成鏈式賦值法
   CollectionAdminRequest.Create req = CollectionAdminRequest.createCollection(name, cluster, numShards, numReplicas);

9. CollectionAdminRequest.Delete req = new CollectionAdminRequest.Delete();
   api已將這種建立方式廢棄
   CollectionAdminRequest.Delete req = CollectionAdminRequest.deleteCollection(name);

10. CollectionAdminRequest.CreateAlias req = new CollectionAdminRequest.CreateAlias();
   api已經將這種建立方式廢棄
   CollectionAdminRequest.CreateAlias req = CollectionAdminRequest.createAlias(name, collections);

11. CollectionAdminRequest.DeleteAlias req = new CollectionAdminRequest.deleteAlias();
   api已經將這種建立方式廢棄
   CollectionAdminRequest.DeleteAlias req = CollectionAdminRequest.deleteAlias(name);

12. SolrInputDocument inputDocument = ClientUtils.toSolrInputDocument(solrDocument);
   將SolrDocument 轉換爲 SolrInputDocument 的方法從ClientUtils中移除了.從solr-5.5以後就將此方法移除,代碼中要想使用此相似功能,須要本身添加方法實現
   /**
     * 將SolrDocument轉換爲SolrInputDocument,原底層提供的方法從solr5.5以後被廢棄掉了
     * add by liangyongxing
     * @param solrDocument
     * @createTime 2017-02-21
     * @return
     */
    public static SolrInputDocument toSolrInputDocument(SolrDocument solrDocument) {
        SolrInputDocument doc = new SolrInputDocument();
        for (String name : solrDocument.getFieldNames()) {
            doc.addField(name, solrDocument.getFieldValue(name));
        }
        return doc;
    }
<1. 以上步驟作完,都會認爲萬事大吉了,由於此時整個工程沒有報任何錯誤了,包括本身在本地可能運行和測試也是OK的。那麼,此時咱們按照正常的邏輯打包發佈到線上環境啓動,會發現起不起來,報錯內容可能大體以下:
Unsupported major.minor version 52.0

以上這個錯誤對於有點經驗的程序員來講都是很easy的問題,就是服務器上的jdk和我們打包程序所使用的jdk版本不一致,很明顯,本地使用的是jdk1.8而服務器上的是jdk1.7,具體能夠經過命令:java -version 進行查看jdk版本。那麼就好辦了,直接下載或者拷貝均可以,將當前環境的jdk升級爲18的便可,這個是很easy的我就不在這裏囉嗦了。html

<2. 作好以後再進行重啓服務,發現怎麼還很差使,大概報錯以下所示:
具體的錯誤我就不粘貼了,免得有些同窗會對號入座。翻譯後大體意思爲: 容器初始化的時候不可以初始化咱們所須要的對象,其中的關鍵字爲:org.springframework.init......
看到這個錯誤,很明顯是spring加載的問題,天然而然想到咱們引用的spring是不是版本的問題,個人第一反應可能就是jdk1.8和spring2.5.6不兼容了,以後經過google、stakoverflow等相關網站查看發現還真是這個問題,在jdk1.8以後的spring建議最好使用spring-core-3.x的包,建議先不要使用4.x的包,由於4.x的包還須要jdk1.8不一樣版本的要求(須要有針對性的要求),開始我偏不信,嘗試了4.x的包,最後發現彷佛還真是有問題(補充一下,當時可能和我操做順序有關,後來3.x沒有問題了我就沒有再嘗試一次,穩妥起見建議仍是3.x),我引入的spring的包具體以下:

spring-aop-3.2.13-RELEASE.jar、spring-beans-3.2.13-RELEASE.jar、spring-context-3.2.13-RELEASE.jar、spring-context-support-3.2.13-RELEASE.jar、spring-core-3.2.13-RELEASE.jar、spring-jdbc-3.2.13-RELEASE.jar、spring-orm-3.2.13-RELEASE.jar、spring-tx-3.2.13-RELEASE.jar、spring-web-3.2.13-RELEASE.jar等java

<3. 以上兩小步作完以後,再在Linux中重啓tomcat服務,我了個天啊,怎麼還有問題,我都要快奔潰了,以後硬着頭皮繼續google,發現是服務器的tomcat版本過低致使的。oh my god!!!,一個jdk1.8的升級怎麼會引入這麼多問題呢?可是沒有辦法,繼續解決吧,上面可能會拋出一下這樣大體的錯誤:
unable to process jar entry [......] from Jar[......] for annotations.
先介紹一下如何在 Linux中查看當前tomcat的版本,到對應tomcat的安裝目錄下,執行 sh ./bin/version.sh 命令,會打印出當前tomcat對應的版本是多少。而上面的這個錯誤的緣由是由於服務器的tomcat版本低於 apache-tomcat-7.0.59建議用戶升級到 tomcat-7.0.61 以上(由於沒有 tomcat-7.0.60 這個版本,固然 tomcat-7.0.59 開始就是好使的,若是你非要用 tomcat-7.0.59 也是能夠的)。 最後升級爲tomcat後從新啓動服務,個人天啊,服務終於正常啓動了。至此,此次搜索引擎底層webservice服務兼容升級完成
<4. 這裏須要補充一點,當windows系統中spring包由2.5.6 —> 3.2.13版本後,對應的jdk版本由1.7升級到1.8後,對應ecllipse設置選項卡project Facets 右側 Dynamic Web Module 級別默認會由原先的2.5自動升級到3.1了,以下圖所示:
  
那麼此時要求tomcat版本至少須要8.x,即須要從網上下載tomcat8.x版本方可在本地發佈項目測試使用。或者使用個人百度雲盤下載,下載tomcat-8.5.11地址爲:http://pan.baidu.com/s/1pKBw23x
 
總結:這次升級,雖然過程有點艱辛,但總算是作到盡善盡美。但願這次的分享可以給有遇到相關問題的朋友們提供些許的幫助。
相關文章
相關標籤/搜索