当我手动运行 Apache Tomcat startup.bat 文件时,cmd 控制台保持打开状态,当我在 java 代码中运行该文件时,控制台关闭。(我正在尝试自动化项目中的某些流程)。对于 Windows,当 Tomcat 作为应用程序运行时,控制台似乎在 .bat 运行后必须保持打开状态。
我怎样才能在我的 Java 代码中实现这一点?谢谢
答案1
Startup.bat
依赖于两个环境变量:CATALINA_HOME 和 JRE_HOME(或 JAVA_HOME)。
您必须设置 JRE_HOME 或 JAVA_HOME,否则您将无法通过双击运行启动。
这只剩下 CATALINA_HOME。如果未设置,启动脚本将尝试猜测它,但这仅在从当前目录(或准确地说是其父目录)执行时才有效。如果您尝试从其他目录运行它并且未设置 CATALINA_HOME,它将失败(并显示一条消息)。
如果这是您的问题,您应该在 cmd 窗口顶部看到类似的消息:
CATALINA_HOME 环境变量未正确定义 运行该程序需要此环境变量
您可能遇到的另一个问题是路径中包含空格。您的路径看起来没有,但它可能对其他人有用,所以我将包含这条信息。
当您的命令包含空格时,您需要引用您的start
命令,对吗?应该这样做:
"cmd.exe /c start \"my path to tomcat bin/startup.bat\""
错误。您最终会盯着标题为我的 tomcat bin/startup.bat 路径
start
将第一个引用的参数作为标题……真好。正确的形式是:
"cmd.exe /c start \"\" \"my path to tomcat bin/startup.bat\""
可是等等
这两个问题实际上都会阻止 Tomcat 窗口出现 - 你说呢关闭, 所以确实开始然后死去。嗯……这很可能是因为已有一个进程正在监听端口 8080。也许您的 Java IDE 启动了 Tomcat?或者启动了另一个在 8080 上监听的服务器?如果是这个原因,您应该会在 Tomcat 日志中看到类似的行(它们存储在CATALINA_HOME/logs
):
java.net.BindException:地址已在使用中:JVM_Bind
如果这是您的问题,那么您要么需要停止第一个实例,要么重新配置您的服务器进程,以便每个进程监听不同的端口。
注意:我使用以下步骤从 Java 启动 Tomcat,效果很好:
Runtime r=Runtime.getRuntime();
r.exec("cmd.exe /c start startup.bat", //path to executable
null, // env vars, null means pass parent env
new File("my path to tomcat/bin")); // working directory
答案2
检查 .bat 文件的文件属性(右键单击),应该有保持控制台打开的选项。据我记得,这是最后一个选项卡。
答案3
进入你的tomcat/bin
文件夹。编辑startup.bat
文件并注释掉倒数第二行
call "%EXECUTABLE%" run >..\logs\OutputFile.log 2>&1 start %CMD_LINE_ARGS% run >..\logs\OutputFile.log 2>&1
REM
在开头使用 将其注释掉。
rem call "%EXECUTABLE%" run >..\logs\OutputFile.log 2>&1 start %CMD_LINE_ARGS% run >..\logs\OutputFile.log 2>&1
那么控制台将保持打开状态。如果注释了此行,则表示关闭控制台并将输出写入某个外部日志文件。