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