springboot打成war包放入tomcat的webapps中启动成功,访问controller层报404,访问页面正常

问题点汇总 专栏收录该内容
20 篇文章 0 订阅

这两天老大安排新活,让我这个深陷改商城bug的人换换口味,搭建一个springboot框架,能够简单实现Restful风格的接口。springboot之前用过,这来回差不多有一年没有接触过了。这次搭建就遇到好几个坑,不过也都算解决了,有环境的问题,也有代码的问题,这里记录一下方便以后参考。下面具体说说吧~

本springboot在github项目地址:https://github.com/fenglizhang/springboot-restful

  • 坑1:本地开发完事,启动访问正常,却发现没有项目名访问,感觉别扭,咋样配置上项目名?
  • 坑2:却忘了部署需要打成war包和tomcat一起要放到docker上的事情,如何配置打成war包?
  • 坑3:springboot如何打成war包,有何种方式?
  • 坑4:打成war包的springboot项目如何用tomcat启动
  • 坑5:启动成功后如何配置能正常访问到接口
    下面一个一个填坑 (0>00<0)

1) 如果给springboot项目配置上项目名称?

SpringMVC的运行方式是将项目打成war包放到tomcat中运行tomcat,这种情况下访问需要在url中加入项目名。SpringBoot同样可以打成war包部署,但也提供了另一种方式:直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的依赖是Tomcat还是jetty)来处理应用请求,这时是不需要添加项目名的。

如果感觉上少点啥,还是可以通过在yml文件中配置一个项目名的,不过springboot有两个版本,不同版本的配置略有差别,以项目名为demo为例:
在这里插入图片描述
因为我在pom文件配置的springboot版本为:<spring.boot.version>1.4.3.RELEASE</spring.boot.version>,所以在yml中配置为第一种:server.context-path: /TelemetryServer
这样,访问我们controller的url就可以这样:http://localhost:8080/TelemetryServer/api/log/showLogs ,而不是这样:http://localhost:8080/api/log/showLogs

2)如何配置才能打成war包?

springboot的项目打包方式是多样的,常见的就是打成war包和jar包这两种。具体打成什么包要看部署情况,war包是一般在tomcat的webapps中启动的,或者和tomcat一起放到docker中部署。而jar包只要有jdk环境,就可以用命令行java -jar **.jar的方式启动。如何打成jar包的配置具体可以看:https://blog.csdn.net/zhanglf02/article/details/78135966 《个人笔记6》中的:解决maven达成jar包时报错 这节。
-------------------------------------------下面具体介绍如何配置springboot项目打成war包-------------------------------------------

  1. 打成war包启动和本地用过main方法启动不同,本地main方法启动是依赖于内置的tomcat,而打成war包是放到tomcat内启动,所以要剔除掉tomcat的依赖部分,但还要保存servlet的部分。需要在pom.xml中增加配置如下:
		<packaging>war</packaging>
		
		<dependency>
			<!-- 指定为Web应用,并启动一个内嵌的Servlet容器(默认是Tomcat)用于处理HTTP请求 -->
			<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>
		
		<!-- springboot本身开发出来只支持3.0以上,为了让spring boot支持servlet2.5 -->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。     相当于compile,但是打包阶段做了exclude操作-->
            <scope>provided</scope>
	    </dependency>
  1. 方法主入口继承SpringBootServletInitializer类并实现configure方法
/**
 * 配置除去了自动配置数据源的类-DataSourceAutoConfiguration,因为
 * 这个注解会把sping的配置的数据源全部都自动注入,不会默认注入一个,当使用其他数据源时再调用另外的数据源。
 * @author zhanglf
 *
 */
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class Application  extends SpringBootServletInitializer{

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

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		 return builder.sources(Application.class);
	}
}

经过以上两步即可实现打成war包,并在tomcat中正常启动。但是!如果想访问controller层的方法,这些配置还是不够的。还要接着看坑5才行。。。

另附上具体的war包和jar包的区别:

作者链接:https://blog.csdn.net/weixin_42539138/article/details/80993585
在做项目时,通常对即将要发布的项目打成两种类型的包:jar和war。那么究竟jar和war有什么区别呢?
回顾一下我们在做项目时,一般将项目分为两层:服务层和表现层(视图层),通常我们把服务层打包成jar,而把视图层的包打成war包。通过仔细对比可以发现:jar包中包含了你写程序的所有服务或者第三方类库,它通常是作为幕后工作者,为视图层用户与之交换数据处理的一个服务者,jar文件格式以Zip文件格式为基础,与Zip不同的是,它可以被发布,而且还能用于部署,它封装了库、组件和插件程序,并且可以被编译器和jvm使用,在jar中还包含特殊的文件,如mainfests和部署的应用描述,用于指示工具如何处理特定的jar。
一个war文件可以看成一个web应用程序。与jar封装不同的是:它内聚了很多页面,如html、jsp,Servlet,js,css,icon图片文件等等,当然还包括组成web应用的其他组件,这些文件基本没有复杂业务逻辑的处理,基本上仅仅是用来当做程序的门户负责与使用者交互,仅此而已。
这样做有什么好处呢?根据平时的开发习惯,很容易能够想到:第一,这样做使代码的层次分明,前后端分离;第二,便于划清前后端的职责,加快开发进度并且利于维护;第三,也是我经常用到的,那就是对于靠后期维护的项目来说,比如业务复杂多变而又琐碎的项目,如果仅仅是改变前端的样式或者进行调整,我不必把服务也关掉,只需要停掉web,做完修改后能够马上部署上线,针对我写过的项目来说,直接调用接口给到的返回结果可以根据需要只在页面进行调用就能够显示,而服务端代码一点都不需要变化,极大方便了开发。。当然,使用了springboot后,项目都会被打包成jar,或者打包成war部署在外部容器中也可以,这点以后再说。
以上都是从实际中出发看出的最明显的区别,如果从内部看,我们可以看到:war包中的目录结构中包括WEB-INF,而war是一个可以直接运行的web模块,做好一个web项目后,需要打包部署到容器中,一般放置在tomcat的\webapps\目录下,当启动tomcat时,这个包将被解压,即相当于发布了。而jar中一般都是些class文件,声明了Main_cass后就可以用java命令去运行它。
所有的包都是用jar打的,只不过目标文件的扩展名不一样。与jar类似,war也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:通常其根目录下包含之前所说的有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。所以项目打包什么情况下使用war,什么情况下使用jar也是很清楚的了。

3)打war包的操作,我这里有两种

1.命令行的方式
进入项目的位置,在pom同级目录中,启动命令行。输入mvn clean 等执行完毕,输入mvn package 执行完毕后去项目对应的target目录中找到.war的压缩包就是。

  mvn clean 

在这里插入图片描述

 mvn package

在这里插入图片描述

在目录target中找到war包
在这里插入图片描述
2.eclips中界面操作
选择项目的pom文件,右键 Run As 选择Maven build…这个进去
在这里插入图片描述

然后配置maven命令如下,配置完成,点击Run即可
在这里插入图片描述

执行完成出现SUCCESS就表示可以了
在这里插入图片描述
然后也是去工程中找到对应target目录中找到war包即可。

4) war包在tomcat中部署

这个不再细说,比较简单。把war包放到webapps下或者直接放到Root下都行,然后去bin目录中执行./startup.bat即可(这是在window的命令,如果在linux中是./startup.sh)

5) 如何解决打成war包能正常访问?

一个是pom文件的配置很重要。springboot版本最好不要超过2.0,里面有关tomcat的配置我都贴出来了。本地和打成war包都不用动pom.xml.只需让Application.java集成SpringBootServletInitializer,实现configer方法即可。

@SpringBootApplication(exclude = {UserDetailsServiceAutoConfiguration.class})
public class ActivityApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ActivityApplication.class);
    }

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

一个是springboot的maven项目的结构。这里我贴一下。是没有webapp目录的
在这里插入图片描述
以上便是这次的全部内容。供自己和每一位辛苦加班的你参考~

  • 2
    点赞
  • 9
    评论
  • 23
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 9 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

万米高空

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值