关于idea:玩转IDEA项目结构Project-Structure打Jar包模块依赖管理全搞定

82次阅读

共计 7007 个字符,预计需要花费 18 分钟才能阅读完成。

你好,我是 A 哥(YourBatman)。

如何给 Module 模块独自减少依赖?
如何晓得哪些 Module 模块用了 Spring 框架,哪些是 web 工程?
IDEA 如何打 Jar 包?打 War 包?

纯熟的正确应用 IntelliJ IDEA,是一个“高手”该有的样子,因为那是你的 门面 。上篇文章 重点介绍了 IDEA 里最为重要的两个概念:Project 我的项目和 Module 模块。置信你看完后 再也不会把 IDEA 的 Project 比作 Eclipse 的 Workspace,并且对 IDEA 有了一份更深的理解。

本文持续了解 IDEA 对我的项目、模块的治理。治理我的项目是一个 IDE 的基本功能,但往往最根底的是最重要的更是最容易被疏忽的。因而本文是你更好去了解 IDEA 治理 maven 构造、gradle 构造、Spring Boot 我的项目构造的 根底 ,万丈高楼平地起,它就是这个地基。下层构造再怎么繁繁多变, 必由之路 最终都由 Project Structure 来体现,从而给开发者以几近雷同的编码体验。

本文提纲

版本约定

  • IntelliJ IDEA:2020.3.1

注释

Project Structure 是一个你开发过程中偶然 / 常常会关上,但却很少用心注意的窗口。不同于个别设置窗口,它和我的项目的紧密度十分的高 且有肯定了解难度,若设置不当我的项目可能无奈运行甚至无奈编码(比方编译报错、jar 包找不着等),为此我做件个别人都不违心做的事,对它进行详解,置信做难事必有所得。

本文基于上文已搭建好的 hello 我的项目案例,持续钻研其我的项目构造 Project Structure 的治理。从构造查看,到批改定制,那么问题来了,如何关上一个 Project 我的项目的 构造页 呢?

如何关上 Project Structure?

看似一个简略的操作,外面其实蕴藏着你对 IDEA Project 和 Module 的了解,否则势必不知从哪下手。据理解,兴许你是多年的程序员,也未必晓得从哪下手。

依照个别思维,会鼠标选中 hello,而后右键:


但对不起,右键菜单里并无 Project Structure 选项。Project Structure 顾名思义,是针对 Project 维度的构造视窗,而你鼠标选中的 hello 只是个 module,所以天然弹出的是对此 module 的操作菜单喽,而非 Project 的。兴许你可能会讲:我点击了 Open Module Settings 也关上了 Project Structure 视窗呀,是的成果上你可能是关上了但情理并非如此,而仅仅是因为把它俩放在了一起(同一视窗)而已。

阐明:了解 IDEA 的 Project 和 Module 两大概念,是对 IDEA 进行所有操作的根底。前文已十分具体(可能是全网最全)的介绍了它俩,可花几分钟返回学习。点这里电梯中转

三种打开方式

要关上一个 Project 的构造展现窗口,至多有如下三种方法,本文都例举给你。

  1. 顶部菜单File -> Project Structure

  1. 点击右上角的快捷按钮

  1. 快捷键形式(举荐)

这是我自己最喜爱的形式,至于快捷键是哪个就看你是如何设定的喽,我的快捷键是 ctrl + shift + alt + s。

啰嗦一句:倡议你操作 IDEA 多用快捷键,那会 大大提高 编码的效率,并且看起来像高手。基本上记住 50 个左右快捷键就够用了,长期以往成了肌肉记忆后这就是你的外围竞争力之一了


关上 hello 我的项目的构造页如下图所示:

解释:为何不须要鼠标选中我的项目?

对于这个动作,敏感的你是否有发现:关上我的项目构造 并不需要 鼠标选中任何货色(快捷键随便应用),也就是说鼠标失焦状态都没问题,何解呢?

答复这个问题并不难,前提是你曾经对 IDEA 的 Project 概念烂熟于胸。一个 Project 对应一个视窗,它们是 严格 1:1的关系。换句话讲,以后视窗就代表着 Project,因而操作本视窗顶部菜单栏就必定是作用在该 Project 上,又何须专门选中什么呢?再者,Project 只是个逻辑概念 ,你想选都没得选中的,所以把视窗当作它就好。有没有感觉,这和 Java 中的this 关键字调用特地像?

最初,这个问题的答案是:只有鼠标还在 IDEA 视窗内(该视窗是沉闷窗口),那么对 Project 就永远就是“选中”状态。

Project Structure 我的项目构造分析

我的项目构造视窗已关上,那接下来重点来喽。能够看到它右边的“菜单栏”,共分为三个 part:

  • Project Settings:我的项目设置(最重要),本文详解
  • Platform Settings:平台设置,也叫全局设置。用于治理 SDK 们(如 JDK、Kotlin 的 SDK 等)、全局库。

    • 一般来讲,全局的 JDK 都会配置在此处,比方我因为常常要做多版本尝试,就治理了多个 JDK 版本

  • Problems:问题。个别我的项目呈现了问题都会在此体现(如依赖不统一问题等等),总之问题数量统一让它是 0 是最优的

其中 Project Settings 外面的每个标签页是最罕用,最关怀的。上面就对它的每个 tab 页作出解释和应用阐明。

Project 页状况

此视窗能够看到 Project 自身的根底信息。如:名称、SDK 版本、语言等级等等,比较简单。

对于此页面的元素,多啰嗦几句:

  1. 为何是 SDK 版本而不是 JDK 版本?答:因为 IntelliJ IDEA 是 JVM 平台 IDEA,不仅仅反对 Java 还有其它语言如 Kotlin,所以写成 SDK 更形象
  2. 为何指定了 SDK 还要指定语言等级?答:因为 SDK 版本并不间接决定语言等级。如你用的 JDK 11,但仍旧能够把语言等级调为 8 来进行编译 / 运行

    1. 这是集成开发环境的劣势所在,轻松对多环境进行定制化反对
  3. SDK 和语言等级 Project 都可指定,作为全局默认

    1. 这些配置 Module 默认集成,但可自行批改本人的。比方 module 1 应用 Java 5 编译,module 2 应用 Java 11 编译,这是容许的

Module 页状况

Module 页堪称是重点中的重点,甚至是最重要。毕竟 Module 作为理论存在模式,所有的源代码、配置、依赖等都在这里,因而大有可学呀。

值得注意:Tests 测试包外面的是能够拜访 Sources 源码的,但反过来不行。

每个模块都能独立治理着本人的依赖,这种关系在模块本人的.iml 文件中记录着。

知识点:

  1. Project 创立时默认会创立一个同名的 Module 模块
  2. Module 默认沿用 Project 的 SDK、语言等级等设置,当然也可本人指定
  3. 每个 Module 可自行治理依赖,能够是二方库、三方库 ……
  4. 本模块的依赖状况默认存储在我的项目的 {moduleName}.iml 文件里

新增依赖

既然 Module 能够自行治理依赖,那么如何给该模块新增依赖呢?

举个例子,当初须要向 hello 模块减少一个commons-io jar 包依赖,能够点击 Dependencies 标签页左下角的 + 号,抉择 Library:

而后抉择,如果没有就抉择 New Libarary... 创立一个呗(有就间接用就成):

上面别离演示抉择 Java 和抉择 From Maven 两种不同库的形式:

新建 Java 依赖库

New Library 新建菜单选项中抉择 Java 选项:

这种形式简略的讲:从你本机里抉择一个 jar(或者一个目录外面蕴含 jar、文档)就成。长处是十分轻便,不依赖网络,毛病是这些 jar 必须是你本机已理论存在的。

新建 Maven 依赖库

New Library 新建菜单选项中抉择 From Maven 选项:

输出 GAV(或者关键字查找)就能定位到 jar,此种形式应用起来其实十分不便,毕竟 maven 十分好用嘛。毛病天然就是个别状况下须要都须要依赖于网络喽,除非你本地仓库已存在对应的 jar。


通过这两种形式各执行一次增加新的依赖实现后,再看 hello 模块的依赖状况,成果如图:

既然依赖变动了,自然而然的也会体现在 hello.iml 文件里喽,来看看:

依赖增加进来,源代码里就能够失常应用啦:

依赖作用范畴

在 New Library 创立依赖的时候,不论用哪种形式选中后,它都会弹出这个窗口让你抉择此依赖的作用范畴

  • Module Library:模块级别,只能本模块应用,别的模块看都看不见
  • Project Library(默认选中):我的项目级别,该我的项目下所有的模块均能看见和选中应用
  • Global Library:全局级别,任何我的项目均可看见和应用

在本例中 commons-io 是模块级别,commons-lang3 是我的项目级别。因而 hello-client 模块增加依赖时也是可能看到 commons-lang3 这个依赖的(但看不见 commons-io):

Libraries 页状况

当某 Library 是所有 / 大部分模块都须要的依赖时,就能够回升为 Project 级别的依赖,抽取到 Libraries 标签页来对立治理。如图,因为下面步骤创立的 commons-lang3 是我的项目级别的,所以也会呈现在这里。

至于如何创立 / 增加 Project 级别的依赖,这里就不必再赘述了吧,下面【新增依赖】章节已讲得很明确。惟一区别在该页面选好后不必再抉择 Library 的作用范畴了(因为就是 Project 级别的嘛),取而代之的是让你抉择作用的模块:

当然喽,你也能够一个都不选(点击 cancle),那么该 jar 只是被创立了,而不作用于任何 module 模块。

阐明:对于一个多模块的 Project 来讲,倡议 我的项目应用的所有 Jar都放在这里对立治理,模块要应用时间接 按需 choose就成,而不须要本人再独自 add,不便对立治理

Facets 页状况

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 的一些便捷操作了。

Artifacts 页状况

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 要求咱们来做的(尽管有些可自动识别),目标是以便其能辨认这些文件并整合各插件实现性能(如自动化配置、主动打包),所有为了编码体验和编码效率。

模块如何依赖其它 Module

一个中大型项目个别有多个模块,它们各司其职。模块与模块之间个别都存在依赖关系,比方常见的 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 的话题暂且先聊到这。其实我想到的主题还有好几个,如:

  • IDEA 如何被动去辨认导入不能被自动识别的 Maven 我的项目?原理是什么呢?
  • IDEA 如何打可执行 Jar 包?又如何打 FatJar?如何打 包外 Jar 包(散包) 呢?
  • IDEA 如何巧用其最新的 Http Client 脚本能力,联合对 Controller 的嗅探疾速实现本地测试?
  • ……

有你 pick 的吗?欢送留言通知我,需要多就尽快上号,不然这个专题就临时告一段落啦,把工夫持续花在其它专题上啦。

本文思考题

本文所属专栏:IDEA,后盾回复专栏名即可获取全部内容。本文已被 https://www.yourbatman.cn 收录。

看完了不肯定懂,看懂了不肯定会。来,文末 3 个思考题帮你复盘:

  1. Module 模块如何独自设置 JDK 版本?
  2. IDEA 如何打 jar 包?
  3. 开个脑洞:Maven 用 pom 治理我的项目构造,IDEA 是如何辨认它的呢?

举荐浏览

  • 谁再把 IDEA 的 Project 比作 Eclipse 的 Workspace,我就跟谁急
  • IntelliJ IDEA 20 周岁啦,为期 2 天的周年庆流动对开发者收费凋谢
  • IntelliJ IDEA 2020.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 系列、日期工夫系列 …… 关注收费获取

正文完
 0