ant 1.8.2部署在241機器,oracle 11g部署在242機器上,今天用ant 1.8.2 通過oracle驅動向oracle 11g的環境插入數據時報下面的錯誤:
builddb: BUILD FAILED /home/build.xml:10: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 ORA-12705: Cannot access NLS data files or invalid environment specified at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:28 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278) at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:785) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:362) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:414) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) at org.apache.tools.ant.taskdefs.JDBCTask.getConnection(JDBCTask.java:370) at org.apache.tools.ant.taskdefs.SQLExec.getConnection(SQLExec.java:942) at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:614) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) at java.lang.reflect.Method.invoke(libgcj.so.7rh) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:390) at org.apache.tools.ant.Target.performTasks(Target.java:411) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) at org.apache.tools.ant.Project.executeTarget(Project.java:1368) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.apache.tools.ant.Project.executeTargets(Project.java:1251) at org.apache.tools.ant.Main.runBuild(Main.java:809) at org.apache.tools.ant.Main.startAnt(Main.java:217) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) Total time: 2 seconds
根據“ ORA-12705”錯誤號百度後,發現很多人給出了下面的解決方案:
.檢查以下變量是否設置正確(invalid environment specified) NLS_LANG, ORA_NLSxx, or ORACLE_HOME 2.檢查$ORACLE_HOME/nls/data目錄中的nlb文件(NLS data files)是否損壞,可以先把文件備份,再從其他相同的環境中copy這些文件 解決方法1排除了,原因是以前是好好的最近也未曾改過環境變量. 查找$ORACLE_HOME目錄有了驚人的發現,讓俺既是驚喜又是振奮,驚喜的是終於發現了NLS目錄丟失了,振奮的是自己還有一台機器也安裝有Oracle11g. 看來這年頭操作系統也靠不近了,不用說copy一份過來。
根據上述的解決方案,檢查oracle服務器(242)機器“NLS_LANG, ORA_NLSxx, or ORACLE_HOME”參數,發現前兩個參數沒有設置,於是設置這兩個參數,設置完後,問題依舊(重啟機器後仍然沒有解決問題)。
於是找了第三台機器(記為243機器),在243機器上執行同樣的ant腳本,發現可以正確執行。初步懷疑是241機器和243機器的環境變量不同造成的,通過env命令,比較兩台機器的環境變量,發現243機器設置了java_home,而241機器沒有設置java_home,於是乎快速設置java_home的值(java_home的設置參考:http://blog.csdn.net/wgw335363240/article/details/22079311)。之後,斷掉以前的連接,新建一個連接,執行ant命令,數據插入成功。
總結:這裡走了彎路,主要是ORA-12705的錯誤給人太多的錯誤信息了,期間嘗試讀過jdbc的驅動,沒有發現什麼特別的問題。在關鍵信息解決不了問題的時候,笨方法(比較法)往往還是很能湊效的。