我要好好学习 IDEA!

IDEA 是什么,IDEA 是世界上最棒的 Java 开发工具。但是因为我对它的不熟悉,基本上看着各种英文选项都看不懂,所以不可以这样子下去了!我要更好的了解我手上的开发工具,来减少 Debug 的时间!

项目管理

Project

对于 IDEA 来说,Project 是一个项目的总称,而 Module 是项目不同部分实现的模块。比如一个电商系统中,需要使用到分布式系统开发多个服务器后台,那么 Project 就是这个电商系统,Module 就是服务器1、服务器2、的开发模块。

当然也可以一个 Project 只包含一个 Module,那么这个时候两者就是同一个东西了,都指的是当前项目。

如果想要一个 Project 包含多个 Module,那么就新建一个空的 Project,然后在空 Project 中新建各种模块。这个空的 Project 就是起一个约束的作用:

312.jpg

Module

然后就是关于项目下面的模块的单独管理了:

1 表示选择的相应模块进行设置。

2 表示模块的目录结构的标识,比如将某些目录标识为源码目录,资源目录等等,作用是让 IDEA 对不同目录的内容做不同的处理,比如源码目录就涉及到代码之间的导入和编译(只有 IDEA 知道此目录是源码目录才会去找 java 编译成 class),比如 Test 目录就是测试的时候和源码目录合并,但是编译到 target 文件夹的时候忽略,等等。

3 表示不同类型的表示都有哪些文件夹,相当于一个汇总。

313.jpg


然后在后面就是路径管理,主要就是编译后的输出位置,一般都是 target 文件夹。

314.jpg


这里主要是管理模块所依赖的外部库的(Libraries),IDEA 整个项目下面有一个 External Libraries 概念的项目外部库,里面有所有模块导入的各种外部库,可以从这里面添加其他模块以来的外部库到自己的模块中。

而 Export 选项是当我们将模块导出来成 Jar 包的时候,是否将依赖的外部库也打包进去。

315.jpg

Libraries

Libraries 这个主要是本项目(Project)下面的所有外部依赖进行一个管理,所有模块被 add as Libraries 的 Jar 包都会出现在这里(Maven 添加进来的自动导入 Libraries 中)。

1 表示当前项目中所有模块添加的 Project 级别的依赖仓库,2 表示对这些仓库进行修改和查看下载信息(编译文件,源码,文档)

316.jpg

Facets

Facets 的中文是刻面,表示事物的方面特征,在这里表示记录整个项目的一些特征,比如用了哪些框架(Spring),项目是哪一类的(Web 项目),等等:

318.jpg

Artifacts

Aritfacts 的意思是制品,表示我们项目最后的输出状态:jar (代码包)或者 war (Web 程序包)。

比如下面就是 Module1 的 Artifacts 页面,其中 1 表示两种形式,一中是经过压缩的(第一个),一种是不经过压缩的,可以看到目录结构的(第二个,exploded 的)。我们一般选择后者来调整输出内容。

2 则表示的是项目打包输出的时候的输出内容,也就是我们本机编写的 Module1 的代码,和引入的外部依赖 lib 文件夹。这里的外部依赖是根据 Maven 的配置文件 pom.xml 中读取的,回将默认的 scope compile 类型的仓库添加到 lib 文件夹里面。

如果我们有一些库是从本地 Jar 包形式或者 Global、Project 范围的 Libraries 中导入的话,因为在 pom.xml 中没有他们的身影,所以在打包的时候也没有他们,这就需要我们用区域 3,从模块已有的依赖库中选择要添加到打包的库文件。

319.jpg

Platfrom Settings

这个就是关于 IDEA 这个平台的整体的设置了,包括 SDK 的包的选择,还有 Global 级别的 Libraries 的管理。

320.jpg

依赖管理

iml 文件

Java 中的一个单模块项目或者多模块项目中的每一个模块,都会有一个模块名的 iml 文件,这个文件就是保存本模块的依赖信息的文件,IDEA 也就是根据这个文件将项目依赖的 Jar 包添加到当前项目的 ClassPath 之中:

1
2
3
4
5
6
7
8
9
<!--引用 Global 级别的库,所有的项目所有模块都可以引用-->
<orderEntry type="library" name="commons-beanutils-1.8.0" level="application" />
<!--引用 Project 级别的库,只有当前项目下面的所有模块才可以引用-->
<orderEntry type="library" name="druid-1.1.9" level="project" />
<orderEntry type="module-library">
<library> <!--引用 Module 级别的库,只有本模块才可以引用-->
<root url="jar://$MODULE_DIR$/src/test/java/c3p0-0.9.1.2.jar!/" />
</library>
</orderEntry>

Maven 管理

当我们在 Maven 中添加了一个 Jar 包的下载信息之后,Maven 会自动下载 Jar 包到一个固定的文件夹(user/.m2/repostory/),下载完成之后,会自动更新 iml 文件,将 Jar 包以 Project 级别引入当前模块。

因为 Maven 下载的 Jar 包都在固定的文件夹,所以 Maven 也会根据 pom.xml 里面的记录将 Jar 包信息添加到 External Libraries 中,表示 Jar 包来自于外部的文件夹,并不是本项目目录结构里面的。有时候在 pom.xml 添加了下载信息之后,并没有更新 iml 文件,但是更新了 External Libraries 列表,这时候就需要手动将下载好的 Jar 包从 External Libraries 列表中用 add as Library (其实就是写到 iml 文件中)添加到当前模块的依赖中。

根据当前项目下所有模块的 pom.xml 文件显示的外部库列表:

317.jpg

Q&A

Library 和 jar 的区别

jar 包通常用来表示一个小功能的所有 .class 文件,而 Library 更像是 jar 包的文件夹,将若干个 jar 包打包在一起,作为一个 Library (当然单个 jar 包也可以作为 Library)。

Project 和 Module 的关系

Project 用来作为一个文件夹约束包含的模块 Module,模块 Module 是实现一个完整功能的最小单位。

External Libraries 和 Maven 的关系

External Libraries 是从 Maven 文件 pom.xml 中读出来并展示的,表示从外部引入的库(外部指 Maven 下载目录,项目目录为内部引用)。