前言
本来我想用jekins+docker来自动打包部署到服务器上,但是docker研究的不深,遇到问题就GG了,所以换一种简单的方式来打包部署。
思考
在自动打包部署之前,我们需要分析一下如何打包,并解决下面几个问题:
- 如何使用Maven进行打包?
- 如何使用Maven自动部署到远程服务器上?
实战
首先我们解决第一个问题,如何使用Maven进行打包?
- Maven中通过插件来进行打包,一个网站项目必然存在资源(xml、properties等)和java文件,所以可以使用maven-resources-plugin来处理资源文件以及maven-compiler-plugin来编译java文件
- 在pom.xml文件中添加如下代码:
<build>
<finalName>ref-comet</finalName>
<resources>
<!-- 配置文件 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
然后解决我们第二个问题,Maven怎么打包到远程服务器?
- 首先我们要保证本地可以访问到远程服务器,所以需要在tomcat中配置用户权限,并需要在本地浏览器测试远程Tomcat服务器是否可以访问
- 找到远程Tomcat服务器的tomcat/conf/tomcat-users.xml,在tomcat-users节点中,添加如下子节点,username和password是需要登录到远程Tomcat的用户名和密码。注意:正式环境,请确保用户名和密码使用特殊字符,不易被破解
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
-
成功访问(如果是Tomcat8.5.x版本,请移步到坑点)
访问192.168.21.10:8081
点击Manager App - 在pom.xml文件中配置打包到远程服务器的必需参数,大家可以把这段代码和上面代码整合到一起去
<build>
<finalName>ref-comet</finalName>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 先测试本地 -->
<!-- <url>http://192.168.1.235:8888/manager/text</url> -->
<!-- 填写远程服务器地址 -->
<!-- <url>http://192.168.21.10:8081/manager/text</url> -->
<!-- 远程tomcat管理用户名 -->
<username>tomcat</username>
<!-- 远程tomcat管理密码 -->
<password>tomcat</password>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
最后一步,直接通过eclipse来发布,右键项目->Run As->Maven build...->设置goals:clean install tomcat7:deploy
发布
坑点
- Tomcat8.5在浏览器上测试登录远程Tomcat Manager时,出现”403 Access Denied”
Tomcat8.5加入了ip授权机制,默认仅支持本地访问,所以会抛出权限不足异常
解决方式:
找到tomcat/webapps/manager/META-INF/的context.xml文件,注释掉下面这一段或者添加\d+.\d+.\d+.\d+,来支持其他ip访问当前tomcat
# <Valve className="org.apache.catalina.valves.RemoteAddrValve"
# allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />
- 上传出现异常”I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error”
- 服务器上已经存在了xxx.war,必须先删除,否则会报出
- 防火墙未关闭或未把远程服务器上的端口放开,放开即可,保证本地机浏览器可以打开远程tomcat
- 正式服务器不太建议用这种方式,不太安全,一旦密码泄露,后果可想而知