前言

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