一、修改pom.xml
它与 parent 是同级的,别放到parent节点里面去了
添加打包方式,默认jar<packaging>war</packaging>
<!-- 默认打包方式为jar(没写),添加下面代码将其修改为war -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com</groupId>
<artifactId>exam_assistant_management</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-添加打包方式->
<packaging>war</packaging>
<name>exam_assistant_management</name>
<description>Demo project for Spring Boot</description>
除去内置Tomcat,并添加Servlet所需要的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
二、修改main()方法启动类
继承 SpringBootServletInitializer
类,并添加方法,记得在类上面加注解@ServletComponentScan
和@EnableAsync
可加可不加
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//WartestApplication为你的启动类名
return builder.sources(WartestApplication.class);
}
贴一个完整的启动类例子
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@ServletComponentScan
@EnableAsync
public class WartestApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//WartestApplication为你的启动类名
return builder.sources(WartestApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WartestApplication.class, args);
}
}
三、导出 war 文件
方法一
Build → Build Artifacts..… → 随便选一个吧,区别我也不知道
导出的地址在你的项目路径下的 target 文件夹下(目录和方法二一样)
方法二
在<plugins>节点中配置一下war打包插件
<!-- war 插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!-- 打包后的名字,例如:testdemo.war -->
<warName>testdemo</warName>
</configuration>
</plugin>
然后在IDEA右侧 点击Maven →项目名 →Plugins →war →war:war(双击),IDEA就开始生成war文件
QQ截图20191105220404.png
完成后可以从日志中看到 生成的文件目录(在工程文件夹下的target文件夹下) QQ截图20191105220630.png
四、部署到Tomcat (请看最后面的 ‘注意’ ,尤其是云服务器(利用内网穿透搭建的服务器))
到了这里前提是你的Tomcat环境都已经OK了。启动服务:bin目录下的startup.bat,关闭服务:bin目录下的shutdown.bat
方法一
用Tomcat的图形界面部署
1、先添加(设置)一个管理员的用户名与密码
打开Tomcat目录,进入conf目录,打开tomcat-users.xml,可以添加如下用户,或者解开默认注释用默认的管理账户也行,然后保存重启服务(先关闭,再启动)
随便加,随便改、相似就行了
<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
<role rolename="manager-gui"/>
<user username="admin" password="123456" roles="manager-gui"/>
2、开始部署
先进 127.0.0.1:8080 Tomcat 的首页 点击 Manager App 输入上面添加的账户
QQ截图20191105221702.png进去后界面如下 QQ截图20191105223119.png
里面还是有几个默认的应用,不要管他,往下拉,找到
要部署的WAR文件
QQ截图20191105223439.png
部署成功后 开头的 消息 栏上会显示OK,失败的话也会有相应的提示(在这个界面卸载了某个应用后,其相应的war文件还是存在于webapps目录下,下次在部署相同名字的应用的时候会提示文件已经存在,则需先删原文件,再部署即可),同时在应用程序列表里也可以找到刚部署的应用了。点击刚部署的应用名就进入部署的应用。访问路径为http://127.0.0.1:8080/testdemo/
(假如testdemo为刚部署的名字)
方法二
直接将war文件复制到webapps目录下,重启Tomcat服务。它会自动对war包进行解压缩并存放到tomcat的webapps目录下。
注意
用方法一完成上面部署,只可以在当前电脑上访问,如果利用内网穿透实现其他电脑访问的话。则还需要修改一个地方。\webapps\manager\META-INF\文件下的 context.xml。 把Valve 节点和Manager 节点注释掉(全部注释掉Context 下的内容),如下
<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" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
-->
</Context>
很重要的一件事 ........解决无法访问静态资源
在我们的springboot项目中,建议在application.properties加上
#访问时加上项目名
server.servlet.context-path=/exam_assistant_management
在我们的html文件中的引用也要注意
不能这么写
<link rel="stylesheet" type="text/css" href="../../static/admin/css/login.css"/>
正确的写法
<link rel="stylesheet" type="text/css" href="static/admin/css/login.css"/>
这样子它的资源访问路径才会是127.0.0.1:8080/exam_assistant_management/static/admin/css/login.css
如果用最上面的写法话,在访问时会变成
127.0.0.1:8080/static/admin/css/login.css
exam_assistant_management是我的项目名,如果导出的war文件不是你写的名字,最好改成这个。
网友评论