乐趣区

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

前言

最近针对 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 包名称,多个应用, 离开
退出移动版