部署 Web 应用子窗口](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_7.png "部署Web应用子窗口")
这个是用于部署 Web 应用的选项卡界面,其中一些功能点:
旁边那个+按钮就是添加所要部署的 Web 应用的按钮,反之-按钮就是移除已经部署的 Web 应用。
右边Application context项是配置该 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应用的界面")
访问 a 页面的路径也发生变化](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_after_change_path.png "访问a页面的路径也发生变化")
在 Tomcat 的${CATALINA_BASE}/webapps目录内根本找不到我们所部署的这个 Web 应用
在$CATALINA_BASE/conf/Catalina/localhost也找不到任何与这个 Web 应用相关的 xml 配置文件
[
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文件")
其实想要知道所访问的 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 项目名命名的文件夹内。
通过上面这些细节,我们搞清楚了 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
从上图我们可以看到 IntelliJ IDEA 非常人性化地提示我们必须给这个模块的构件添加上lib库,做法很简单:
方式 1:看见右下角那个Fix按钮了吗?点一下然后再选第一个,这就可以把lib添加到构件里去了。[
点 Fix](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_4.png "点Fix") Available Elements里面所显示的都是未被添加到构件的内容。在部署并运行 Web 应用前必须先到这里查看还有什么遗漏的内容未添加到构件中。
至于要知道在此处进行什么操作来进行内容添加则更好办了,点Available Elements旁边的?就会显示方式了。[
我们可以通过 IntelliJ IDEA 的一些设置对 Web 项目进行配置,同样地,我们也可以通过 Maven 来对 Web 项目相同的点进行配置,那么它们两者的关系到底是如何的呢?更具体来说,我们有没有必要同时两个都进行配置,因为这里面的工作大多数都是重复的,搞清楚了会让开发更加得心应手。
为了不与之前的演示混淆而让演示更加复杂化,在此从新创建一个 Web 模块作为演示,也便于复习一下前面所演示的步骤。
当我们对一种技术有疑惑摸不着头脑的时候其实最好就是去官网看看有没有权威的解释,以下就是 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中点那个+添加按钮,在弹出的小浮窗中有很多框架技术,它们都是可以让你添加到该模块的框架。
[
对于习惯 Eclipse/MyEclipse 的人来说,初次使用 IntelliJ IDEA 开发 Web 项目并发布它到 Tomcat 的时候,那就会觉得非常陌生并且无所适从。或许这也是大多数 Eclipse 使用者不愿意转型的原因,并且 Eclipse 是那么的流行,中文学习资料也多,工作方式也非常符合常规思路(比如部署 Web 应用到 Tomcat 上),而 IntelliJ IDEA 在工作方式上比起 Eclipse 有很多不同之处(有些还是很特别的),学习资料大多是英文的,所以学习曲线相对前者来说是比较陡峭了。
最基本的流程
既然要学习怎么用这个 IDE 进行部署 Web 应用,并研究一下其中的一些问题,那就得先把这个过场从头到尾走一遍。
创建项目
基本设置
首先肯定是选择创建的是
Java Enterprise
下的Web Application
项目,这个就是 Web 工程 一些设置: ①:JavaEE 版本 ②:Web 应用服务器 ③:Web 应用版本 ④:是否创建web.xml
这些都根据你的需求来设置就行了,这里全部默认。[选择创建 Web 工程](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_1.png "选择创建Web工程")
输入对应的项目名和模块名(这个随便),此处项目名是
PracticeDeploy
,模块名是first-web-app
[项目名和模块名](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_2.png "项目名和模块名")
创建完成后的目录是这样的 [
Web 项目目录](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_3.png "Web项目目录")
创建演示用的资源
[
创建资源后的项目目录](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_4.png "创建资源后的项目目录")
1 个自定义 Servlet
FirstServlet
,在web.xml
内对它进行配置|
|
|
|
|
|
2 个 HTML
a.html
和b.html
|
|
|
|
|
|
部署以及访问
部署前的设置
如下图所示,从 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 应用的选项卡界面,其中一些功能点:
+
按钮就是添加所要部署的 Web 应用的按钮,反之-
按钮就是移除已经部署的 Web 应用。Application context
项是配置该 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.html
或b.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 应用,那你就会发现问题所在:
${CATALINA_BASE}/webapps
目录内根本找不到我们所部署的这个 Web 应用$CATALINA_BASE/conf/Catalina/localhost
也找不到任何与这个 Web 应用相关的 xml 配置文件[
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 时,控制台就会打印出以下这些信息:
其中有几条都出现了同一个目录的路径,这是关键信息。
|
|
|
打开它可以看到以下这些内容:
[
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
文件的内容:|
|
|
从这个现象来看,IntelliJ IDEA 所用的部署方式还是沿用那篇文章所讲的第三种方式。但却又有所不同,因为这个目录并不在 Tomcat 的安装目录内,所以这时那就要看这篇文章进一步补充了。
综上所述,IntelliJ IDEA 是结合 Tomcat 多实例的方式来部署每一个 Web 应用的。
小结
在 Windows 下,当我们创建了 Web 项目时,IntelliJ IDEA 在默认情况下都会遵循这两个步骤:
构建
<project_folder>/out/artifacts
moduleName_war_exploded
文件夹,它将要被部署到 Tomcat部署
${User home}\.IntelliJIdeaXX\system\tomcat
内创建供该 Web 应用使用的 Tomcat 工作目录Tomcat_tomcatVersionCode_projectName
,比如在这演示的就是Tomcat_8_5_16_PracticeDeploy
conf\Catalina\localhost
,创建一个名为moduleName.xml
的文件,用于配置对应的 Web 应用<project_folder>/out/artifacts/moduleName_war_exploded
这样看下来,IntelliJ IDEA 对于构建部署 Web 应用的步骤也不算特别复杂,就是和我们所习惯的不同而已。
依赖管理
现在开发项目基本都用 Maven 了,不用 Maven 那就是落伍甚至给自己找麻烦。
不用 Maven 的情形
添加额外的 jar 并使用它,按照开发 Java Web 最常规的做法就是在
WEB-INF
新建一个lib
目录,然后将所想要的 jar 复制到那里。将 jar 放到 lib 中
不遵照这个约定也是可以的,直接通过 IntelliJ IDEA 添加额外的 jar 或库,但这种约定还是遵照着做才是最好的。
正如那样,这里光复制
dom4j-2.0.0.jar
到WEB-INF/lib
内还是不能用的,还必须进行额外的设置,让它成为该模块的依赖:Project StructureModules
Modules
选项Dependencies
子窗口,点击+
按钮选择JARs or directories
,添加本模块下WEB-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 Structure
的Artifacts
子选项对应的界面进行额外的配置。[
在此处把 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
库,做法很简单:方式 1:看见右下角那个
Fix
按钮了吗?点一下然后再选第一个,这就可以把lib
添加到构件里去了。[点 Fix](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_4.png "点Fix")
Available Elements
里面所显示的都是未被添加到构件的内容。在部署并运行 Web 应用前必须先到这里查看还有什么遗漏的内容未添加到构件中。 至于要知道在此处进行什么操作来进行内容添加则更好办了,点Available Elements
旁边的?
就会显示方式了。[添加方式的描述](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_5.png "添加方式的描述") 比如这里显示了一个还未被添加到构件的
dom4j-2.0.0.jar
,那么只需要在Available Elements
进行这 3 种操作的其中 1 种:dom4j-2.0.0.jar
dom4j-2.0.0
不动将其拖过去左边构件目录结构那一栏里的你所期望的目录,当然还是要先创建lib
子目录根目录
或dom4j-2.0.0.jar
,在弹出菜单选中Put into Output Root
内容添加完成后,构件输出目录就成了这样了。
[
成功把 lib 添加到构件中](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_lib_7.png "成功把lib添加到构件中")
现在一切都准备好了,可以写代码了,这里同样写一个 Servlet。
|
|
|
在
web.xml
对它进行相关的配置。|
|
|
启动 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
。|
|
|
配置完了还不行,要把那些类以及包含它们的包目录一并移动到
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
中配置上刚才所移除的那些依赖。|
|
|
构件输出这里也必须进行必要的配置。
[
删除构件输出目录中的依赖](/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 编译插件的版本过低,因此还是需要进行编译插件的配置。
|
|
|
运行 Maven 的
compile
这样就把模块给编译构建好了,然后按照最开始那样部署到 Tomcat 然后运行它。你会发现基本上都可以正常访问了,唯独一个使用了第三方 jar
dom4j
那个 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
文件的内容是这样的,当然,该模块的grouId
和artifactId
以及version
三巨头你可以根据自己来进行修改:|
|
|
查看 IDE 中的设置
我们先不急着对 Maven 的
pom.xml
文件进行配置,首要是查看 IntelliJ IDEA 对该模块在Project Structure
中各种默认设置是如何的。但现在必须知道的一点是:虽然我们添加了 Maven 支持并且目录结构也产生了变化,但web
这个目录其实还是没遵守 Maven 的约定的,它依然是保持着 IntelliJ IDEA 默认的约定。更确定地说,Project Structure
中的很多设置其实还是遵守未添加 Maven 支持前 IntelliJ IDEA 默认的约定。项目设置
首先来看
Project
中的设置Project
这里确实没什么好说的了,最主要就是设置项目名和项目编译输出目录,其余两项设置得不多,根据自己使用的 JDK 版本来设置就行了。
模块设置
然后到查看
Modules
中的设置,这里的设置都很关键,必须要集中精神看清楚,在这里有十分多个细节点是需要我们关注的。second-web-app
模块的Sources
选项卡Sources
这个选项卡,最重要的就是可以让我们自定义项目的目录结构,并且指定这个某个目录结构到底是什么成分。
second-web-app
模块的Paths
选项卡Paths
这里没什么特别,主要就是设置本模块的编译输出目录。
second-web-app
模块的Dependencies
选项卡Dependencies
为该模块添加或删除依赖的就在这里进行设置。
库设置
接着看到
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")
此处有几个要点要讲:
构件类型 如果像我们这样中途才加入 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
包。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 配置实打实地应用到模块中:
Import Changes
表示就把本次 Maven 改变的配置应用到模块中Enable Auto-Import
表示开启自动把 Maven 改变的配置应用到模块中(不推荐)只要每次把
pom.xml
配置好了,你觉得真的可以了,那么就点一下Import Changes
确认把当前的 Maven 配置应用到模块中。配置
packaging
在本模块的坐标描述之下多加一个
packaging
元素的配置:|
|
|
配置后,你会发现
Project Structure
中很多处的设置都发生了变化:Modules
中Sources
选项卡的语言级别由8
变成5.0
[
Language Level](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_25.png "Language Level")
Modules
中Web
选项内的Web Resource Directories
路径后半段由\web
变成\src\main\webapp
[
Web Resource Directory](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_26.png "Web Resource Directory")
同样的,
Facets
中的Web Resource Directories
也有同样的变化[
Facets](/2017/07/28/Use-Intellij-IDEA-deploy-webapp-to-tomcat/Use-Intellij-IDEA-deploy-webapp-to-tomcat_maven_27.png "Facets")
Artifacts
中也有两个变化:Web Application: Archive
分解的构件的输出路径的后半段也变成了由 Maven 的
artifactId
和version
两者组成 [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 如何构建该模块。|
|
|
加入这个配置后,
Artifacts
内的配置又会产生变化:所输出的构件名都变成了所指定的finalName
的值。 war 包的名称成了:mk_second_web_app.war
。war name
分解的构件的构件名则是
mk_second_web_app
,因为分解的构件就是用文件夹装着,所以输出路径中最后一个目录名就是该构件的名称。exploded name
在
build
内增加一个编译插件的配置|
|
|
再观察一下
Modules
中的配置,可以发现语言级别从之前的5.0
又变回了8
:Language Level
我这个 Maven 默认约定的只是
5.0
,所以你想支持更新的语言特性,必须自己配置这个编译插件。在
build
中增加一个打包插件其实我们之前也发现了在
Modules
的Web
中或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 打包插件来解决这个问题:
|
|
|
最重要的当然就是这一条了,配置它,就可以让 Maven 和 IntelliJ IDEA 都知道
web
这个目录是 Web 资源目录。|
|
|
现在到
Modules
的Web
下或Facets
内看到Web Resources Directories
所配置的路径正确了,没有再报错。总结
看了这么多演示,最重要的就是以上演示的那些,其他的就不再一一列举了,可以说: 极大多数情况下只需配置
pom.xml
,那就相当于在Project Structure
中进行了配置(必须Import Changes
),那就无需再次多此一举在 IDE 进行配置。