我有一个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调度程序执行。
我试过不同的选择没有用。请帮助我。
答案 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
答案 1 :(得分:0)
如果您刚刚运行已编译的代码,则可以将.
中的CLASSPATH
替换为D:\CPP\scheduler\JOB_REPORTS_MAIL
。但是,每次运行脚本时都会编译代码,这些行:
javac Constants.java
javac DBUtility.java
可能取决于当前的工作目录D:\CPP\scheduler\JOB_REPORTS_MAIL
,所以我认为你不能绕过改变到该目录(除非你修改你的构建过程,例如使用{{1} })。
为什么要避免更改目录?如果您担心脚本运行后工作目录不同,则可以使用ant
和pushd
代替popd
:
cd
但这对于计划任务并不重要。
为什么您希望计划任务一次又一次地重新编译代码?
实际解决方案:由于实际脚本中不存在@echo off
pushd "D:\CPP\scheduler\JOB_REPORTS_MAIL"
javac ...
...
java -cp ...
popd
调用,因此可以将代码简化为:
javac
将@echo off
java -cp ".;.\lib\*" JobReportScheduler
配置为计划任务的起始目录。