这可能是一个新手问题,但我仍然需要帮助!!
我有一个java类成功启动嵌入式Tomcat,如下所示:
public class Main {
private static Tomcat tomcat;
public static void main(String[] args) throws Exception {
String webappDirLocation = "webapps/";
tomcat = new Tomcat();
String webPort = System.getenv("PORT");
if(webPort == null || webPort.isEmpty()) {
webPort = "8080";
}
tomcat.setPort(Integer.valueOf(webPort));
StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
tomcat.start();
tomcat.getServer().await();
}
}
我的问题是,¿我怎么能阻止它?
我尝试为此目的添加另一个功能,如下所示:
public static void stopTomcat() throws Exception {
if (tomcat.getServer() != null) {
tomcat.stop();
tomcat.destroy();
}
}
从主方法调用它:
if (args.length > 0 && args[0].equals("stopTomcat")) {
stopTomcat();
return;
}
然而,它不起作用。我遇到一个线程异常:
Exception in thread "main" java.lang.NullPointerException
如何获取正在运行的当前Tomcat服务器变量以停止tomcat?
我只需要能够从命令行运行一个java类来停止Tomcat,我相信它是可行的。使用catalina.bat或Tomcat.exe是不可能的,因为这是tomcat的可嵌入版本。
任何帮助都会非常感激!!
此致!!
答案 0 :(得分:1)
您可能正在运行两次脚本。一旦启动服务器,另一次停止它。
如果只运行一次,你仍然可以引用Tomcat对象,因此可以在其上调用stop。 如果没有,它将为null,或者将是一个完全不同的实例。
下面的代码简要介绍了如何从同一个脚本中停止Tomcat。
String webappDirLocation = "webapps/";
Tomcat tomcat = new Tomcat();
Runnable task2 = () -> { try {
Thread.sleep(5000);
System.out.println("Stopping Tomcat");
tomcat.stop();
} catch (Exception e) {
// TODO Auto-generated catch block
} };
// start the thread
new Thread(task2).start();
String webPort = System.getenv("PORT");
if (webPort == null || webPort.isEmpty()) {
webPort = "8080";
}
tomcat.setPort(Integer.valueOf(webPort));
tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
tomcat.start();
tomcat.getServer().await();
除了计时器,您还可以在按键时停止服务器:
...
tomcat.start();
// tomcat.getServer().await();
System.out.print("Press key to stop ");
if(System.in.read()!=-1) {
System.out.print("Stopping");
tomcat.stop();
}