工作三年还不懂facet?赶紧学一学IntelliJ IDEA如何管理java项目

Posted JAVA炭烧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作三年还不懂facet?赶紧学一学IntelliJ IDEA如何管理java项目相关的知识,希望对你有一定的参考价值。


入职三年,写了很多业务代码,做了无数个产品需求,却没有自己搭建过一个项目?从其他团队接手一个老项目,从git拉下来一大堆代码,要该怎么运行?代码写得好好的,IntelliJ IDEA突然退出,搞好以后重新打开项目,却发现本地运行不了了,怎么办?

以上问题基本是因为我们不熟悉Intellij IDEA的项目结构导致的。Intellij IDEA 是现在java程序员最经常使用的IDE,它功能强大,集成多种框架插件,让java开发效率倍增。然而, 很多新手程序员依然不明白,在IntelliJ IDEA中,一个项目代码是怎样管理的,IDEA管理的项目与maven管理的项目他们之间有什么区别,又有什么联系?

假如没有在IntelliJ IDEA中把项目搭建好,那么我们在查看一个spring bean的class的时候,想要跳转到它的bean定义,是跳转不了的。其次,在查看某些代码的时候,会发现它依赖的另外一些代码报错,显示没有定义,而实际上这些代码就是定义在当前项目里面。没搭建好项目,开发起来很恼火,对强迫症不友好。

很多新手程序员不太懂IntelliJ IDEA怎么管理项目,在拿到代码之后,不知道怎么把项目导入IntelliJ IDEA。有的同学发现IDEA比较"智能",只要通过它的import project功能就能自动建立起项目结构,然后代码索引、项目依赖等都已经自动配置完成,不用再手动配置任何东西。的确,对于一些结构标准的项目来说,利用IDEA自动导入功能足够了,但是当你遇到一些"祖传的"遗留项目时,还是需要了解IDEA的项目管理方式才行。

所以我觉得有必要学习IntellJ IDEA项目结构,只有熟悉自己每天都在使用的工具,我们才能更好地完成工作。了解IntelliJ IDEA项目结构,先打开Project Structure窗口看看。

由图可知,IntelliJ IDEA中的一个项目包含5类信息,分别是Project(项目信息)、Modules(模块信息)、Libraries(依赖信息)、Facets(框架信息)以及Artifacts(构建输出信息)。这些信息只是用于本地IntelliJ IDEA管理项目的,它不属于代码,因此不必提交到git。

1. Project(项目信息)

一个IntelliJ IDEA项目只需要一组项目信息,而且其中没有复杂结构。主要包含project name(项目名称)、project sdk(项目所使用的SDK)、project language level(编程语言版本)及project compiler output(编译输出目录)

项目名称 (project name) 的主要作用就是显示,把这个项目显示在IntelliJ IDEA的项目列表中,方便查找。名称可以任意取,不影响代码。

项目SDK (project sdk) 是在整个项目范围内的SDK,这个SDK主要指编程语言运行库或运行环境,例如Java项目的常用SDK就是JDK(具体到Oracle JDK或OpenJDK)。项目SDK为项目内每个module提供默认SDK,而每个模块也可以配置自己的SDK。例如,一个大的java项目内包含一个用python编写的模块,这个模块需要使用自己的SDK。

项目语言等级 (project language level) 指的是编程语言版本。编程语言也是在向前发展的,也有版本号,例如java 6,java 7 一直到现在的 java 13。通过配置编程语言版本,IDEA就可以检查有没有语法错误,看是不是高版本语言特性被用在低版本语言的环境中。跟项目SDK一样,项目模块也可以为自己指定语言等级。

编译输出目录 (project compiler output) 指的是IntelliJ IDEA在编译项目代码的过程中,把中间生成的class文件保存到哪个地方。跟前面一样,每个模块也可以自己配置编译输出目录,所以项目级的编译输出目录可以设置为空。

2. Modules(模块信息)

模块信息定义项目里面有多少个模块,每个模块里面使用哪些框架。它对于IntelliJ IDEA管理项目非常重要,尤其是对于模块之间有互相依赖的项目来说,一定要把Modules信息配置好。如果没有配置好,那么模块A引用模块B的代码的时候,就会报class undefined的错误。切换到Modules之后,看到类似于下图的界面。

在Modules页面中,左侧的树形列表用于显示模块,其中模块用非叶子节点表示,框架用叶子节点表示,模块可以有子模块。新手在看这里的信息的时候,容易分不清哪些节点表示模块,哪些节点表示框架,从而不知道怎么修改这里的配置,感到困惑。对于我个人来说,我所见过的大部分项目都是一个项目里面包含多个模块,只有一层结构,很少出现子模块的,但是IntelliJ IDEA的确是支持多层级模块结构的,由此看得出IntelliJ IDEA的隐藏实力也是非常强的。

每个模块也是有不同的类型的,你可以通过点击左侧属性列表上方的加号,在弹出的"New Module"中看到module有哪些类型。我们一般用得最多的模块是Java,其实还有其他类型的模块,例如JBOSS、J2ME等,只是国内比较少见罢了。模块一旦创建之后,它的类型是不可变的(类型的名称一般也看不见,不过我们可以通过图标来判断它属于哪一种类型)

模块创建好以后,你就可以选中一个模块,修改它的配置信息。模块配置信息分三类,包含:Sources(源码)、Paths(路径)、Dependencies(依赖)。由于篇幅有限,这里不再详细说明了,可自行用IntelliJ IDEA打开项目,查看哪些信息可以配置。

要注意的是,创建一个模块之后,如果这个模块使用了某些开源框架,例如Spring,Servlet,则可以为它创建对应这些框架的叶子节点,这样我们在IntelliJ IDEA中进行开发的时候,就会感到非常方便,跳转等辅助功能就能自动开启。

3. Libraries(库依赖)

这里其实就是把所有模块的依赖汇总显示在一个列表中。这里看到的是整个项目所依赖的外部模块(要看每个模块的依赖,可以切换到Modules页面去查看),在这里还可以配置每个依赖的source包依赖、document包依赖等。因此,你在开发需求的时候,要想查看某个依赖模块的文档或代码,应该先检查这里是否配置了对应包。

4. Facets(框架信息)

前面在讲解Modules的时候,我们说过,可以给每个module配置一些框架的信息,从而帮助IDEA管理项目代码,让IDEA支持框架的特性,例如Spring的bean定义跳转,MyBatis的mapper文件的跳转等。

项目结构 (Project Structure) 中的Facet与前面每个module中配置的框架有关。它是把所有模块的框架信息合并,然后按照facet进行空间划分。每个facet相当于一个独立的空间,它把项目中各模块的框架信息放在这个空间之内,从而实现框架之间信息的打通。

例如,某一个项目有3个模块,我们分别命名为A,B,C。这3个模块都使用了框架spring,并且各自配置了自己的spring配置文件。我们在IDEA中编写代码时(注意,不是运行的时候),如何让分布在这3个模块的spring配置文件中的bean放到一个统一的空间,从而实现在他们之后互联互通?方法就是在IDEA中创建一个facet,例如命名为"Spring",然后把这3个module中的spring框架信息都加入到"Spring"这个facet里面。这样模块A中的bean通过依赖注入,引用模块B中的bean的时候,IDEA就能找到。除了同类型框架的打通,facet还可以实现不同类型之间框架的打通,例如把spring、mybatis、thymleaf等有互操作关系的框架放到同一个facet里面,就能实现它们之间互通。注意,这里说的互通,指的都是编码阶段,IDEA查找代码,并非运行阶段。

5. Artifacts(制品信息)

最后这一部分,主要用于配置项目的输出结果,适用于编译生成可执行程序,然后把编译生成的可执行文件、jar包等交付给客户的应用场景,多见于2B的业务场景。国内的互联网公司的开发模式,自动编译部署系统用得比较多,代码编译都是在专门的服务器上执行了,所以一般的java程序员不太关注这里。感兴趣的同学可以关注一下,到这里看一看,操作操作,能很快明白这里的用途。

通过以上讲解,相信你已经对IntelliJ IDEA的项目配置胸有成竹了。如果再遇到编译错误,发现import那行报错,而import的类明明就在当前项目里面,你应该知道怎么办了吧。如果有不明白的地方,欢迎留言交流。

希望以上分析对您有帮助。如果对互联网编程技术、前端、后端、客户端、软件架构、分布式、高并发、电商、Redis、mysql、Zookeeper、Spring、android、浏览器插件、Java、Java虚拟机、Java
Script、C/C++、Linux、个性化推荐、社区发现、机器学习、数据挖掘、程序员职场、学术论文、Gnuplot、LaTeX等感兴趣的话,欢迎加入Java进阶交流群714827309

最后

最近我整理了整套《JAVA核心知识点总结》,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

Java进阶群

以上是关于工作三年还不懂facet?赶紧学一学IntelliJ IDEA如何管理java项目的主要内容,如果未能解决你的问题,请参考以下文章

人才盘点九宫格你还不来学一学人才九宫格,知道领导在做人才梯度结构盘点时把你划分为属于哪一类人才吗?

还不懂 C/C++ 指针结构体指针指针函数函数指针?赶紧看过来!

还不懂 C/C++ 指针结构体指针指针函数函数指针?赶紧看过来!

程序员面试的套路,该学一学了

PHP使用Nginx实现反向代理,学一学吧

UG编程实例,带你学一学自行车的绘图和建模