2013-07-05 20 views
0

我有一個java程序,它連接到我的數據庫並驗證一些報告併發送一封電子郵件到特定的郵件ID。還有一個調用這個java類的批處理腳本。這個java類需要javax.activation.jar,javax_mail.jar,ojdbc14.jar,我在一些文件夾中保留了批處理和java文件。Windows批處理腳本無法通過Windows調度程序找到庫的路徑

當我通過直接從它所在的路徑執行批處理腳本來運行程序時,程序工作併發送電子郵件。

但現在我已經安排了這個批處理腳本,使用Windows調度程序每運行一小時。那時,我的java說有編譯錯誤,無法找到所需的依賴類。

我的批處理文件看起來像這樣。

@echo off 

cd D:\CPP\scheduler\JOB_REPORTS_MAIL 
D: 

:: compile the Main class and helper classes 
javac Constants.java 
javac DBUtility.java 
javac -cp ".;javax.activation.jar;javax_mail.jar;ojdbc14.jar" SendJobStatusEmail.java 
javac -cp ".;javax.activation.jar;javax_mail.jar;ojdbc14.jar" JobReportScheduler.java 


:: Run the Main class 
java -cp ".;javax.activation.jar;javax_mail.jar;ojdbc14.jar" JobReportScheduler 

如果我刪除下面的線從我的批處理它無法通過Windows調度

cd D:\CPP\scheduler\JOB_REPORTS_MAIL 
D: 

跑我想刪除這兩條線。當調度程序選擇批處理文件並執行它時,它應該能夠從該批處理目錄下的lib文件夾中選擇獨立的jar。

它不應該依賴於哪個機器,在哪個機器上驅動它,以便我可以放入任何Windows機器並使用Windows調度程序執行。

我試過不同的選項沒有什麼作用。請在這裏幫助我。

回答

0

如果您剛剛運行編譯後的代碼,則可以將CLASSPATH中的.替換爲D:\CPP\scheduler\JOB_REPORTS_MAIL。但是,你的每個腳本運行時編譯代碼,而這些線路:

javac Constants.java 
javac DBUtility.java 

可能取決於當前的工作目錄是D:\CPP\scheduler\JOB_REPORTS_MAIL,所以我不認爲你就可以得到解決改變成目錄(除非您修改您的構建過程,例如通過使用ant)。

爲什麼你要避免改變目錄呢?如果你關心的工作目錄是不同的腳本運行後,您可以使用pushdpopd,而不是cd

@echo off 

pushd "D:\CPP\scheduler\JOB_REPORTS_MAIL" 
javac ... 
... 
java -cp ... 
popd 

但是這並不重要,調度任務。

爲什麼你想要一個計劃任務重新編譯你的代碼一遍又一遍?


實際的解決方案:由於javac呼叫中不存在實際的腳本,代碼可以被簡化爲這樣:

@echo off 

java -cp ".;.\lib\*" JobReportScheduler 

D:\CPP\scheduler\JOB_REPORTS_MAIL被配置爲的開始目錄計劃任務。

+0

是的,我試過了。但它只在從D:\ CPP \ scheduler \ JOB_REPORTS_MAIL路徑運行批處理時纔有效。當我從Windows調度程序計劃時,它無法獲取路徑。 –

+0

我不需要重新編譯類。我必須刪除這些。我的意圖是刪除硬編碼。如果我硬編碼這將迫使我把文件保存在一個地方。如果我把它移到另一臺沒有D驅動器的機器上,我必須改變那裏的路徑。另外我不想在java命令中提到jar文件的名字。如果我通過批處理腳本將它們保存在「lib」文件夾「D:\ CPP \ scheduler \ JOB_REPORTS_MAIL」中,我希望將所有內容添加到類路徑中,比如使用for循環(for循環它在命令提示符下工作,但失敗當批處理腳本被調度程序調用時) –

+0

然後請顯示要作爲計劃任務運行的*實際*代碼。我們不是在這裏玩猜謎遊戲。 –

1

試試這個:

@echo off &SETLOCAL 
SET "Jpath=%cd%" 

:: compile the Main class and helper classes 
javac Constants.java 
javac DBUtility.java 
javac -cp "%Jpath%;javax.activation.jar;javax_mail.jar;ojdbc14.jar" SendJobStatusEmail.java 
javac -cp "%Jpath%;javax.activation.jar;javax_mail.jar;ojdbc14.jar" JobReportScheduler.java 


:: Run the Main class 
java -cp "%Jpath%;javax.activation.jar;javax_mail.jar;ojdbc14.jar" JobReportScheduler 
+0

我不想用D:\ CPP \ scheduler \ JOB_REPORTS_MAIL硬編碼路徑。它應該能夠從批處理腳本本身獲取路徑。我的意思是類似於path = .;(它不能從調度程序中工作,但是如果您轉到D:\ CPP \ scheduler \ JOB_REPORTS_MAIL並運行它,則從命令提示符運行)。所以沒有硬編碼。如果我硬編碼這將迫使我把文件保存在一個地方。如果我把它移到另一臺沒有D驅動器的機器上,我必須在那裏更換。 –

+0

進行了編輯。 ....... – Endoro