- 文档
- 教程
【免费下载链接】IntelliJ-IDEA-Tutorial
IntelliJ IDEA 简体中文专题教程
本篇文章是 IntelliJ IDEA 简体中文专题教程中关于 Eclipse Java Web 项目迁移的实战指南,完整覆盖从 Eclipse 项目(以开源论坛项目 JspRun 为例)直接打开、目录标注、依赖包管理、Facets/Artifacts 配置,到 Tomcat 启动、热更新、停止与 war 包输出的全流程。读完本文,你可以不借助任何导入向导,直接在 IntelliJ IDEA 中打开并运行一个传统的 Eclipse Java Web 项目,并理解Sources、Excluded、Facts、Artifacts、On Update action等 IntelliJ IDEA 特有概念的底层含义。
Eclipse 用户迁移前的概念准备:Workspace / Project / Module 对照
很多从 Eclipse 迁移过来的开发者,第一反应是"在同一个窗口里管理多个项目"。但 IntelliJ IDEA 没有 Eclipse 工作空间(Workspace)的概念,它的组织模型是:一个 Project 打开一个 Window 窗口,Project 是最高层级,其次才是 Module。
- Eclipse 的
workspace类似 IntelliJ IDEA 的Project(但不应照搬理解); - Eclipse 的
project对应 IntelliJ IDEA 的Module; - Eclipse 的
.project文件对应 IntelliJ IDEA 的.iml模块配置文件; - IntelliJ IDEA 的项目级配置保存在
.idea目录中,项目与模块的配置变动都以 XML 文件方式体现,详见仓库中的项目相关概念与 Hello World 项目创建与项目配置文件介绍。
正因为 Module 是可独立编译、运行、测试和调试的最小功能单元,传统的单 Module Eclipse 项目在 IntelliJ IDEA 中通常只对应一个 Module,这也决定了本文后面所有配置都在"单 Module"前提下展开。
认识典型 Eclipse Java Web 项目结构(以 JspRun 为例)
在 Eclipse 下,中小型 Java Web 项目的目录结构基本都是固定的模式:顶层有src源码目录,输出根目录为WebRoot(或webapp),其下有WEB-INF目录,WEB-INF内部通常包含classes(编译输出)和lib(依赖包)两个关键子目录。本文以一个开源论坛项目 JspRun 作为演示对象,其典型结构如下:
从上图可以看出几个关键角色:
src:可编译的源代码目录;WebRoot:整个项目的 Web 输出根目录,是容器(Tomcat)部署时访问的根;WEB-INF:存放web.xml等核心配置文件;WEB-INF/classes:编译后的 class 文件输出目录;WEB-INF/lib:项目依赖的 jar 包目录。
后续所有配置步骤,都是围绕让 IntelliJ IDEA 正确识别以上这些角色的职责来展开的。
直接打开 Eclipse 项目:选择 .project 文件
IntelliJ IDEA 对 Eclipse 项目支持非常友好——支持直接打开 Eclipse 项目,无需任何导入操作。做法是:在 IntelliJ IDEA 中通过打开文件的方式,直接选中 Eclipse 项目根目录下的.project文件即可完成项目打开。
打开后 IntelliJ IDEA 会自动识别项目结构,从源码结构看,它完成了三类关键识别:
src目录自动识别为可编译源码目录:文件夹图标会变成蓝色(Source root 标识),见下图标注 1;WebRoot被识别为项目输出根目录:Web 资源区域(标注 2)虽重要但无需手工配置;WEB-INF下的配置文件、classes与lib目录被识别:其中classes目录默认被标为红色(Excluded排除目录),因为编译产物对开发无意义,IntelliJ IDEA 不会为它建立索引,但这不影响容器运行时使用这些编译产物。
由于这是单 Module 项目,接下来需要把Project compiler output(项目编译输出目录)指定到项目WEB-INF下的classes编译目录,保证编译产物落到容器可加载的位置。
目录标注五大类型:Sources / Tests / Resources / Test Resources / Excluded
打开项目后,可以根据项目实际情况对任意目录进行五种类型的标注。操作方式是:选中要标注的目录,再点击右侧对应类型的标注按钮。这个知识点非常重要,是后续手动管理项目结构的基础。
五种类型的具体含义如下:
| 标注类型 | 用途说明 |
|---|---|
Sources | 标注可编译的源码目录,类似src。只有 Sources 类型的目录才能新建 Java 类和包,这一点务必牢记。有时项目除了src还有其他目录需要可编译,也要标注为 Sources |
Tests | 标注可编译的单元测试目录。在规范的 Maven 项目中,顶层src不会标为 Sources,而是将src/main/java标为 Sources、src/test/java标为 Tests |
Resources | 标注资源文件目录。Maven 项目中的src/main/resources会标为此类型,资源目录下的文件会被编译/复制到输出目录 |
Test Resources | 标注单元测试的资源文件目录。对应 Maven 中的src/test/resources,同样会输出到编译目录 |
Excluded | 标注排除目录。被排除的目录不会被 IntelliJ IDEA 创建索引,相当于被废弃,其中的代码不具备代码检查和智能提示等常规功能 |
从这些类型的划分可以明显看出 IntelliJ IDEA 对 Maven 标准目录结构的深度支持——Tests、Resources、Test Resources三种类型基本就是为 Maven 规范结构量身设计的。对于非 Maven 的传统项目,一般只要设置好src一个目录即可,其余按需调整。
操作上的两个细节也值得注意:
- 被标注的目录会在设置界面右侧有一个总览(概括列表),方便一眼看清整个 Module 的目录角色划分;
- 上图中的
classes目录虽然是Excluded,但由于它特殊且不可编辑,不会出现在右侧总览中; - 如果想取消某个目录的标注含义,点击标注按钮旁边的打叉(删除)按钮即可移除标注。
依赖包(Libraries)管理:五种操作与目录级引入
在项目设置中可以看到项目当前所有的依赖包列表,其中红色显示的依赖包表示 IntelliJ IDEA 无法识别(例如路径失效或格式不识别)。依赖包支持五种操作:
- 加号:引入新的依赖包;
- 减号:移除对应的依赖包;
- 向上箭头:依赖包上移。列表越靠上的依赖包在项目加载时越优先,对于同一依赖包的不同版本,依赖顺序不同,最终生效结果也可能大不相同;
- 向下箭头:依赖包下移,原因同上;
- 笔:编辑依赖包的名称和路径。
引入依赖包时,IntelliJ IDEA 支持三种来源:单个jar包、一个目录、以及已经导入到项目Libraries中的依赖包;多 Module 项目还可以依赖其他 Module。
这里有一个非常实用的技巧:以目录为单位引入依赖,而不是逐个 jar 引入。除非各个依赖包之间存在严格的依赖顺序关系,否则不建议逐个引入(繁琐且难以维护)。推荐做法分两步:
- 先把项目中散落的零散依赖包全部移除;
- 把项目的
lib目录作为一个整体依赖包,先放置到项目级Libraries中(Gif 演示见 images/xxi-b-eclipse-project-settings-8.gif);
这样做的最大好处是:以后项目需要新增 jar 时,只要把 jar 放进lib目录就会被自动引入,因为这里引用的是目录而不是一个个具体的 jar 包,无需每次手工添加。
Facets:管理框架配置文件的核心区
对于传统 Java Web 项目,还需要指定web.xml的位置,这一步通常在Facts(Facets)中进行配置。Facts可以理解为 IntelliJ IDEA 的"项目框架区",专门用于管理项目使用的框架及其配置文件,这是 IntelliJ IDEA 特有的配置点。
除了web.xml必须配置外,其他框架即使不在这里配置也不会影响项目运行,但会失去 IDE 的辅助功能。例如项目中一般都有 Spring 框架,Spring 有大量配置文件,如果在这里正确配置了 Spring Facet,IntelliJ IDEA 编辑区底部会多出几个 Spring 项目的专属设置区——因为你明确告知了 IDE 项目使用了 Spring,IDE 就会提供对应的配置与导航能力。Hibernate 等其他框架同理。
Artifacts:配置 war 展开输出结构
Artifacts同样是 IntelliJ IDEA 特有的概念,可以理解为配置项目最终输出结果的地方。Java Web 项目一般必备一个配置:把项目配置成 war 包展开(exploded)的方式输出,这样容器才能直接运行该项目。
关于 Artifacts 配置的几个要点:
- Artifacts 的输出结构由前面 Module 等几项配置共同决定,如果 Module 配置没有大问题,这里可以省去不少步骤;
- 有些时候仍需手工调整,例如本演示项目中默认生成的输出目录是错的,需要改为项目中的
webRoot目录; - 该 Artifacts 配置在后续配置 Tomcat 的 Deployment 时会被引用,务必重点留意。
Tomcat 应用服务器配置:容器、VM 参数与更新事件
引入并选择容器
IntelliJ IDEA 支持目前市场上主流的应用容器(Tomcat、Jetty 等),基本一个 IDE 就能满足常见项目开发。但要注意:IntelliJ IDEA 支持这些容器,不等于自带这些容器的文件,容器本身仍需要你自行准备。本文演示中原本只引入了 Tomcat 7,为了演示又引入了 Tomcat 6——引入时只需指定容器存放目录,IntelliJ IDEA 会自动识别。
核心配置项逐项拆解
在 Tomcat 运行配置面板中(对应 images/xxi-c-eclipse-project-tomcat-settings-3.jpg),以下几个配置项是重点:
- 切换容器(标注 1):可以随时为项目切换不同的应用容器,例如在 Tomcat 6 与 Tomcat 7 之间切换;
- VM 参数(标注 2):可以为运行中的容器指定 JVM 参数,例如内存大小、JRebel 的
-agentpath等; - 更新事件(标注 3):这是 IntelliJ IDEA 特有的重点功能,包含两个事件:
On Update action(按 Ctrl + F10 更新时触发):当按下Ctrl + F10更新容器时,按此处配置的事件执行更新。最常用的是Update classes and resources,即把最新编译的类和资源文件更新到容器中。在 Debug 模式下,这个动作就是所谓的HotSwap(热交换),只是这种热部署体验不如 JRebel 插件(详见仓库中的 JRebel 热部署插件安装与使用);On frame deactivation(切换到其他应用时触发):当从 IntelliJ IDEA 切换到浏览器时触发指定事件。这是因为 Web 开发需要频繁在 IDE 与浏览器之间切换测试,该功能帮你在切换时自动做更新;但切换过于频繁时非常耗资源,所以推荐设置为Do nothing(切换时什么都不做);
- HTTP 端口(标注 4):默认 Tomcat HTTP 端口是 8080,需要改端口时在这里设置;
- 启动前操作(标注 5):配置容器运行前要执行的动作,包括
Make和Build Artifacts。其中Build Artifacts是在 Deployment 选项卡中添加了 Artifact 之后自动出现的。关于Make只编译修改过文件的增量编译机制,可参考仓库中的 IntelliJ IDEA 编译方式介绍。
项目运行准备:数据库与配置文件
通过上面的配置,IntelliJ IDEA 环境层面的配置已基本完成,接下来配置项目相关部分。
首先打开 MySQL,执行以下 SQL 脚本,创建一个新的数据库和用户:
CREATE DATABASE `jsprun` CHARACTER SET utf8; CREATE USER 'jsprun'@'localhost' IDENTIFIED BY 'jsprun'; GRANT ALL PRIVILEGES ON jsprun.* TO 'jsprun'@'localhost'; FLUSH PRIVILEGES;然后切换到新建的jsprun数据库,执行项目自带的数据初始化脚本,文件位置为:JspRun\WebRoot\install\jsprun_zh_CN.sql。
最后修改JspRun\WebRoot\config.properties文件中的数据库连接属性为:
dbuser = jsprun dbpw = jsprun引入 Tomcat 依赖包并启动项目
首次运行前,项目还缺少 Tomcat 的依赖包(如servlet-api.jar、jsp-api.jar等),需要先在 Module 依赖中把 Tomcat 库引入进来,否则运行时会报错(演示见 images/xxi-d-eclipse-project-tomcat-run-1.gif)。
引入之后即可启动项目,最终运行效果如下:
停止 Tomcat 的正确姿势
Tomcat 的停止按钮需要点击两次:第一次点击后出现一个骷髅头图标,此时并未真正停止,需要再点击一次才能完成停止。
即使点了两次,Tomcat 容器有时也不一定能完全停掉,这时非常容易出现端口被占用的问题。解决方法是:打开系统的资源管理器,手动结束系统上所有 java 相关进程(例如kill掉残留的 Java 进程),释放被占用的端口后重新启动。
输出 war 压缩包
除了在Artifacts中配置之外,还需要在 Tomcat 容器的 Deployment 中也跟着配置,这样在启动容器时才会输出一个 war 压缩包(演示见 images/xxi-e-eclipse-project-output-war-1.gif)。
通过这一配置过程也能理解 war 包的本质:war 压缩包本质上是根据展开的 war 输出包(exploded)压缩而来。所以只要 Artifacts 的展开结构配置正确,war 包内容就会与其一致,无需手工维护两份。
小结
把 Eclipse Java Web 项目迁移到 IntelliJ IDEA,核心路径可以概括为五步:直接打开.project文件 → 确认目录标注与编译输出目录 → 以目录方式引入lib依赖 → 配置 Facets 与 Artifacts → 配置 Tomcat 并运行。其中最容易忽略的两个点分别是:classes等Excluded目录不影响容器使用、以及依赖包顺序会影响同版本冲突时的生效结果。掌握这五步之后,无论是传统的 Eclipse Web 项目还是后续过渡到 Maven 结构项目(可参考仓库中的 Maven 结构项目搭建 与 Maven 单模块/多模块 Spring MVC + Spring + Mybatis 项目讲解),都能在 IntelliJ IDEA 中顺畅运行。
- 文档
- 教程
【免费下载链接】IntelliJ-IDEA-Tutorial
IntelliJ IDEA 简体中文专题教程
相关推荐
Tomcat安装部署完全指南:从零开始搭建Java Web环境
Tomcat安装部署完全指南:从零开始搭建Java Web环境 本文详细介绍了Apache Tomcat的完整安装部署流程,从环境准备、JDK配置要求开始,逐步
后端Web框架认证鉴权使用 IntelliJ IDEA 搭建并运行 MXNet Java 示例项目(Maven 全流程指南)
使用 IntelliJ IDEA 搭建并运行 MXNet Java 示例项目(Maven 全流程指南) 本篇技术指南以 MXNet 官方 Java 教程为骨架,
深度学习机器学习人工智能livox_ros_driver2命令行操作速查:最常用的5条命令与适用场景
livox_ros_driver2命令行操作速查:最常用的5条命令与适用场景 livox_ros_driver2 是 Livox 雷达(HAP、Mid 360、
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考