# 前言 最近針對java項目的部署方式進行整理,jenkins/tomcat/windows工具/linux腳本/web部署平臺等等 發現war包通過tomcat部署比較繁瑣,等待時間長,配置規則複雜對於小白很不友好,也難以接入到自定義的部署工具/平臺中 之前開發的Jar包部署平臺是servlet ...
前言
最近針對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包名稱,多個使用,分開