秉徇【先有问题,才有方案】
1. 📒问题
众所周知,我们是在各种各样的 IDE 中编写代码的。IDE 除了能方便编写代码外,还要负责编译、运行、测试代码、生成各种各样的文档等等工作。
补充一嘴,IDE 是一个集成开发环境,意味着它提供的很多功能其实是集成的第三方工具来提供的。打个不恰当的比喻,干活的是外包插件,我 IDE 是个管理者,负责组织协调。
而这些工作是借助 IDE 的工程文件来进行的,很多信息都存在了工程文件里。
问题来了,如果两个人用的不一样的 IDE,那么两个人写的代码就没法合在一块,因为有很多内容写在了 IDE 的工程文件内。而不同的 IDE 用于管理项目的文件的规定是不一样的。
2. 💡方案-Maven
需要找一个中立的项目管理的工具
,该工具和使用的 IDE 无关,于是有了 Maven。
2.1 Maven 🆚 传统 IDE
传统的 IDE 对于依赖的工具 Jar 包需要开发者手动导入,需要在编译器中指定依赖包的位置,比较麻烦。
而对于 Maven,你只需要告诉它需要哪个依赖包,它会自动帮你下载导入和打包📦。
2.2 🏠Maven 的文件目录结构
如上所示,Maven 有着自己的对于文件目录的安排规则,使用者需要遵循 Maven 规定的文件目录结构和文件命名方式。
🔥值得一提的是,Maven 下载依赖包时,会先从远程仓库中将依赖包下载到 Maven 的本地仓库中,然后工程项目是从本地仓库中导入的。当项目导入 Jar 包,遇到依赖包版本怎么都不对的情况,往往可以尝试将本地仓库给清空了,重新导入。
2.3 Maven 的 POM 文件
POM 文件描述了一个工程所有需要的事情。POM 文件是可以存在父子继承关系的。共性东西定义在父 POM 中,特性东西定义在子 POM 中。
父子 POM结构
.
├── child0-module
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
├── child1-module
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
└── pom.xml
则父👨POM文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.chenbbay</groupId>
<artifactId>father-module</artifactId>
<version>0.1.0</version>
<packaging>pom</packaging>
<modules>
<module>child0-module</module>
<module>child1-module</module>
</modules>
</project>
2.4 Maven 如何管理编译、打包📦、构建等过程的?
从三个方面来做:生命周期、阶段、插件。
-
生命周期。Maven 生命周期包括:
-
阶段 phase。
每个生命周期中,又分为若干个 phase。生命周期是相互独立的,之间没有先后关系,但是阶段是有先后关系的。
-
插件及插件的目标。
而每个 phase 要做的具体事情需要靠插件来完成,实际上,插件是 Maven 中真正干活的。
插件包括 Maven 自有的插件和第三方提供的插件。一个插件往往有多个功能,每个功能称为一个插件目标。如下所示,插件 maven-complie-plugin 就有两个插件目标。
这些插件是要和相应的 phase 绑定的。
这样就能实现在什么时间做什么事情。插件和 phase 之间是存在默认关联的,当然可以更改。如下所示,生命周期 clean 的 clean 阶段默认关联的插件目标,为插件 maven-clean-plugin 的 clean 目标。
生命周期 Default 中的部分阶段及其默认的绑定的插件目标。
生命周期 Site 中的部分阶段及其默认的绑定的插件目标。
3. 🌰实例
⚠️这个部分主要是使用 IDE 工程文件和 Maven 分别配置管理同一个 Servlet 项目,并做出对比。
😌用 IDE 工程文件来管理项目,可以自定义目录结构,但需要自己手动指定目录的含义;而 Maven 管理下,则需要遵循目录结构约定。
3.1. 使用 IDE 工程文件管理
.iml 后缀的文件是一个项目的 IDE 工程文件。如果没有这个文件,IDE 是识别不了项目文件目录结构的。如下图所示,对于 IDE 来说只是开发人员自建的几个普通文件夹。
没有 IDE 工程文件如果引入 IDE 工程文件,工程文件 servlet.iml 内容如下。
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/java" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
右键该文件,选择 'Import servlet Module',如下图所示,IDE 即可识别出项目的文件目录结构。并且给 servlet 模块配置了 JDK1.8 的开发环境。
导入 IDE 工程文件💡配置 Tomcat 的运行环境。Run->Edit Configurations->Add new configuration->Tomcat Server->Local
,然后配置选项 Application Server
,指定其为本地的 Tomcat 安装目录即可。
💡如果想要进一步配置 Servlet 的开发环境,就需要导入 Servlet 的库。Tomcat 作为 Servlet 容器提供了 Servlet 的开发库,所以可以通过 Modules -> servlet -> Dependencies -> Add -> Libaries -> Applicaiton Server Libraries / Tomcat
指定项目的 Servlet 依赖库。如下所示,servlet.iml 工程文件中新增了依赖库信息。
<orderEntry type="library" exported="" scope="PROVIDED" name="Tomcat 10.0.27" level="application_server_libraries" />
那么,接下来要考虑的事情就是开发完毕后,如何打成 Tomcat 中使用的包,并将其和 Tomcat 运行环境链接起来。
💡需要通过 Project Settings -> Facets -> Add -> Web
新建一个 Servlet 项目模块的 Web Facet,需要指定 Deployment Descriptor【web.xml 的路径】、Web Source Directories【webapp 文件夹的路径】 和 Source Root【src/java文件夹的路径】
的信息,如下是工程文件新增内容。然后点击 create artifact 创建一个 artifact。
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<descriptors>
<deploymentDescriptor name="web.xml" url="file://$MODULE_DIR$/src/webapp/WEB-INF/web.xml" />
</descriptors>
<webroots>
<root url="file://$MODULE_DIR$/src/webapp" relative="/" />
</webroots>
</configuration>
</facet>
</component>
💡然后在Project Settings -> Artifacts
中可以看见新建的 artifact。artifact 就是最后要放入 Tomcat 容器中的项目包。可以自行修改该包的导出路径。
💡最后需要将 artifact 和 Tomcat 运行环境关联起来。通过 Run->Edit Configurations -> tomcat -> deployment -> add
选择创建的 artifact,绑定完成,此时 IDEA 的 Servlet Web 的开发环境就搭建完成✅了。
开发完成后,点击启动 Tomcat 的运行环境,项目就自动打包放入本地的 Tomcat 容器中并运行了,通过浏览器可访问。
我们可以看出,仅通过 IntelliJ 的工程文件来管理项目还是比较繁琐的。
3.2. 使用 Maven 管理
而面对上文同样的事情,Maven 只通过 pom.xml 即可完成全部的管理。只需右键 pom.xml 文件,选择 Add as Maven Project
即可。
Maven 会根据约定自动识别出项目结构,同时根据 pom.xml 配置信息,自动地导入所有依赖库、插件等。如下代码所示,对照着上文工程文件部分看。
💡会自动识别出 src/main/java 为源代码目录,src/main/webapp 为 web 应用文件目录;就无需自己手动去指定了。
💡Maven 会自动下载并导入依赖 javax.servlet:javax.servlet-api:4.0.1,scope 设置为 provided 意为开发时需要,打包无需打入因为 Tomcat 提供了自己的 servlet 实现库。
💡Maven 会自动下载并导入插件 tomcat10-maven-plugin 和 maven-compiler-plugin,分别负责作为开发服务器和编译打包源代码。导入 Tomcat 的插件,就不用自己去下载 Tomcat 并做 IntelliJ 配置了,也不用自己手动去关联 Tomcat Deployment 和打的包了,这些事 Tomcat 插件都自动做了。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat10-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<server>tomcat10</server>
</configuration>
</plugin>
</plugins>
</build>
</project>
Intellij 窗口的右边栏会有 maven 面板,该面板管理了项目的 Lifecycle、Plugins、Dependencies 的信息并提供了快捷操作按钮🔘。
开发完成后,可以先点击 Lifecycle-Package 打包项目,然后点击 Plugins- tomcat10 即可本地运行调整项目了。
同时,该 pom.xml 文件不论在什么 IDE 中打开都不需要改变什么。相比上文的 IntelliJ 工程文件的方法,Maven 简洁方便很多。🔥
🔥事实上 IntelliJ Ultimate 中也提供了快速创建 JakartaEE 项目的方式。在 New Module->Generators/Jakarta EE
中,可以指定 template 为 Web Application / Rest Service / Libary。以 Web Application 为例,指定 Build System 为 Maven 即可创建一个 Maven 管理的 JavaEE Web 应用项目。项目结构如下。
.
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── cn
│ │ └── chenbbay
│ │ └── servlet_maven
│ │ └── HelloServlet.java
│ ├── resources
│ └── webapp
│ ├── WEB-INF
│ │ └── web.xml
│ └── index.jsp
└── test
├── java
└── resources
网友评论