Skip to content

publish spring boot war to tomcat

yangyp8110 edited this page Jan 17, 2018 · 2 revisions
  • Spring-boot 除了打成jar包,直接通过内嵌tomcat运行外,还可以打包成war,发布到tomcat。以tomcat 8为例:

project : springboot-war

Spring-boot项目改变:

打包改为war

<packaging>war</packaging>

main方法重写SpringBootServletInitializer

@SpringBootApplication
public class ApplicationMain extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return super.configure(builder);
    }

    public static void main(String[] args) {
        SpringApplication.run(ApplicationMain.class, args);
    }
}

发布环境配置

Tomcat安装目录,打开..\conf\tomcat-users.xml,在这个配置文件中加入以下内容:

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script"/>

重启tomcat

[root@localhost apache-tomcat-8.5.11]# ./bin/shutdown.sh
[root@localhost apache-tomcat-8.5.11]# ./bin/startup.sh 

访问路径http://192.168.159.134:8080/manager/html,如果提示如下信息,是tomcat设置了ip访问限制:

You are not authorized to view this page.

By default the Host Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, you'll need to edit the Host Manager'scontext.xml file. 
……
……

查看Tomcat安装路径下的 webapps/manager/META-INF/context.xml 配置:

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>
  • allow是正则表达式,限制了本机访问,增加192.168.159.*同网段的访问:
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.168.159.*" />
</Context>
  • 重启tomcat,重新访问http://192.168.159.134:8080/manager/html,查看tomcat manager页面:

编辑项目使用的maven的配置,一般默认是C:\Users\[username]\.m2下的settings.xml,在 <servers> 下加入如下配置:

	 <server>  
		<id>testEnv</id>
		<username>tomcat</username>  
		<password>tomcat</password>  
	  </server>  

发布

mvn tomcat7:deploy -e //如果已经发布过,再次发布会报错

mvn tomcat7:redeploy -e //重新发布命令

发布错误:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.439 s
[INFO] Finished at: 2016-11-24T18:46:17+08:00
[INFO] Final Memory: 32M/204M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project springboot-war: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project springboot-war: Cannot invoke Tomcat manager
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.

tomcat 没有启动,启动本地tomcat,再次发布,发布成功。

本地tomcat服务器下可以看到文件夹springboot-war和文件springboot-war.war:

Tomcat Manager 管理发布的站点:

tomcat manager

通过浏览器访问地址:http://192.168.159.134:8080/springboot-war/index 可以看到访问成功。

run success

完整的pom.xml示例:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>springboot-run-with-tomcat</groupId>
  <artifactId>springboot-war</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springboot-war</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <project.deploy>deploy</project.deploy>
    <project.tomcat.version>8.0.0-RC5</project.tomcat.version>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>${project.tomcat.version}</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <!-- Tomcat6text替换为html-->
          <url>http://192.168.159.134:8080/manager/text</url>
          <!-- 用户名密码与MavenSetting文件致 -->
          <server>testEnv</server>
          <!--发布名称 取项目的artifactId -->
          <path>/${project.artifactId}</path>
        </configuration>
      </plugin>

    </plugins>
  </build>
</project>
Clone this wiki locally