你好,我是A哥(YourBatman)。java
如何给Module模块单独增长依赖?
如何知道哪些Module模块用了Spring框架,哪些是web工程?
IDEA如何打Jar包?打War包?程序员
熟练的正确使用IntelliJ IDEA,是一个“高手”该有的样子,由于那是你的门面。上篇文章 重点介绍了IDEA里最为重要的两个概念:Project项目和Module模块。相信你看完后不再会把IDEA的Project比做Eclipse的Workspace,而且对IDEA有了一份更深的了解。web
本文继续理解IDEA对项目、模块的管理。管理项目是一个IDE的基本功能,但每每最基础的是最重要的更是最容易被忽略的。所以本文是你更好去理解IDEA管理maven结构、gradle结构、Spring Boot项目结构的基础,万丈高楼平地起,它就是这个地基。上层结构再怎么繁繁多变,异曲同工最终都由Project Structure来体现,从而给开发者以几近相同的编码体验。网络
Project Structure是一个你开发过程当中偶尔/常常会打开,但却不多用心留意的窗口。不一样于通常设置窗口,它和项目的紧密度很是的高且有必定理解难度,若设置不当项目可能没法运行甚至没法编码(好比编译报错、jar包找不着等),为此我作件通常人都不肯意作的事,对它进行详解,相信作难事必有所得。架构
本文基于上文已搭建好的hello项目案例,继续研究其项目结构Project Structure的管理。从结构查看,到修改定制,那么问题来了,如何打开一个Project项目的结构页呢?框架
看似一个简单的操做,里面其实蕴藏着你对IDEA Project和Module的理解,不然势必不知从哪下手。据了解,也许你是多年的程序员,也未必知道从哪下手。maven
按照通常思惟,会鼠标选中hello,而后右键:函数
但对不起,右键菜单里并没有Project Structure
选项。Project Structure顾名思义,是针对Project维度的结构视窗,而你鼠标选中的hello只是个module,因此天然弹出的是对此module的操做菜单喽,而非Project的。也许你可能会讲:我点击了Open Module Settings
也打开了Project Structure视窗呀,是的效果上你多是打开了但道理并不是如此,而仅仅是由于把它俩放在了一块儿(同一视窗)而已。工具
说明:理解IDEA的Project和Module两大概念,是对IDEA进行一切操做的基础。前文已很是详细(多是全网最全)的介绍了它俩,可花几分钟前往学习。 点这里电梯直达
要打开一个Project的结构展现窗口,至少有以下三种办法,本文都例举给你。学习
File -> Project Structure
这是我本人最喜欢的方式,至于快捷键是哪一个就看你是如何设定的喽,个人快捷键是ctrl + shift + alt + s。
啰嗦一句:建议你操做IDEA多用快捷键,那会
大大提升编码的效率,而且看起来像高手。基本上记住
50
个左右快捷键就够用了,长期以往成了肌肉记忆后这就是你的核心竞争力之一了
打开hello项目的结构页以下图所示:
对于这个动做,敏感的你是否有发现:打开项目结构并不须要鼠标选中任何东西(快捷键随意使用),也就是说鼠标失焦状态都没问题,何解呢?
回答这个问题并不难,前提是你已经对IDEA的Project概念烂熟于胸。一个Project对应一个视窗,它们是严格1:1的关系。换句话讲,当前视窗就表明着Project,所以操做本视窗顶部菜单栏就确定是做用在该Project上,又何必专门选中什么呢?再者,Project只是个逻辑概念,你想选都没得选中的,因此把视窗看成它就好。有没有以为,这和Java中的this
关键字调用特别像?
最后,这个问题的答案是:只要鼠标还在IDEA视窗内(该视窗是活跃窗口),那么对Project就永远就是“选中”状态。
项目结构视窗已打开,那接下来重点来喽。能够看到它左边的“菜单栏”,共分为三个part:
Platform Settings:平台设置,也叫全局设置。用于管理SDK们(如JDK、Kotlin的SDK等)、全局库。
其中Project Settings里面的每一个标签页是最经常使用,最关心的。下面就对它的每一个tab页做出解释和使用说明。
此视窗能够看到Project自己的基础信息。如:名称、SDK版本、语言等级等等,比较简单。
对于此页面的元素,多啰嗦几句:
为什么指定了SDK还要指定语言等级?答:由于SDK版本并不直接决定语言等级。如你用的JDK 11,但依旧能够把语言等级调为8来进行编译/运行
SDK和语言等级Project均可指定,做为全局默认
Module页可谓是重点中的重点,甚至是最重要。毕竟Module做为实际存在形式,全部的源代码、配置、依赖等都在这里,所以大有可学呀。
值得注意:Tests测试包里面的是能够访问Sources源码的,但反过来不行。
每一个模块都能独立管理着本身的依赖,这种关系在模块本身的.iml文件中记录着。
知识点:
{moduleName}.iml
文件里既然Module能够自行管理依赖,那么如何给该模块新增依赖呢?
举个例子,如今须要向hello模块增长一个commons-io
jar包依赖,能够点击Dependencies标签页左下角的+号,选择Library:
而后选择,若是没有就选择New Libarary...
建立一个呗(有就直接用就成):
下面分别演示选择Java和选择From Maven两种不一样库的方式:
New Library新建菜单选项中选择Java
选项:
这种方式简单的讲:从你本机里选择一个jar(或者一个目录里面包含jar、文档)就成。优势是很是轻便,不依赖网络,缺点是这些jar必须是你本机已实际存在的。
New Library新建菜单选项中选择From Maven
选项:
输入GAV(或者关键字查找)就能定位到jar,此种方式使用起来其实很是方便,毕竟maven很是好用嘛。缺点天然就是通常状况下须要都须要依赖于网络喽,除非你本地仓库已存在对应的jar。
经过这两种方式各执行一次添加新的依赖完成后,再看hello模块的依赖状况,效果如图:
既然依赖变化了,天然而然的也会体如今hello.iml文件里喽,来看看:
依赖添加进来,源代码里就能够正常使用啦:
在New Library建立依赖的时候,无论用哪一种方式选中后,它都会弹出这个窗口让你选择此依赖的做用范围
在本例中commons-io是模块级别,commons-lang3是项目级别。所以hello-client模块添加依赖时也是可以看到commons-lang3这个依赖的(但看不见commons-io):
当某Library是全部/大部分模块都须要的依赖时,就能够上升为Project级别的依赖,抽取到Libraries标签页来统一管理。如图,由于上面步骤建立的commons-lang3是项目级别的,因此也会出如今这里。
至于如何建立/添加Project级别的依赖,这里就不用再赘述了吧,上面【新增依赖】章节已讲得很明白。惟一区别在该页面选好后不用再选择Library的做用范围了(由于就是Project级别的嘛),取而代之的是让你选择做用的模块:
固然喽,你也能够一个都不选(点击cancle),那么该jar只是被建立了,而不做用于任何module模块。
说明:对于一个多模块的Project来说,建议 项目使用的全部Jar都放在这里统一管理,模块要使用时直接 按需choose就成,而不须要本身再单独add,方便统一管理
Facets可理解为用于配置Project项目的框架区,它能看到项目的每一个Module模块使用的框架、语言等状况,而且还能够对它们进行配置。
好比Spring框架,若是某个模块使用了它就能够来这里统一配置。优势是你会发现借助IDEA强大的功能它都给你想好了哪些地方可配置,你能够更改,让你实现配置界面化。除了Spring,其它框架如Hibernate也是如此~
目前支持的Facets(语言/框架)类型有:
模块对应的Facets IDEA会自动Detection探测,若没有你也能够手动添加。
为了更形象的描述此tab页的做用,这里搬一个我本身生产项目来看看实际效果:
说明:不一样的Facet对应的最右端窗口内容配置项是不同的。
经过此视窗,能够看到你当前Project项目,哪些模块使用了Spring框架,哪些是web项目,一目了然。它有个很是大的做用就是站在Project的视角对每一个模块进行总体把控,好比若你发现有个模块不须要是web项目(并不须要对外提供服务接口),那铁定就是多引包了或者职责不清晰致使的,就可立马针对性解决,消除隐患。
在实际工做中我本身比较频繁的使用这个功能,用于对模块性质的定位,好比若是是普通模块,绝对不容许是web工程,若是不须要依赖Spring绝对不容许成为Spring工程。由于严格控制Jar包依赖、工程性质是应对大型项目的有效手段。
固然喽,Facets还有个做用是让IDEA编译器认识你的模块,好比若是你是个web模块,若没有在Facets里体现出来,那IDEA就不认识你,就没法给你提供web的一些便捷操做了。
IDEA如何打Jar包?如何打War包? 来,上菜~
在Maven大行其道的今天,虽然用IDEA打包不多使用了,可是有些时候它对你本地调试仍是蛮有用的,而且对理解maven的打包依旧有效,来,了解一下。
Artifacts这个概念不是特别好理解,artifact是maven里的一个概念,被IDEA借鉴过来。表示某个模块要何种打包形式,如jar、war exploded、war、ear等等。Artifact是一个项目资源的组合体,整合编译后的 java 文件,资源文件等。有不一样的整合方式,好比jar、war、war exploded等等,对于一个module而言,有了Artifact就能够部署了,相似于maven的package打包。
说明:war 和 war exploded区别就是后者不压缩,开发时选后者便于实时看到修改文件后的效果
来个栗子,这里演示下将hello模块打包成一个Jar:
配置好后,只需顶部菜单栏Build -> Build Artifacts,就能够打出这个Jar包:
执行完此命令后,在Output Directory
里就能看到hello.jar这个打包好的文件啦。而后java -jar .\hello.jar
就能运行喽(由于我们打的是可执行Jar包)。关于使用IDEA打包还包括打可执行jar包、Fatjar、包外引用jar包等等,这里就不展开了,后面会放在单独文章里把各类方式汇总在一块儿聊聊。
总的来讲,不管配置Facets仍是Artifacts,都是Intellij IDEA要求咱们来作的(虽然有些可自动识别),目的是以便其能识别这些文件并整合各插件实现功能(如自动化配置、自动打包),一切为了编码体验和编码效率。
一个中大型项目通常有多个模块,它们各司其职。模块与模块之间通常都存在依赖关系,好比常见的xxx-core模块通常会被其它几乎全部模块所依赖。模块依赖外部库Library知道怎么搞了,那么如何增长本项目的模块依赖呢?
其实道理和步骤基本同样,好比hello-core模块里有个Person类:
hello-service模块也须要用到Person类及其功能,那么就须要把hello-core模块依赖进来,操做步骤以下:
添加Dependency依赖时,请选择Module Dependency...
选项:
选择本项目中须要依赖进来的模块:
选中hello-core模块把它依赖到hello-service里来:
点击ok,搞定了。对应的,此依赖关系也会体如今hello-service.iml这个配置文件上:
如此,咱们就能够在hello-service模块里正常使用Person类啦:
public static void main(String[] args) { System.out.println(new Person()); }
完美。
本文对IntelliJ IDEA的项目结构Project Structure的每一个tab页进行了全面分析,据我短浅的目光所及,多是全网独一份写这个内容的。不少同窗以为IntelliJ IDEA不须要专门的学习分析,会用它导入maven项目,跑跑main函数启动下Spring Boot就成啦,我却不觉得然。
衡量一个新手和一个高手的差别不是顺风顺水时,而是遇到问题时谁可以快速解决,谁又只能望洋兴叹,相信薪资的差别也体如今此。我见过的“高手”对本身最经常使用的工具用得都是很666的,这不正是技术范该有的样子麽?说到底,咱们不可能认为用一指禅敲代码的人会是大牛嘛~
好啦,关于IDEA的话题暂且先聊到这。其实我想到的主题还有好几个,如:
有你pick的吗?欢迎留言告诉我,需求多就尽快上号,否则这个专题就暂时告一段落啦,把时间继续花在其它专题上啦。
本文所属专栏:IDEA,后台回复专栏名便可获取所有内容。本文已被https://www.yourbatman.cn收录。
看完了不必定懂,看懂了不必定会。来,文末3个思考题帮你复盘:
System.out.println("点个赞吧!"); print_r('关注【BAT的乌托邦】!'); var_dump('私聊A哥:fsx1056342982'); console.log("点个赞吧!"); NSLog(@"关注【BAT的乌托邦】!"); print("私聊A哥:fsx1056342982"); echo("点个赞吧!"); cout << "关注【BAT的乌托邦】!" << endl; printf("私聊A哥:fsx1056342982"); Console.WriteLine("点个赞吧!"); fmt.Println("关注【BAT的乌托邦】!"); Response.Write("私聊A哥:fsx1056342982"); alert("点个赞吧!");
A哥(YourBatman)
:Spring Framework开源贡献者,Java架构师,领域专家。文章不标题党,不哗众取宠,每篇文章都成系列去系统的攻破一个知识点,每一个系列多是全网最佳/惟一。注重基本功修养,底层基础决定上层建筑。现有IDEA系列、Spring N多系列、Bean Validation系列、日期时间系列......关注免费获取