从Java内部启动tomcat
我试图从一个简单的java代码段中启动tomcat,但失败了。我看了其他问题,重复了他们的答案,但没有一个有效 我所做的是通过从Java内部启动tomcat,java,tomcat,process,Java,Tomcat,Process,我试图从一个简单的java代码段中启动tomcat,但失败了。我看了其他问题,重复了他们的答案,但没有一个有效 我所做的是通过运行时执行命令: Process process = Runtime.getRuntime().exec("startup.bat"); 请注意,该命令是简化的,我通常为CATALINA_HOME和一些CATALINA_OPTS提供完全限定的路径、环境变量,并确保系统环境变量可用 发生的情况是,进程正常启动,但当它生成控制台时,它会立即关闭,就像Java本身杀死了它一样
运行时执行命令:
Process process = Runtime.getRuntime().exec("startup.bat");
请注意,该命令是简化的,我通常为CATALINA_HOME
和一些CATALINA_OPTS
提供完全限定的路径、环境变量,并确保系统环境变量可用
发生的情况是,进程正常启动,但当它生成控制台时,它会立即关闭,就像Java本身杀死了它一样。我尝试将Thread.sleep(x)
添加到主线程中,看看让应用程序保持活动状态是否会让tomcat运行,但它没有,尽管Java应用程序一直在运行,控制台仍然死机
我甚至试着通过Ant
脚本运行Tomcat,看看授权给Ant
是否有效,但还是没有用。即使尝试通过第三方.bat文件也不起作用
请不要推荐Cargo、Maven或类似工具,我目前正在寻找一个编程解决方案。请查看org.apache.tomcat.embed
这就是最小设置的外观:
package <yourpackage>
import java.io.File;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;
public class Main {
public static void main(String[] args) throws Exception {
String webappDirLocation = "src/main/webapp/";
Tomcat 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());
System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());
File additionWebInfClasses = new File("target/classes");
WebResourceRoot resources = new StandardRoot(ctx);
resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes",
additionWebInfClasses.getAbsolutePath(), "/"));
ctx.setResources(resources);
tomcat.start();
tomcat.getServer().await();
}
}
包
导入java.io.File;
导入org.apache.catalina.WebResourceRoot;
导入org.apache.catalina.core.StandardContext;
导入org.apache.catalina.startup.Tomcat;
导入org.apache.catalina.webresources.DirResourceSet;
导入org.apache.catalina.webresources.StandardRoot;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串webappDirLocation=“src/main/webapp/”;
Tomcat Tomcat=新的Tomcat();
字符串webPort=System.getenv(“端口”);
if(webPort==null | | webPort.isEmpty()){
webPort=“8080”;
}
setPort(Integer.valueOf(webPort));
StandardContext ctx=(StandardContext)tomcat.addWebapp(“/”,新文件(webappDirLocation.getAbsolutePath());
System.out.println(“使用basedir配置应用程序:+新文件(“./”+webappDirLocation).getAbsolutePath());
文件additionWebInfClasses=新文件(“目标/类”);
WebResourceRoot资源=新的标准根(ctx);
addPreResources(新的DirResourceSet(resources),/WEB-INF/classes),
additionWebInfClasses.getAbsolutePath(),“/”);
ctx.setResources(资源);
tomcat.start();
tomcat.getServer().await();
}
}
问题在于我如何运行cmd脚本。正确的方法是:
Runtime.getRuntime.exec("start /wait cmd /c catalina.bat run");
您是否尝试过使用/c
或/k
cmd选项?我建议尝试在单独的会话中打印输出,以防止生成(我没有要测试的windows机器)。