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的驱动,没有发现什么特别的问题。在关键信息解决不了问题的时候,笨方法(比较法)往往还是很能凑效的。