美文网首页🍺Jakarta EE & Spring
🔥 管理 JavaEE Web Application|Inte

🔥 管理 JavaEE Web Application|Inte

作者: en_young | 来源:发表于2022-11-12 01:16 被阅读0次

秉徇【先有问题,才有方案】


1. 📒问题

众所周知,我们是在各种各样的 IDE 中编写代码的。IDE 除了能方便编写代码外,还要负责编译、运行、测试代码、生成各种各样的文档等等工作。

补充一嘴,IDE 是一个集成开发环境,意味着它提供的很多功能其实是集成的第三方工具来提供的。打个不恰当的比喻,干活的是外包插件,我 IDE 是个管理者,负责组织协调。

而这些工作是借助 IDE 的工程文件来进行的,很多信息都存在了工程文件里。

问题来了,如果两个人用的不一样的 IDE,那么两个人写的代码就没法合在一块,因为有很多内容写在了 IDE 的工程文件内。而不同的 IDE 用于管理项目的文件的规定是不一样的。

2. 💡方案-Maven

需要找一个中立的项目管理的工具 ,该工具和使用的 IDE 无关,于是有了 Maven。

2.1 Maven 🆚 传统 IDE

传统的 IDE 对于依赖的工具 Jar 包需要开发者手动导入,需要在编译器中指定依赖包的位置,比较麻烦。

而对于 Maven,你只需要告诉它需要哪个依赖包,它会自动帮你下载导入和打包📦。

2.2 🏠Maven 的文件目录结构

\begin{array}{c|lcr} \hline 目录 & \text{用途} \\ \hline $\{basedir\} & 存放 pom.xml 和所有的子目录 \\ \hline $\{basedir\} /src/main/java & 项目的 java 源代码 \\ \hline $\{basedir\} /src/main/resources & 项目的资源,例如property文件, springmvc.xml \\ \hline $\{basedir\} /src/main/filters & 项目的资源过滤文件\\ \hline $\{basedir\} /test/java & 项目的测试类,比如Junit代码 \\ \hline $\{basedir\} /src/test/resources & 测试用的资源 \\ \hline $\{basedir\} /src/main/webapp/WEB-INF & web应用文件目录、web项目的信息,比如存放web.xml、本地图片、jsp视图页面 \\ \hline $\{basedir\} /target & 打包📦输出目录 \\ \hline $\{basedir\} /target/classes & 编译输出目录 \\ \hline $\{basedir\} /target/test-classes & 测试编译输出目录 \\ \hline ~/.m2/repository & Maven默认的本地仓库目录位置 \\ \hline \end{array}

如上所示,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 生命周期包括:
    \begin{array}{c|lcr} \hline 生命周期 & \text{工作内容} \\ \hline clean & 项目构建前的清理工作 \\ \hline default & 项目构建工作 \\ \hline site & 项目报告生成和发布 \\ \hline \end{array}

  • 阶段 phase。
    每个生命周期中,又分为若干个 phase。生命周期是相互独立的,之间没有先后关系,但是阶段是有先后关系的。
    \begin{array}{c|lcr} \hline 生命周期 & \text{包含的阶段} \\ \hline clean & pre-clean、clean、post-clean \\ \hline default & 常用的 phase 有:validate、compile、test、package、verify、install、deploy \\ \hline site & pre-site、site、post-site、site-deploy \\ \hline \end{array}

  • 插件及插件的目标。
    而每个 phase 要做的具体事情需要靠插件来完成,实际上,插件是 Maven 中真正干活的。
    插件包括 Maven 自有的插件和第三方提供的插件。一个插件往往有多个功能,每个功能称为一个插件目标。如下所示,插件 maven-complie-plugin 就有两个插件目标。
    \begin{array}{c|lcr} \hline 插件目标& \text{描述} \\ \hline maven-complie-plugin:compile & 编译位于 src/main/java 目录下的主源码 \\ \hline maven-complie-plugin:testCompile & 编译位于 src/test/java 目录下的测试源码 \\ \hline \end{array}

这些插件是要和相应的 phase 绑定的。这样就能实现在什么时间做什么事情。插件和 phase 之间是存在默认关联的,当然可以更改。如下所示,生命周期 clean 的 clean 阶段默认关联的插件目标,为插件 maven-clean-plugin 的 clean 目标。
\begin{array}{c|lcr} \hline 阶段& \text{内置绑定的插件目标} \\ \hline clean & maven-clean-plugin:clean \\ \hline \end{array}

生命周期 Default 中的部分阶段及其默认的绑定的插件目标。
\begin{array}{c|lcr} \hline 阶段& \text{内置绑定的插件目标} \\ \hline process-resource & maven-resources-plugin:resources \\ \hline compiler & maven-compiler-plugin:compile\\ \hline process-test-resources & maven-resources-plugin:testResources\\ \hline test-compile & maven-compiler-plugin:testCompile\\ \hline test & maven-surefire-plugin:test\\ \hline package & maven-jar-plugin:jar/maven-war-plugin:war\\ \hline install & maven-install-plugin:install\\ \hline deploy & maven-deploy-plugin:deploy\\ \hline \end{array}

生命周期 Site 中的部分阶段及其默认的绑定的插件目标。
\begin{array}{c|lcr} \hline 阶段& \text{内置绑定的插件目标} \\ \hline site & maven-site-plugin:site \\ \hline site-deploy & maven-site-plugin:deploy\\ \hline \end{array}

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

相关文章

网友评论

    本文标题:🔥 管理 JavaEE Web Application|Inte

    本文链接:https://www.haomeiwen.com/subject/sevtxdtx.html