说明:
(1) 书写本篇博客的直接原因:在【Spring Boot电商项目66:上线部署四:把项目部署到服务器;】中,我们部署项目的时候,把Spring Boot项目打成了jar包;自己的疑问是,web项目不是应该打成war包吗?:为此,就写了本篇博客,本篇博客就是围绕这个疑问来写的;
(2) 本篇博客主要解决一下几个疑问:(PS:没有给出明确的解答)
● jar和war包的区别;
● 非web项目,只能打成jar包? web项目只能打成war包?
● maven的package命令,默认打成jar包;
● Spring Boot项目,为什么要打成jar包?
一:jar和war包的区别;
说明: 感觉,这部分,主要是得理解,jar包war包文件结构、文件内容的不同;同时,要知道jar和war包的使用的方式和运行方式;
1.jar包与war包的介绍与区别;
参考自【jar包和war包的介绍与区别】,该文的作者是【唐怀瑟】;
(1)jar包与war包简述: jar包和war包都可以看成压缩文件,都可以用解压软件打开,jar包和war包都是为了项目的部署和发布,通常在打包部署的时候,会在里面加上部署的相关信息。这个打包实际上就是把代码和依赖的东西压缩在一起,变成后缀名为.jar和.war的文件,就是我们说的jar包和war包。但是这个“压缩包”可以被编译器直接使用,把war包放在tomcat目录的webapp下,tomcat服务器在启动的时候可以直接使用这个war包。通常tomcat的做法是解压,编译里面的代码,所以当文件很多的时候,tomcat的启动会很慢。
(2)jar包和war包的区别: jar包是java打的包,war包可以理解为javaweb打的包,这样会比较好记。jar包中只是用java来写的项目打包来的,里面只有编译后的class和一些部署文件。而war包里面的东西就全了,包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。
(3)什么时候使用jar包或war包?: 当你的项目在没有完全完成的时候,不适合使用war文件,因为你的类会由于调试之类的经常改,这样来回删除、创建war文件很不方便,来回修改,来回打包,最好是你的项目已经完成了,不做修改的时候,那就打个war包吧,这个时候一个war文件就相当于一个web应用程序;而jar文件就是把类和一些相关的资源封装到一个包中,便于程序中引用。
2.jar包和war包的介绍和区别;
参考自【jar包和war包的介绍和区别】,但该文亦是转载博客,转载作者是【绝地反击T】;
(1)jar与war引入:JavaSE程序可以打包成Jar包(J其实可以理解为Java了),而JavaWeb程序可以打包成war包(w其实可以理解为Web了)。然后把war发布到Tomcat的webapps目录下,Tomcat会在启动时自动解压war包。
(2)jar简介: JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。
JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如manifests 和部署描述符,用来指示工具如何处理特定的 JAR。
(3)war简介: 如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了,我们可以将Web应用程序打包成Web 归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似。利用WAR文件,可以把Servlet类文件和相关的资源集中在一起进行发布。在这个过程中,Web应用程序就不是按照目录层次结构来进行部署了,而是把WAR文件作为部署单元来使用。
一个WAR文件就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个.war扩展名。下面我们将第2章的Web应用程序打包成WAR文件,然后发布
(4)jar与war的区别: 要注意的是,虽然WAR文件和JAR文件的文件格式是一样的,并且都是使用jar命令来创建,但就其应用来说,WAR文件和JAR文件是有根本区别的。JAR文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于WAR文件来说,一个WAR文件代表了一个Web应用程序,它可以包含Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件。
我们什么时候应该使用WAR文件呢?在开发阶段不适合使用WAR文件,因为在开发阶段,经常需要添加或删除Web应用程序的内容,更新 Servlet类文件,而每一次改动后,重新建立WAR文件将是一件浪费时间的事情。在产品发布阶段,使用WAR文件是比较合适的,因为在这个时候,几乎不需要再做什么改动了。
在开发阶段,我们通常将Servlet源文件放到Web应用程序目录的src子目录下,以便和Web资源文件区分。在建立WAR文件时,只需要将src目录从Web应用程序目录中移走,就可以打包了
3.jar包和war包的区别;(这篇博客比较关键,提到了:
部署普通的spring项目用war包就可以,部署springboot项目用jar包就可以,因为springboot内置tomcat。 )
参考自【jar包和war包的区别】,该文的作者是【开心的码字达】;
我们上线项目可能经常听到jar包和war包,但是他两的区别可能不太理解,这里就把我自己对jar包和war包的区别讲解下。
(1)从概念上理解:
jar包:JAR包是类的归档文件,JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM这样的工具直接使用。更详细的解释可以看下百度百科的解释(传送门:https://baike.baidu.com/item/JAR/919533?fr=aladdin)
war包:war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。
(2)从解压后的目录结构看:
jar包:
①jar包里的com里放的就是class文件,②配置文件,但是没有静态资源的文件,③大多数 JAR 文件包含一个 META-INF 目录,它用于存储包和扩展的配置数据,如安全性和版本信息。
war包:
而war包里的①WEB-INF里放的class文件和配置文件,②META-INF和jar包作用一样③war包里还包含静态资源的文件
总结起来就是有两点不同:
1.war包和项目的文件结构保持一致,jar包则不一样。
2.jar包里没有静态资源的文件(index.jsp)。
(3)从部署项目上看:
部署普通的spring项目用war包就可以,部署springboot项目用jar包就可以,因为springboot内置tomcat。
4.项目为什么要使用jar或war进行打包发布?区别是什么?
参考自【项目为什么要使用jar或war进行打包发布?区别是什么?】,该文的作者是【起个名字真好难】;
在做项目时,通常对即将要发布的项目打成两种类型的包:jar和war。那么究竟jar和war有什么区别呢? 1.回顾一下我们在做项目时,一般将项目分为两层:服务层和表现层(视图层),通常我们把服务层打包成jar,而把视图层的包打成war包
(1)jar: 通过仔细对比可以发现:jar包中包含了你写程序的所有服务或者第三方类库,它通常是作为幕后工作者,为视图层用户与之交换数据处理的一个服务者,jar文件格式以Zip文件格式为基础,与Zip不同的是,它可以被发布,而且还能用于部署,它封装了库、组件和插件程序,并且可以被编译器和jvm使用,在jar中还包含特殊的文件,如mainfests和部署的应用描述,用于指示工具如何处理特定的jar。 (2)war: 一个war文件可以看成一个web应用程序。与jar封装不同的是:它内聚了很多页面,如html、jsp,Servlet,js,css,icon图片文件等等,当然还包括组成web应用的其他组件,这些文件基本没有复杂业务逻辑的处理,基本上仅仅是用来当做程序的门户负责与使用者交互,仅此而已。
2.这样做有什么好处呢?
根据平时的开发习惯,很容易能够想到:第一,这样做使代码的层次分明,前后端分离;第二,便于划清前后端的职责,加快开发进度并且利于维护;第三,也是我经常用到的,那就是对于靠后期维护的项目来说, 比如业务复杂多变而又琐碎的项目,如果仅仅是改变前端的样式或者进行调整,我不必把服务也关掉,只需要停掉web,做完修改后能够马上部署上线,针对我写过的项目来说,直接调用接口给到的返回结果可以根据需要只在页面进行调用就能够显示,而服务端代码一点都不需要变化,极大方便了开发 。。当然, 使用了springboot后,项目都会被打包成jar,或者打包成war部署在外部容器中也可以 ,这点以后再说。
3.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也是很清楚的了。
二:非web项目,只能打成jar包? web项目只能打成war包?
目前知道的是::
(1)Javase项目,可以打成jar包;(2)普通web项目可以打成war包;(3)Spring Boot项目可以打成jar包,因为其内置了Tomcat;
算了,这个问题,懒得深入研究了;感觉要想完全弄明白,需要了解的东西很多;;;;;包括,web项目的运行机制,Tomcat等容器的原理,java项目在运行时各部分(class文件、配置文件等)的作用;
这算是一个给自己留的坑吧;
三:Maven的package命令,默认打成jar包?
不是,Maven的package命令,可以打成jar包,也可以打成war包;
参考自【maven常用打包命令】 ,该文的作者是【墨明&棋妙】;这篇博客中的内容,自己并没有仔细看;
maven常用打包命令 1、mvn compile 编译,将Java 源程序编译成 class 字节码文件。 2、mvn test 测试,并生成测试报告 3、mvn clean 将以前编译得到的旧的 class 字节码文件删除 4、 mvn pakage 打包,动态 web工程打 war包,Java工程打 jar 包。 5、mvn install 将项目生成 jar 包放在仓库中,以便别的模块调用 6、mvn clean install -Dmaven.test.skip=true 打成jar包,并且抛弃测试用例打包 7、mvn clean pakage -Dmaven.test.skip=true 动态 web工程打 war包,Java工程打 jar 包,并且抛弃测试用例打包
注意事项
Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现”no main manifest attribute, in xxx.jar”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。
要想jar包能直接通过java -jar xxx.jar运行,需要满足:
1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class,这样才能确定程序的入口在哪里;
2、要能加载到依赖包。
在pom.xml中配置: