美文网首页
基于嵌入式Tomcat的War包启动器

基于嵌入式Tomcat的War包启动器

作者: code2roc | 来源:发表于2023-07-01 17:45 被阅读0次

    前言

    最近针对java项目的部署方式进行整理,jenkins/tomcat/windows工具/linux脚本/web部署平台等等

    发现war包通过tomcat部署比较繁琐,等待时间长,配置规则复杂对于小白很不友好,也难以接入到自定义的部署工具/平台中

    之前开发的Jar包部署平台是servlet开发通过嵌入式tomcat部署,借此打开思路

    能否基于嵌入式tomcat做一个war包启动器,通过代码的方式开启tomcat容器来部署war包

    源码地址:https://gitee.com/code2roc/jar-manage/tree/master/waragent

    借此启动器可以将war包部署集成到自己的工具平台中,将启动器的jar包按普通方式部署即可

    方案

    tomcat启动一般需要几个基本参数设置

    • war包路径
    • 端口
    • 映射路由
    Tomcat tomcat = new Tomcat();
    tomcat.setPort(port);
    StandardContext ctx = (StandardContext) tomcat.
    addWebapp(contextPath, catalinaBase + File.separator + "webapps" + File.separator + name + ".war");
    

    tomcat9启动还需要指定cookie处理策略,否则无法识别

    CookieProcessor cookieProcessor = new LegacyCookieProcessor();
    ctx.setCookieProcessor(cookieProcessor);
    

    后续实际使用中还涉及到了启动jvm参数设置及jar包扫描跳过的配置

    tomcat.getEngine().setJvmRoute(jvmStartCommand);
    
    StandardJarScanner jarScanner = new StandardJarScanner();
    StandardJarScanFilter jarScanFilter = new StandardJarScanFilter();
    jarScanFilter.setTldSkip(skipScan);
    jarScanFilter.setPluggabilitySkip(skipScan);
    jarScanner.setJarScanFilter(jarScanFilter);
    ctx.setJarScanner(jarScanner)
    

    打包

    原来预想把maven项目打到一个jar包方便调用,但是打包插件会把依赖jar包中的class文件进行合并

    嵌入式tomcat依赖的jar包有相同包名的,导致class文件覆盖,websocket相关内容报错

    所以把依赖jar包打入到同级lib文件夹中,和waranaget.jar一起拷贝使用

     <build>
            <finalName>${artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <mainClass>com.code2roc.waragent.Application</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
                <!-- 拷贝依赖的jar包到lib目录 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>
                                    ${project.build.directory}/lib
                                </outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    使用

    java -jar waragent.jar "启动参数"

    启动参数一定要用双引号包含,这样才能正确解析

    定义:"appname★warFilePath★port★contextPath★jvmParam★skipScan"

    示例:"testwar★D:\testwar.war★9091★/testwar★-Xms3072m -Xmx3072m -Djava.awt.headless=true★xxx*.jar"

    内部使用★分开,一共6个参数,最后一个参数可省略,其余必填

    • 参数1:应用名称
    • 参数2:war包绝对路径
    • 参数3:端口号
    • 参数4:映射路由(contextPath)
    • 参数5:jvm启动参数,主要指定内存大小
    • 参数6:启动扫描跳过jar包名称,多个使用,分开

    相关文章

      网友评论

          本文标题:基于嵌入式Tomcat的War包启动器

          本文链接:https://www.haomeiwen.com/subject/eljxudtx.html