Ant自動編譯Java project時無法找到rt.jar的處理方法

最近在使用Ant自動化編譯打包一個Java項目,執行時總是報有class找不到:

    [javac] Compiling 46 source files to /A/B/C/D/build/staging/bin
    [javac] .../ChangePassWordTool.java:5: 
package com.sun.org.apache.xml.internal.security.utils does not exist
    [javac] import com.sun.org.apache.xml.internal.security.utils.Base64;
    [javac]                                                      ^
    [javac] .../ChangePassWordTool.java:39: cannot find symbol
    [javac] symbol  : variable Base64
    [javac] location: class com.xxx.ChangePassWordTool
    [javac]             passWord = Base64.encode(passWord.getBytes()); 
    [javac]                        ^
    [javac] 2 errors

由於在eclipse中使用ant插件編譯打包該項目沒有問題,納悶爲啥出現該異常。

首先定位該類:com.sun.org.apache.xml.internal.security.utils.Base64,發現是在jre/rt.jar中,因此第一步懷疑是ant的配置文件有問題,將build.xml中的文件調整如下:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <project default="prod" basedir=".">  
  2.           
  3.     ...  
  4.     <property environment="env" />  
  5.     <property name="java.jre.lib.dir" value="${env.JAVA_HOME}/jre/lib" />  
  6.       
  7.     <!-- classpath used for javac -->  
  8.     <path id="classpath">  
  9.         <fileset dir="lib" includes="*.jar"/>           
  10.         <fileset dir="${java.jre.lib.dir}">  
  11.             <include name="*.jar" />  
  12.         </fileset>      
  13.     </path>  
  14.       
  15.     ...  
  16.     <target name="compile" depends="init">  
  17.         <javac  
  18.             srcdir="src"  
  19.             destdir="${staging}/bin"  
  20.             encoding="UTF-8"  
  21.             source="1.6"  
  22.             target="1.6"  
  23.             nowarn="on"  
  24.             debug="on"  
  25.             optimize="on"  
  26.             includeantruntime="false">                         
  27.             <classpath refid="classpath" />                 
  28.         </javac>  
  29.     </target>  
  30.   
  31. </project>  

但是調整之後,編譯打包還是報上述錯誤, 後查詢資料發現, 是由於javac編譯代碼的行爲所致。

javac在編譯代碼時,當他嘗試從rt.jar中找尋對應的類文件時,他會默認從對應的符號表文件ct.sym (同樣在jre/lib/下)中查找該類是否存在,由於ct.sym中有意或無意的遺失了部分rt.jar中的類,包括我使用的com.sun.org.apache.xml.internal.security.utils.Base64,因此導致編譯報錯。


解決方法就是通知javac編譯器,在編譯代碼時,忽略該符號表ct.sym, 直接查找rt.jar,通過給javac傳入對應的參數完成:-XDignore.symbol.file

在配置文件中即爲:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <javac  
  2.     srcdir="src"  
  3.     destdir="${staging}/bin"  
  4.     encoding="UTF-8"  
  5.     source="1.6"  
  6.     target="1.6"  
  7.     nowarn="on"  
  8.     debug="on"  
  9.     optimize="on"  
  10.     includeantruntime="false">  
  11.                 <compilerarg value="-XDignore.symbol.file"/>            
  12.     <classpath refid="classpath" />                 
  13. </javac>  


編譯成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章