0

我有一个 Java 程序,它连接到我的数据库并验证一些报告并向特定的邮件 ID 发送电子邮件。并且有一个批处理脚本调用这个 java 类。这个 java 类需要 javax.activation.jar、javax_mail.jar、ojdbc14.jar,我将它们与批处理和 java 文件一起保存在某个文件夹中。

当我通过直接从程序所在的路径执行批处理脚本来运行程序并发送电子邮件时。

但是现在我已经使用 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 调度程序执行。

我尝试了不同的选项,但没有任何效果。请在这里帮助我。

4

2 回答 2

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
于 2013-07-05T09:47:43.830 回答
0

如果您只是运行编译后的代码,则可以.在您的CLASSPATHwith中替换。D:\CPP\scheduler\JOB_REPORTS_MAIL但是,每次脚本运行时都会编译代码,并且这些行:

javac Constants.java
javac DBUtility.java

可能取决于当前的工作目录D:\CPP\scheduler\JOB_REPORTS_MAIL,所以我认为您无法绕过更改到该目录(除非您修改构建过程,例如通过使用ant)。

为什么要避免更改目录呢?如果您担心脚本运行后工作目录不同,您可以使用pushdandpopd代替cd

@echo off

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

但这对于计划任务并不重要。

为什么你首先要一个计划任务一遍又一遍地重新编译你的代码?


实际解决方案:由于javac实际脚本中不存在调用,因此可以将代码简化为:

@echo off

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

whenD:\CPP\scheduler\JOB_REPORTS_MAIL配置为定时任务的起始目录。

于 2013-07-05T09:37:47.870 回答