JAVA程序在windows計劃任務里執行的問題
寫了一個簡單的JAVA類,定時從一個ORACLE數據庫取數據放到另一個mysql數據庫中,寫了一個腳本如下:set classpath=.;%classpath%;./classes12.jar;./mysql-connector-java-5.1.6-bin.jar;E:\workfile\SAP-to-MYSQL\getsapdata.classset path=%path%;D:\develop\Java\jdk1.6\binset JAVA_HOME=D:\develop\Java\jdk1.6cd E:\workfile\SAP-to-MYSQLjava getsapdata >>getsapdata.log
手動執行的時候完全沒有問題,當時加到windows計劃任務里就是執行不成功,程序執行的DOS窗口一閃而過,也看不到是什么錯誤,網上搜了半天,也沒找到可行的答案,后來在腳本里加入了延遲語句 ping -n 5 127.1>nul,才看到報的是找不到類的錯誤:Exception in thread "main" java.lang.NoClassDefFoundError: getsapdataCaused by: java.lang.ClassNotFoundException: getsapdataat java.net.URLClassLoader$1.run(URLClassLoader.java:202)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:190)at java.lang.ClassLoader.loadClass(ClassLoader.java:307)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301at java.lang.ClassLoader.loadClass(ClassLoader.java:248)Could not find the main class: getsapdata. Program will exit.
明明就在這個目錄下,怎么就找不到呢,迷惑,又是一陣搜索,還是沒答案,想著難道windows定時任務挑分區嗎,就把程序挪到C盤,結果計劃任務真的執行成功了,那是怎么回事呢,想想找不到類怎么也應該是環境變量路徑類的問題吧,后來想到我以前經常用DOS窗口敲命令,打開DOS窗口默認在C盤,而我的應用一般都在其他分區,所以每次敲命令比如:cd e:\work\shell,運行完后當前路徑并沒有改變,必須再敲一下e:,才進入到e:\work\shell目錄,會不會是windows計劃任務開啟DOS執行窗口也是默認在C盤,我雖然在腳本里加了 cd E:\workfile\SAP-to-MYSQL命令,但實際上系統的當前路徑還是會在默認的C:\Users\Administrator 目錄下,我的程序移動到C盤的時候,因為系統默認路徑也在C盤,所以 cd 命令是成功進入了c盤的我的應用程序目錄,但不是C盤的就不行了,網上查了下,原來cd 的時候加個 /d 參數可以直接改變盤符,哎,以前居然一致沒用過,把腳本中的 cd 命令改為 cd /d E:\workfile\SAP-to-MYSQL 后,再次執行計劃任務則執行成功。
set classpath=.;%classpath%;./classes12.jar;./mysql-connector-java-5.1.6-bin.jar;E:\workfile\SAP-to-MYSQL\getsapdata.class set path=%path%;D:\develop\Java\jdk1.6\bin set JAVA_HOME=D:\develop\Java\jdk1.6 cd E:\workfile\SAP-to-MYSQL java getsapdata >>getsapdata.log |
Exception in thread "main" java.lang.NoClassDefFoundError: getsapdata Caused by: java.lang.ClassNotFoundException: getsapdata at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301 at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: getsapdata. Program will exit. |