webservice請求數據時類com/sun/tools/internal/xjc/api/XJC找不到的原因探究


一.緣由

        最近做的一個項目中,有需要請求webservice數據的地方,

                     JaxWsDynamicClientFactory dcf = null;
                     dcf = JaxWsDynamicClientFactory.newInstance();

         Client client = dcf.createClient("地址");

       然后client再調用invoke方法,起初在eclipse中測試的時候,沒有出現任何問題,但是將包部署到服務器的時候,出現client調用invoke方法的時候,出現了一段異常:

 - with linked exception:
[java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC]
	at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:713)
	at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:720)
	... 43 more
Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:706)
	... 44 more

 

二.分析

  在網上查了一些資料,眾說紛紜,很多人說就是缺少一個依賴,說這個依賴在tools.jar里里面,直接把這個包引進去就好,用反編譯工具查看了一下這個jar包的結構,這個類確實在這里面,於是我把這個包引入這個項目里面,運行,還是報同樣的錯,說明這個方法不行。當然網上也有一些說缺其他jar包的,當然也都不可以。這不是一個普通的jar包,這樣引入,項目無法依賴到。

 

   進一步分析,同樣的代碼,在eclipse中運行正常,在linux服務器里面出現這樣的異常,說明不是項目本身的問題,一定是java環境的問題。想了一下,自己所用的服務器的jdk是centOS系統在安裝的時候自帶的,可能會和自己手動安裝的有些差異,應該從這個地方入手。

 

三.解決方案

       CentOS7.0雖然自帶JDK1.7和1.8,運行“java -version”命令也可以看到版本信息,但是jdk的安裝環境不全,比如缺少tool.jar和dt.jar等,這就導致“javac”等這樣的命令即便配置了環境變量也不能用,所以要重新安裝jdk,並且配置環境變量,並解決“javac”命令不可用的問題。

     下載安裝JDK(必須在連接外網的情況下進行,我也是找了負責機房的老師進入機房解決的,還要專門插外網的網線)

    1.CentOS下,首先讓當前用戶獲取root權限,打開終端輸入命令:

      su root

    2.查看可安裝的JDK版本:

      yum search java-1.7
                在查詢結果列表如下:

      java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
      java-1.7.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
      java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
      java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
      java-1.7.0-openjdk-headless.x86_64 : The OpenJDK runtime environment without audio and video support
      java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
      java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle

    3.安裝這一款,命令:

      yum -y install java-1.7.0-openjdk-devel.x86_64

      安裝完成提示:

    已安裝:java-1.7.0-openjdk-devel.x86_64 1:1.7.0.141-2.6.10.1.el7_3

      作為依賴被升級:
     java-1.7.0-openjdk.x86_64 1:1.7.0.141-2.6.10.1.el7_3 java-1.7.0-openjdk-headless.x86_64 1:1.7.0.141-2.6.10.1.el7_3 nspr.x86_64 0:4.13.1-1.0.el7_3      nss.x86_64 0:3.28.4-1.2.el7_3
     nss-sysinit.x86_64 0:3.28.4-1.2.el7_3 nss-tools.x86_64 0:3.28.4-1.2.el7_3 nss-util.x86_64 0:3.28.4-1.0.el7_3

    完畢!

    記住上面“已安裝”后面的文件夾名稱,不要搞混了。我們用此文件所在的路徑作為JAVA_HOME。切記!

    4.安裝結束后,瀏覽下安裝后的目錄:

      JDK安裝在/usr/lib/jvm/文件夾下。在這個文件夾下有多個JDK版本,通過已安裝成功的提示信息里面的JDK版本,找到我們剛安裝的版本文件夾。

      如:我這里找到新安裝的JDK文件夾是:/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64

        cd /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64/lib

         ls
      查詢結果:

        amd64 ct.sym dt.jar ir.idl jconsole.jar jexec orb.idl sa-jdi.jar tools.jar

      終於見到了久違的tool.jar 和dt.jar包。因為centOS 7.0自帶的JDK壓根就沒有這些jar包,所以不管你環境變量配置正確與否,“javac”命令也不能用,因為               這個命令依賴tool.jar這個jar包。

    5.接下來配置環境變量:

      ①獲取JDK的安裝路徑:

      第四步中,我們所在的文件夾是/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64/lib中。

      輸入下面兩條命令(注意cd后有空格),獲取到的就是JDK的安裝目錄:

      cd .

      pwd
      /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
      這個路徑,即:JAVA_HOME

      ②使用命令編輯環境變量文件:

      vim /etc/profile
      Vim開文件后,鍵盤按“E”,進入編輯模式,然后按幾下鍵“pagedown”,來到文件底部。

      ③將下面的JAVA_HOME修改為剛獲取的JAVA_HOME路徑,然后拷貝到文件底部。

        export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
        export PATH=$JAVA_HOME/bin:$PATH
        export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
          解釋:
        - 只需要改第一行“export JAVA_HOME=”后的部分為你的JDK路徑,注意末尾不要加“/”。其他都無需更改。
        - exprot命令用於將shell變量輸出為環境變量
        - “:”冒號,linux中用於分割路徑,Windows中用“;” 分割。,在此分割JAVA_HOME和其他環境變量($PATH)
        - CLASSPATH中的 “.” 不能丟失。CLASSPATH指引到tools.jar,才可以在任意目錄下用“javac”命令

      ④輸入完成后,按鍵“ESC”切換到Vim的命令模式,輸入命令(冒號,按住“SHIFT+:”即可),保存退出

        :wq!
    6.使環境變量立即生效命令:

      source /etc/profile
    7.檢查環境變量是否配置成功:

      在任意的文件路徑下,終端輸入命令:

      javac
      顯示結果如下,環境變量配置成功:

      [root@localhost java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64]# javac
        用法: javac <options> <source files>
        其中, 可能的選項包括:
        -g 生成所有調試信息
        -g:none 不生成任何調試信息
        -g:{lines,vars,source} 只生成某些調試信息
        -nowarn 不生成任何警告
        -verbose 輸出有關編譯器正在執行的操作的消息
        -deprecation 輸出使用已過時的 API 的源位置
        -classpath <路徑> 指定查找用戶類文件和注釋處理程序的位置
        -cp <路徑> 指定查找用戶類文件和注釋處理程序的位置
        -sourcepath <路徑> 指定查找輸入源文件的位置
        -bootclasspath <路徑> 覆蓋引導類文件的位置
        -extdirs <目錄> 覆蓋所安裝擴展的位置
        -endorseddirs <目錄> 覆蓋簽名的標准路徑的位置
        -proc:{none,only} 控制是否執行注釋處理和/或編譯。
        -processor <class1>[,<class2>,<class3>...] 要運行的注釋處理程序的名稱; 繞過默認的搜索進程
        -processorpath <路徑> 指定查找注釋處理程序的位置
        -d <目錄> 指定放置生成的類文件的位置
        -s <目錄> 指定放置生成的源文件的位置
        -implicit:{none,class} 指定是否為隱式引用文件生成類文件
        -encoding <編碼> 指定源文件使用的字符編碼
        -source <發行版> 提供與指定發行版的源兼容性
        -target <發行版> 生成特定 VM 版本的類文件
        -version 版本信息
        -help 輸出標准選項的提要
        -A關鍵字[=值] 傳遞給注釋處理程序的選項
        -X 輸出非標准選項的提要
        -J<標記> 直接將 <標記> 傳遞給運行時系統
        -Werror 出現警告時終止編譯
        @<文件名> 從文件讀取選項和文件名
      

    8.當出現以上內容時,說明jdk已經被正常配置。重新啟動項目,發現之前的問題就不復存在了。

 

四.總結

  在使用系統自帶的軟件時,要多加注意這樣安裝和手動安裝的差異。

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM