这两天老大安排新活,让我这个深陷改商城bug的人换换口味,搭建一个springboot框架,能够简单实现Restful风格的接口。springboot之前用过,这来回差不多有一年没有接触过了。这次搭建就遇到好几个坑,不过也都算解决了,有环境的问题,也有代码的问题,这里记录一下方便以后参考。下面具体说说吧~
本springboot在github项目地址:https://github.com/fenglizhang/springboot-restful
1) 如果给springboot项目配置上项目名称?
SpringMVC的运行方式是将项目打成war包放到tomcat中运行tomcat,这种情况下访问需要在url中加入项目名。SpringBoot同样可以打成war包部署,但也提供了另一种方式:直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的依赖是Tomcat还是jetty)来处理应用请求,这时是不需要添加项目名的。
如果感觉上少点啥,还是可以通过在yml文件中配置一个项目名的,不过springboot有两个版本,不同版本的配置略有差别,以项目名为demo为例:
因为我在pom文件配置的springboot版本为:
,所以在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包-------------------------------------------
war
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
org.springframework.boot
spring-boot-starter-tomcat
provided
/**
* 配置除去了自动配置数据源的类-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才行。。。
作者链接: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…这个进去
执行完成出现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目录的
以上便是这次的全部内容。供自己和每一位辛苦加班的你参考~