从Java内部启动tomcat

从Java内部启动tomcat,java,tomcat,process,Java,Tomcat,Process,我试图从一个简单的java代码段中启动tomcat,但失败了。我看了其他问题,重复了他们的答案,但没有一个有效 我所做的是通过运行时执行命令: Process process = Runtime.getRuntime().exec("startup.bat"); 请注意,该命令是简化的,我通常为CATALINA_HOME和一些CATALINA_OPTS提供完全限定的路径、环境变量,并确保系统环境变量可用 发生的情况是,进程正常启动,但当它生成控制台时,它会立即关闭,就像Java本身杀死了它一样

我试图从一个简单的java代码段中启动tomcat,但失败了。我看了其他问题,重复了他们的答案,但没有一个有效

我所做的是通过
运行时执行命令:

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机器)。