最近做一个基于springboot的web项目,使用docker部署,要运行web项目的话有两种方式,打成jar包,或者war包,接下来一一介绍:
1.jar包
由于springboot内置tomcat,所以打成jar包也是可以运行的,dockerfile如下配置
FROM java:7
ADD ./target/myapp-1.0-SNAPSHOT.jar /opt/myapp/
WORKDIR /opt/myapp/
ENTRYPOINT ["java", "-Dspring.config.location='./src/main/resources/application.yml'","-jar", "myapp-1.0-SNAPSHOT.jar"]
生成jar包之后,先build,之后docker run 命令运行镜像,发现服务已经可以启动了,然后在浏览器打开,这时发现一个问题,原本正常的页面,现在都找不到了,看错误提示,发现是找不到jsp,打开jar包,果然里面没有jsp文件,所以,还要在pom文件中引入一个依赖,如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<resources>
<!-- 打包时将jsp文件拷贝到META-INF目录下-->
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到-->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
通过上述配置,将jsp文件打包到jar包中,重新运行容器,刷新浏览器,果然,页面已经可以正常显示了。
2.war包
将springboot的web项目打成war包,会发现lib文件夹下会生成tomcat开头的几个jar包,由于部署war包是到tomcat的webapp目录,这样部署可能会有冲突,需要修改pom文件的配置,将tomcat的scope设置成provided,只在编译运行的时候生效,这样的话,打包时就不会包含tomcat的依赖,就可以与普通war包一样直接放到webapp目录下部署了。