geekyouth / geekyouth.github.io

👣极客青年博客😘,基于github pages+issues + VUE 2.0 框架构建的轻量级静态博客系统💎[速度慢请翻墙]
https://java666.cn
39 stars 6 forks source link

IntelliJ IDEA部署Web应用到Tomcat 细节剖析 #5

Closed geekyouth closed 2 years ago

geekyouth commented 6 years ago

原文地址 https://extremegtr.github.io/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/

  对于习惯 Eclipse/MyEclipse 的人来说,初次使用 IntelliJ IDEA 开发 Web 项目并发布它到 Tomcat 的时候,那就会觉得非常陌生并且无所适从。或许这也是大多数 Eclipse 使用者不愿意转型的原因,并且 Eclipse 是那么的流行,中文学习资料也多,工作方式也非常符合常规思路(比如部署 Web 应用到 Tomcat 上),而 IntelliJ IDEA 在工作方式上比起 Eclipse 有很多不同之处(有些还是很特别的),学习资料大多是英文的,所以学习曲线相对前者来说是比较陡峭了。

最基本的流程

既然要学习怎么用这个 IDE 进行部署 Web 应用,并研究一下其中的一些问题,那就得先把这个过场从头到尾走一遍。

创建项目

基本设置

创建演示用的资源

[

创建资源后的项目目录](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_4.png "创建资源后的项目目录")

部署以及访问

部署前的设置

如下图所示,从 IntelliJ IDEA 工具栏的这里,选Edit Configurations...就可以查看 Tomcat 的设置。

[

从工具栏打开 Tomcat 设置窗口](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_tomcat-config-toolbar.png "从工具栏打开Tomcat设置窗口")

如果还没有 Tomcat 实例,那可以先点左上角的+按钮创建,并且给它命名。

[

Tomcat Server 配置](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_6.png "Tomcat Server配置")

接着在右边的Server选项卡点Configure...,就会出现以下这个窗口,这里指定 Tomcat 具体在哪。

[

Tomcat 目录](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_5.png "Tomcat目录")

然后在Deployment选项卡处添加你将要部署到 Tomcat 的 Web 应用。

[

部署 Web 应用子窗口](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_7.png "部署Web应用子窗口")

这个是用于部署 Web 应用的选项卡界面,其中一些功能点:

从这里也可以看出: 默认什么都不做的情况下,其实只要配置好 Tomcat,Web 应用就已经自动地被添加到部署栏上,即 IntelliJ IDEA 自动把部署配置都给弄好了。

如果不是从头开始新建项目而是导入项目的话,这些设置是不会帮你做好的,你需要自己进行配置。

并且,这个Deployment选项卡是不是看起来有些熟悉?其实这跟 MyEclipse 里面部署 Web 应用的这个界面差不多。

[

MyEclipse 部署 Web 应用的界面](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_deploy_page_in_MyEclipse.png "MyEclipse部署Web应用的界面")

运行 Tomcat

现在什么都不用去做,直接点那个绿色的三角形

启动 Tomcat 按钮

运行 Tomcat,并访问a.htmlb.html页面。[

访问 a 页面的效果](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_tomcat_visit_page.png "访问a页面的效果")

如果把Deployment子界面中的访问路径配置成/first-web-app

[

重新配置访问路径](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_change_path.png "重新配置访问路径")

那么访问a.html的路径将是http://localhost:8080/first-web-app/a.html

[

访问 a 页面的路径也发生变化](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_after_change_path.png "访问a页面的路径也发生变化")

问题

构件在哪?

到现在,一切都非常顺利,整体操作运作起来跟使用 Eclipse/MyEclipse 无异,在说问题之前,先来回顾一下部署 Web 应用到 Tomcat 的几种方式

此刻,如果你想看一下所部署到 Tomcat 的 Web 应用,那你就会发现问题所在:

[

Web 应用不在 webapps](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_no_webapp_in_tomcat.png "Web应用不在webapps") [

没有 Web 应用对应的 xml 文件](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_no_webapp_in_tomcat_2.png "没有Web应用对应的xml文件")

问题:Tomcat 运行起来,Web 应用已经可以被我们访问了,这证明部署成功了,但却在 Tomcat 里找不到它的踪影,这是最奇怪的。

揭开谜团

  其实想要知道所访问的 Web 应用被 IntelliJ IDEA 放到哪方法很简单,之前所写的那个FirstServlet正是为此而准备的,访问它就会显示该 Web 应用所部署在的真实路径。

[

显示 Web 应用所在的路径](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_visit_servlet.png "显示Web应用所在的路径")

从路径上看,IntelliJ IDEA 把应部署给 Tomcat 的 Web 应用放在了默认编译输出路径<project_folder>/out目录里,只不过多了 1 级子目录artifacts

[

Web 应用就在这](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_webapp_real_path.png "Web应用就在这")

  关于这个,MyEclipse 与之比较起来就很不同了,MyEclipse 对普通 Java 项目的编译输出就像是一样,只不过 MyEclipse 默认是把编译好的字节码文件都放到对应工程目录内的bin,但 Web 项目,MyEclipse 把字节码放到bin,但里面的字节码并不是部署的 Web 应用运行时所用到的字节码。默认情况下,MyEclipse 部署 Web 应用到 Tomcat 时会把字节码以及 Web 应用的其他各种资源拷贝到${CATALINA_BASE}/webapps以 Web 项目名命名的文件夹内。

当然,你可以通过Project Structure配置窗口对项目构件在构建时的输出路径进行配置,将构件的输出目录配置为 Tomcat 的webapps目录。

[

配置项目结构](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_output_settings.png "配置项目结构")

其实 MyEclipse 也有同样的配置窗口,只不过我们一般也很少去动它,都是用默认值。

[

MyEclipse 里差不多的配置](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_myeclipse_deploy_settings.png "MyEclipse里差不多的配置")

如何部署?

  通过上面这些细节,我们搞清楚了 IntelliJ IDEA 把已经部署到 Tomcat 的 Web 应用构件放在了<project_folder>/out/artifacts,但这还是有一个问题,现在只是知道构件放哪了,还不知道 IntelliJ IDEA 是如何让该构件部署到 Tomcat 上的,更直白地说是不知道 IntelliJ IDEA 如何让该构件与 Tomcat 关联起来。

答案隐藏在 Tomcat 启动时 IntelliJ IDEA 控制台的信息里。在当我们通过 IntelliJ IDEA 启动 Tomcat 时,控制台就会打印出以下这些信息:

G:\apache-tomcat-8.5.16\bin\catalina.bat run
[2017-08-31 01:33:10,610] Artifact first-web-app:war exploded: Waiting for server connection to start artifact deployment...
Using CATALINA_BASE:   "C:\Users\plaYwiThsouL\.IntelliJIdea2017.2\system\tomcat\Tomcat_8_5_16_PracticeDeploy"
Using CATALINA_HOME:   "G:\apache-tomcat-8.5.16"
Using CATALINA_TMPDIR: "G:\apache-tomcat-8.5.16\temp"
Using JRE_HOME:        "E:\Program\Java\jdk1.8.0_121"
Using CLASSPATH:       "G:\apache-tomcat-8.5.16\bin\bootstrap.jar;G:\apache-tomcat-8.5.16\bin\tomcat-juli.jar"

下面的打印消息省略前缀:day-month-year HH:mm:ss.SS 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log

Server version:        Apache Tomcat/8.5.16
Server built:          Jun 21 2017 17:01:09 UTC
Server number:         8.5.16.0
OS Name:               Windows 7
OS Version:            6.1
Architecture:          amd64
Java Home:             E:\Program\Java\jdk1.8.0_121\jre
JVM Version:           1.8.0_121-b13
JVM Vendor:            Oracle Corporation
CATALINA_BASE:         C:\Users\plaYwiThsouL\.IntelliJIdea2017.2\system\tomcat\Tomcat_8_5_16_PracticeDeploy
CATALINA_HOME:         G:\apache-tomcat-8.5.16

其中有几条都出现了同一个目录的路径,这是关键信息。

|

1

|

C:\Users\plaYwiThsouL\.IntelliJIdea2017.2\system\tomcat\Tomcat_8_5_16_PracticeDeploy

|

打开它可以看到以下这些内容:

[

IntelliJ IDEA 创建的 Tomcat 实例](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_deploy_1.png "IntelliJ IDEA创建的Tomcat实例") [

xml 文件](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_deploy_2.png "xml文件")

而这个first-web-app.xml文件的内容:

|

12

|

|

  从这个现象来看,IntelliJ IDEA 所用的部署方式还是沿用那篇文章所讲的第三种方式。但却又有所不同,因为这个目录并不在 Tomcat 的安装目录内,所以这时那就要看这篇文章进一步补充了。

综上所述,IntelliJ IDEA 是结合 Tomcat 多实例的方式来部署每一个 Web 应用的。

小结

在 Windows 下,当我们创建了 Web 项目时,IntelliJ IDEA 在默认情况下都会遵循这两个步骤:

这样看下来,IntelliJ IDEA 对于构建部署 Web 应用的步骤也不算特别复杂,就是和我们所习惯的不同而已。

依赖管理

现在开发项目基本都用 Maven 了,不用 Maven 那就是落伍甚至给自己找麻烦。

不用 Maven 的情形

添加额外的 jar 并使用它,按照开发 Java Web 最常规的做法就是在WEB-INF新建一个lib目录,然后将所想要的 jar 复制到那里。

将 jar 放到 lib 中

不遵照这个约定也是可以的,直接通过 IntelliJ IDEA 添加额外的 jar 或库,但这种约定还是遵照着做才是最好的。

正如那样,这里光复制dom4j-2.0.0.jarWEB-INF/lib内还是不能用的,还必须进行额外的设置,让它成为该模块的依赖:

这里所有操作的思路和使用 Eclipse/MyEclipse 的思路是基本一致的,出来的效果如下图:

[

添加外部依赖](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_2.png "添加外部依赖")

但光这样还不够,在构建后,输出目录里根本就没有包含我们所添加的这个依赖目录WEB-INF/lib

所以,必须在Project StructureArtifacts子选项对应的界面进行额外的配置。

[

在此处把 WEB-INF/lib 配置上](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_3.png "在此处把WEB-INF/lib配置上")

从上图我们可以看到 IntelliJ IDEA 非常人性化地提示我们必须给这个模块的构件添加上lib库,做法很简单:

内容添加完成后,构件输出目录就成了这样了。

[

成功把 lib 添加到构件中](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_7.png "成功把lib添加到构件中")

现在一切都准备好了,可以写代码了,这里同样写一个 Servlet。

|

1234567891011121314151617181920212223242526272829303132

|

package org.makwan.servlet;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class SecondServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        Document document = DocumentHelper.createDocument();        Element rootElt = DocumentHelper.createElement("root");        document.add(rootElt);        rootElt.addElement("a").setText("test data - 测试数据");        resp.setContentType("text/xml; charset=utf-8");        XMLWriter xmlWriter = new XMLWriter(            resp.getWriter(),            OutputFormat.createPrettyPrint()        );        xmlWriter.write(document);        xmlWriter.close();    }}

|

web.xml对它进行相关的配置。

|

12345678

|

    SecondServlet    org.makwan.servlet.SecondServlet    SecondServlet    /secondServlet

|

启动 Tomcat 访问该 Servlet 的运行结果,一切正常运作完全没问题。

[

访问第二个 Servlet](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_visit_second_servlet.png "访问第二个Servlet")

使用 Maven

  开发简单玩具性质的小项目,纯手工管理jar和构建确实可以,但如果开发大项目则不行了,因为需要依赖的jar太多了,它们的版本以及之间的关系也非常复杂,不用 Maven 管理是不行了,并且,Maven 可以在构建这块也有非常大的作用。

添加 Maven 支持

现在就把这个first-web-app加上 Maven 的支持,方法很简单:右键选该模块,选择弹出菜单中的Add Framework Support...

[

选中加入 Maven 的支持](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_add_maven.png "选中加入Maven的支持")

加入 Maven 支持后,first-web-app模块的目录就会变成这样了。

[

目录结构](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_1.png "目录结构")

自定义目录结构

在 IntelliJ IDEA 中给 Web 项目加入 Maven 支持后,项目并非完全遵守 Maven 默认约定的目录结构:除了存放 Web 应用的目录外,其他默认都是遵守的。

但按照我的个人习惯(估计大多数人?),特别是用于存放项目源码、资源文件、测试源码的目录都不会遵照 Maven 的约定:

所以我们可以在pom.xml对这些不遵照约定的目录进行配置,不遵守约定那肯定得多花些功夫,幸好这些配置还是挺简单的。

针对该模块,我们只需配置源码目录即可。此处将源码目录配置为src

|

12345

|

    ...    ${basedir}/src    ...

|

配置完了还不行,要把那些类以及包含它们的包目录一并移动到src之下,至于 Maven 所生成的那些默认目录可以删除了,这里还用不上。

用 Maven 管理依赖

首先我们把WEB-INF/lib删掉,然后在Project Structure内把它以及 IDE 添加的 Servlet 与 JSP 的依赖 Tomcat 库都移除。

[

移除依赖](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_2.png "移除依赖")

接着肯定是在pom.xml中配置上刚才所移除的那些依赖。

|

123456789101112131415161718192021

|

            javax.servlet        javax.servlet-api        3.1.0        provided                javax.servlet.jsp        javax.servlet.jsp-api        2.3.1        provided                org.dom4j        dom4j        2.0.0    

|

构件输出这里也必须进行必要的配置。

[

删除构件输出目录中的依赖](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_3.png "删除构件输出目录中的依赖")

那现在整个模块的目录就成了这样了。

[

目录结构](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_4.png "目录结构")

尝试构建并运行

现在还不能使用 Maven 对模块进行构建,因为编译时有可能会出问题,因为 Maven 编译插件的版本过低,因此还是需要进行编译插件的配置。

|

1234567891011

|

    ...                        org.apache.maven.plugins            maven-compiler-plugin            3.3                ...

|

运行 Maven 的compile这样就把模块给编译构建好了,然后按照最开始那样部署到 Tomcat 然后运行它。

你会发现基本上都可以正常访问了,唯独一个使用了第三方 jardom4j那个 Servlet 不能正常访问。

[

找不到类](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_5.png "找不到类")

这是因为之前在构件输出目录的配置界面把手工添加的WEB-INF/lib给删除了,而 Maven 虽然可以很方便地管理依赖,但仍要由你决定是否进行添加。

此时还是要到Project Structure中对构件进一步地配置:把我们在 Maven 配置的依赖都添加到输出目录中。

可以看到,还有两个 Maven 依赖还没添加到构件的输出目录中。

还没添加

添加方法也是跟以前那样,添加之后是这样的。

[

添加后](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_7.png "添加后")

IDE 会自动地将所需的依赖都输出到WEB-INF/lib中,注意,我们并没有创建WEB-INF/lib的实际目录,这里显示的只是构建后构件的目录。

现在就运行 Tomcat,再访问这个使用了dom4j的 Servlet,现在就可以正常访问了。

[

添加后](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_8.png "添加后")

Maven 配置与 IDE 设置

  我们可以通过 IntelliJ IDEA 的一些设置对 Web 项目进行配置,同样地,我们也可以通过 Maven 来对 Web 项目相同的点进行配置,那么它们两者的关系到底是如何的呢?更具体来说,我们有没有必要同时两个都进行配置,因为这里面的工作大多数都是重复的,搞清楚了会让开发更加得心应手。   为了不与之前的演示混淆而让演示更加复杂化,在此从新创建一个 Web 模块作为演示,也便于复习一下前面所演示的步骤。

演示起始

创建模块

按照之前所说的步骤一样,首先创建一个Web Application项目,在这我把这个模块命名为second-web-app

新建一个 Web 模块

现在second-web-app只是一个普通的 Web 应用模块,还没有添加 Maven 的支持。

添加 Maven 支持

second-web-app添加 Maven 支持:鼠标右击该模块,选中Add Frameworks Support...,在左边的列表选中 Maven,然后点OK确定即可。

选中 Maven 模块

做到这一步你会发现模块的目录结构没有任何变化,其实现在还没算真正地让 Maven 管理该模块的,还必须做点微小的工作。

加入 Maven 后,IntelliJ IDEA 右下角会弹出一个提示:

Maven prompt

Import Changes即可,如果你不小心把那个提示关掉也无所谓,在pom.xml文件中点右键选Maven中的Reimport: [

reimport](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_12.png "reimport")

初步结果

添加 Maven 支持后,该模块的目录结构就成这样了:

添加 Maven 支持后的目录结构

并且pom.xml文件的内容是这样的,当然,该模块的grouIdartifactId以及version三巨头你可以根据自己来进行修改:

|

12345678910

|

    4.0.0       org.makwan.deploy    second-web-app    1.0

|

查看 IDE 中的设置

  我们先不急着对 Maven 的pom.xml文件进行配置,首要是查看 IntelliJ IDEA 对该模块在Project Structure中各种默认设置是如何的。但现在必须知道的一点是:虽然我们添加了 Maven 支持并且目录结构也产生了变化,但web这个目录其实还是没遵守 Maven 的约定的,它依然是保持着 IntelliJ IDEA 默认的约定。更确定地说,Project Structure中的很多设置其实还是遵守未添加 Maven 支持前 IntelliJ IDEA 默认的约定。

项目设置

首先来看Project中的设置

Project

这里确实没什么好说的了,最主要就是设置项目名和项目编译输出目录,其余两项设置得不多,根据自己使用的 JDK 版本来设置就行了。

模块设置

然后到查看Modules中的设置,这里的设置都很关键,必须要集中精神看清楚,在这里有十分多个细节点是需要我们关注的。

库设置

接着看到Libraries

Libraries

现在没有引入任何第三方的 jar 或库,所以这里是空空如也。

构面设置

再来看到Facets

Facets

光看这个选项Facets这个单词的字面意思:方面琢面刻面等,我们根本不知道这一块到底是什么意思。

同时,细心的话你可以发现在Modules中是有一模一样的设置界面的:

Facets In Modules

当我们对一种技术有疑惑摸不着头脑的时候其实最好就是去官网看看有没有权威的解释,以下就是 IntelliJ IDEA 官方文档对Facets的解释:

When you select a framework (a facet) in the element selector pane, the settings for the framework are shown in the right-hand part of the dialog. 当你在元素选择窗格中选择一个框架(一个构面)时,框架的各种设置将显示在对话框中右侧部分。看完了这段解释再看看 IDE 的所拥有的这个功能:其实我们可以在该对话框内为这个模块添加其他框架(构面)。 正如下图所示,在这两处我们都可以为模块进行这种操作: 在Modules中点那个+添加按钮,在弹出的小浮窗中有很多框架技术,它们都是可以让你添加到该模块的框架。 [

在 Modules 中进行添加](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_21.png "在Modules中进行添加") 在Facets中同样是点那个+添加按钮,也是有同样的效果。 [

在 Facets 中进行添加](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_22.png "在Facets中进行添加")

综上所述:Facets就是构面,结合上下文环境具体来讲构面指的是模块构成的技术层面,即模块是由哪些框架、技术来构成的。

构件设置

最后,看构件(Artifacts)这块的设置了,这块的设置是比较重要的。

[

Artifacts](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_23.png "Artifacts")

此处有几个要点要讲:

  1. 构件类型 如果像我们这样中途才加入 Maven 支持,那么该 Web 应用对应的只有Web Application: Exploded这一种类型的构件。 Web Application: Exploded表示这是一个分解的构件,通俗来说就是这个构件不打包,构件所有内容用一个文件夹来装着,这是默认的构件类型。 当然,我们也可以在这手工地添加上被打包的构件: [

    在此处添加其他类型的构件](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_24.png "在此处添加其他类型的构件") 我们在这看到很多构件类型,其中与Web Application: Exploded对应的是Web Application: Archive,即打包的构件,构件当然是一个war包。

  2. 构件名 默认情况下对于Web Application: Exploded这种构件类型的构件,IntelliJ IDEA 设置的构件名都是以_war_exploded结尾的。 Web Application: Exploded对应的Web Application: Archive这种构件类型的构件默认的构件名是以_war结尾。

配置 Maven 而引起的变化

  现在我们已经看过了Project Structure中默认情况下的设置是什么样的,要作更多的设置我们可以在此处进行:比如:修改构件名,修改构件输出路径,增加打包类型构件等,但在加入 Maven 后,这种做法是十分没必要了,甚至多余。   此处直接开门见山说结论:其实在加入 Maven 后,对于大多数配置来说,配置 Maven 这块就等同于在Project Structure中进行配置。

在看接下来的内容之前我们必须明白一点:当我们每次修改pom.xml过后,IntelliJ IDEA 在右下角就会有如下图所示这样的提示。

Maven prompt

通俗来说就是 Maven 配置改变了,那 IntelliJ IDEA 就需要你在这两个选择中作出一个选择让 Maven 配置实打实地应用到模块中:

  1. Import Changes表示就把本次 Maven 改变的配置应用到模块中
  2. Enable Auto-Import表示开启自动把 Maven 改变的配置应用到模块中(不推荐)

只要每次把pom.xml配置好了,你觉得真的可以了,那么就点一下Import Changes确认把当前的 Maven 配置应用到模块中。

配置packaging

在本模块的坐标描述之下多加一个packaging元素的配置:

|

1234

|

org.makwan.deploysecond-web-app1.0war

|

配置后,你会发现Project Structure中很多处的设置都发生了变化:

  1. 多增加了一个构件,其类型是Web Application: Archive
  2. 分解的构件的输出路径的后半段也变成了由 Maven 的artifactIdversion两者组成 [

    Archive](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_28.png "Archive") [

    Exploded output directory](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_29.png "Exploded output directory")

  现在看来,这些配置才是 Maven 默认遵守的。更具地提说,到现在,模块second-web-app才是真正地被 Maven 约束管理起来。   这一系列的变化确实很多,但packaging配置所真正影响到的只会是Project Structure中的Artifacts这一处的配置,把它的值指定为war,这样等同于在Artifacts中为second-web-app添加一个Web Application: Archive类型的构件。

配置build内的finalName

之前pom.xml内没有build元素,现在给它添加上,这里的配置是告诉 Maven 和 IntelliJ IDEA 如何构建该模块。

|

123

|

    mk_second_web_app

|

加入这个配置后,Artifacts内的配置又会产生变化:所输出的构件名都变成了所指定的finalName的值。 war 包的名称成了:mk_second_web_app.war

war name

分解的构件的构件名则是mk_second_web_app,因为分解的构件就是用文件夹装着,所以输出路径中最后一个目录名就是该构件的名称。

exploded name

再观察一下Modules中的配置,可以发现语言级别从之前的5.0又变回了8

Language Level

我这个 Maven 默认约定的只是5.0,所以你想支持更新的语言特性,必须自己配置这个编译插件。

build中增加一个打包插件

其实我们之前也发现了在ModulesWeb中或Facets中,Web Resources Directories所配置的路径变红了,证明配置不正确。

problem

报错,那是当然的,现在Web Resources Directories中配置的可是 Maven 默认约定的格式,但实际上目录结构又是这样: [

acctually](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_34.png "acctually") 同样可以发现,web目录这个图标并没有一个蓝色的亮点,而之前是有的: 这正是因为 Maven 配置不正确或目录结构没有遵守 Maven 约定的缘故。

这里我就选择不遵守默认约定的目录结构而是配置一个 Maven 打包插件来解决这个问题:

|

12345678910111213141516

|

                                org.apache.maven.plugins            maven-war-plugin            2.6                                            ${basedir}/web                                ${project.build.directory}/${project.build.finalName}                        

|

最重要的当然就是这一条了,配置它,就可以让 Maven 和 IntelliJ IDEA 都知道web这个目录是 Web 资源目录。

|

1

|

${basedir}/web

|

现在到ModulesWeb下或Facets内看到Web Resources Directories所配置的路径正确了,没有再报错。

总结

看了这么多演示,最重要的就是以上演示的那些,其他的就不再一一列举了,可以说: 极大多数情况下只需配置pom.xml,那就相当于在Project Structure中进行了配置(必须Import Changes),那就无需再次多此一举在 IDE 进行配置。

共计:17523 个字
Merciless-Lindom commented 4 years ago