zl程序教程

您现在的位置是:首页 >  后端

当前栏目

玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定(下)

jarIDEA项目模块依赖 管理 结构 玩转
2023-09-27 14:25:56 时间
新建Java依赖库


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

image.png


image.png

这种方式简单的讲 从你本机里选择一个jar 或者一个目录里面包含jar、文档 就成。优点是非常轻便 不依赖网络 缺点是这些jar必须是你本机已实际存在的。


新建Maven依赖库


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


image.png


输入GAV 或者关键字查找 就能定位到jar 此种方式使用起来其实非常方便 毕竟maven非常好用嘛。缺点自然就是一般情况下需要都需要依赖于网络喽 除非你本地仓库已存在对应的jar。


通过这两种方式各执行一次添加新的依赖完成后 再看hello模块的依赖情况 效果如图


image.png


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


image.png


依赖添加进来 源代码里就可以正常使用啦


image.png


依赖作用范围


在New Library创建依赖的时候 不管用哪种方式选中后 它都会弹出这个窗口让你选择此依赖的作用范围


image.png


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


在本例中commons-io是模块级别 commons-lang3是项目级别。因此hello-client模块添加依赖时也是能够看到commons-lang3这个依赖的 但看不见commons-io :


image.png


Libraries页情况


image.png


当某Library是所有/大部分模块都需要的依赖时 就可以上升为Project级别的依赖 抽取到Libraries标签页来统一管理。如图 因为上面步骤创建的commons-lang3是项目级别的 所以也会出现在这里。


至于如何创建/添加Project级别的依赖 这里就不用再赘述了吧 上面【新增依赖】章节已讲得很明白。唯一区别在该页面选好后不用再选择Library的作用范围了 因为就是Project级别的嘛 取而代之的是让你选择作用的模块


image.png


当然喽 你也可以一个都不选 点击cancle 那么该jar只是被创建了 而不作用于任何module模块。


说明 对于一个多模块的Project来讲 建议项目使用的所有Jar都放在这里统一管理 模块要使用时直接按需choose就成 而不需要自己再单独add 方便统一管理


Facets页情况


image.png



Facets可理解为用于配置Project项目的框架区 它能看到项目的每个Module模块使用的框架、语言等情况 并且还可以对它们进行配置。


比如Spring框架 如果某个模块使用了它就可以来这里统一配置。优点是你会发现借助IDEA强大的功能它都给你想好了哪些地方可配置 你可以更改 让你实现配置界面化。除了Spring 其它框架如Hibernate也是如此~


目前支持的Facets 语言/框架 类型有


image.png


模块对应的Facets IDEA会自动Detection探测 若没有你也可以手动添加。


为了更形象的描述此tab页的作用 这里搬一个我自己生产项目来看看实际效果


image.png


image.png


说明 不同的Facet对应的最右端窗口内容配置项是不一样的。


通过此视窗 可以看到你当前Project项目 哪些模块使用了Spring框架 哪些是web项目 一目了然。它有个非常大的作用就是站在Project的视角对每个模块进行整体把控 比如若你发现有个模块不需要是web项目 并不需要对外提供服务接口 那铁定就是多引包了或者职责不清晰导致的 就可立马针对性解决 消除隐患。


在实际工作中我自己比较频繁的使用这个功能 用于对模块性质的定位 比如如果是普通模块 绝对不允许是web工程 如果不需要依赖Spring绝对不允许成为Spring工程。因为严格控制Jar包依赖、工程性质是应对大型项目的有效手段。


当然喽 Facets还有个作用是让IDEA编译器认识你的模块 比如如果你是个web模块 若没有在Facets里体现出来 那IDEA就不认识你 就无法给你提供web的一些便捷操作了。


Artifacts页情况


IDEA如何打Jar包 如何打War包 来 上菜~


image.png


在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


image.png


image.png


配置好后 只需顶部菜单栏Build - Build Artifacts 就可以打出这个Jar包


image.png


image.png


执行完此命令后 在Output Directory里就能看到hello.jar这个打包好的文件啦。然后java -jar .\hello.jar就能运行喽 因为咱们打的是可执行Jar包 。关于使用IDEA打包还包括打可执行jar包、Fatjar、包外引用jar包等等 这里就不展开了 后面会放在单独文章里把各种方式汇总在一起聊聊。


总的来说 无论配置Facets还是Artifacts 都是Intellij IDEA要求我们来做的 虽然有些可自动识别 目的是以便其能识别这些文件并整合各插件实现功能 如自动化配置、自动打包 一切为了编码体验和编码效率。


模块如何依赖其它Module


一个中大型项目一般有多个模块 它们各司其职。模块与模块之间一般都存在依赖关系 比如常见的xxx-core模块一般会被其它几乎所有模块所依赖。模块依赖外部库Library知道怎么搞了 那么如何增加本项目的模块依赖呢


其实道理和步骤基本一样 比如hello-core模块里有个Person类


image.png


hello-service模块也需要用到Person类及其功能 那么就需要把hello-core模块依赖进来 操作步骤如下


添加Dependency依赖时 请选择Module Dependency...选项


image.png


选择本项目中需要依赖进来的模块


image.png


选中hello-core模块把它依赖到hello-service里来


image.png


点击ok 搞定了。对应的 此依赖关系也会体现在hello-service.iml这个配置文件上


image.png


如此 我们就可以在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个思考题帮你复盘


Module模块如何单独设置JDK版本 IDEA如何打jar包 开个脑洞 Maven用pom管理项目结构 IDEA是如何识别它的呢