关于传统项目打成war包的的分析

时间:2024-01-21 21:04:56

技术在不断的革新,以前的项目没有jar管理工具时,都是手动将依赖的jar拷贝到项目之下,然后Build Path,之后Maven出现了,出现了jar包*仓库,所有的jar包资源集中在这里,免去频繁去网络上查找jar包的麻烦。Maven采用坐标对一个jar进行定位,使每个jar包在*仓库中有唯一标识。后面出现的Gradle,原理和Maven类似,且有更多的新特性。

说回传统项目,通过Eclipse创建一个动态web项目(Dynamic Web Project),其目录结构如下:

│  .classpath
│ .project

├─.settings
│ .jsdtscope
│ org.eclipse.jdt.core.prefs
│ org.eclipse.wst.common.component
│ org.eclipse.wst.common.project.facet.core.xml
│ org.eclipse.wst.jsdt.ui.superType.container
│ org.eclipse.wst.jsdt.ui.superType.name

├─build
│ └─classes
├─src
└─WebContent
├─META-INF
│ MANIFEST.MF

└─WEB-INF
│ web.xml

└─lib 

以点开头的文件或者文件夹:classpath project settings等都是由Eclipse创建,一般忽略不上传到git中(gitignorehttps://*.com/questions/44657300/what-project-files-are-supposed-to-ignore-in-gitignore-file

build 是编译后放class文件的位置,这是Eclipse配置,可以修改,一般部署到Tomcat中后 class文件会放在WEB-INF/classes中(https://blog.csdn.net/tony_java_2017/article/details/80839313

src 源码文件

WebContent web项目的根目录文件夹(MyEcplise创建的话是WebRoot,二者没有本质区别 https://blog.csdn.net/u013938165/article/details/21613573

项目打成war包后放到tomcat中,启动tomcat项目会被解压,解压后的文件如下:


├─META-INF
│ MANIFEST.MF

└─WEB-INF
│ web.xml

├─classes
└─lib

结构和WebContent一致,src中的源码编译后放在了classes文件夹下。

后面的SpringBoot直接内部集成了Tomcat容器,打成jar包就可以运行。不过实际情况也有将SpringBoot打成war包放在Tomcat中运行,不过失去了SpringBoot的一些特性,将SpringBoot项目打成war包后可以看到结构如下:


├─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│ └─com.company
│ └─electric
│ pom.properties
│ pom.xml

├─org
│ └─springframework
│ └─boot
│ └─loader
│ │ ExecutableArchiveLauncher$1.class
│ │ ExecutableArchiveLauncher.class
│ │ JarLauncher.class
│ │ ...
│ │
│ ├─archive
│ │ Archive$Entry.class
│ │ Archive$EntryFilter.class
│ │ Archive.class
│ │ ...
│ │
│ ├─data
│ │ ByteArrayRandomAccessData.class
│ │ RandomAccessData$ResourceAccess.class
│ │ RandomAccessData.class
│ │ ...
│ │
│ ├─jar
│ │ AsciiBytes.class
│ │ Bytes.class
│ │ CentralDirectoryEndRecord.class
│ │ ...
│ │
│ └─util
│ SystemPropertyUtils.class

└─WEB-INF
├─classes
│ │ application.properties
│ │
│ └─com
│ └─company
│ └─electric
│ │ ElectricApplication.class
│ │
│ └─controller
│ IndexController.class

├─lib
│ classmate-1.3.4.jar
│ hibernate-validator-5.3.6.Final.jar
│ jackson-annotations-2.8.0.jar
│ ...

└─lib-provided
spring-boot-starter-tomcat-1.5.13.RELEASE.jar
tomcat-annotations-api-8.5.31.jar
tomcat-embed-core-8.5.31.jar
tomcat-embed-el-8.5.31.jar
tomcat-embed-websocket-8.5.31.jar

结构基本一致。

将 SpringBoot 项目打成 jar 包后,其目录结构如下:


├─BOOT-INF
│ ├─classes
│ │ │ application-dev.properties
│ │ │ application-pro.properties
│ │ │ application.properties
│ │ │
│ │ └─com
│ │ └─company
│ │ └─fetch
│ │ │ FetchPropertiesApplication.class
│ │ │
│ │ └─controller
│ │ IndexController.class
│ │
│ └─lib
│ classmate-1.4.0.jar
│ hibernate-validator-6.0.13.Final.jar
│ jackson-annotations-2.9.0.jar
│ jackson-core-2.9.7.jar
│ ...

├─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│ └─com.company
│ └─fetch_properties
│ pom.properties
│ pom.xml

└─org
└─springframework
└─boot
└─loader
│ ExecutableArchiveLauncher.class
│ PropertiesLauncher$ArchiveEntryFilter.class
│ PropertiesLauncher$PrefixMatchingArchiveFilter.class
│ PropertiesLauncher.class
│ ....

├─archive
│ Archive$Entry.class
│ Archive$EntryFilter.class
│ Archive.class
│ ...

├─data
│ RandomAccessData.class
│ RandomAccessDataFile$1.class
│ RandomAccessDataFile$DataInputStream.class
│ ...

├─jar
│ AsciiBytes.class
│ Bytes.class
│ CentralDirectoryEndRecord.class
│ ...

└─util
SystemPropertyUtils.class

INSERT