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