当前位置: 首页 > 科技观察

玩转IDEA工程结构ProjectStructure,创建Jar包,模块-依赖管理都搞定了

时间:2023-03-19 19:04:13 科技观察

大家好,我是A哥(YourBatman)。如何给Module模块单独添加依赖?如何知道哪些Module模块使用了Spring框架,哪些是web项目?IDEA是如何打包Jar的?包裹大战?熟练正确使用IntelliJIDEA才是“高手”该有的样子。因为那是你的正面。上一篇文章重点介绍了IDEA中最重要的两个概念:Project和Module。相信你看完以后绝对不会拿IDEA的Project和Eclipse的Workspace进行比较,对IDEA的理解也会更加深刻。本篇继续了解IDEA对项目和模块的管理。项目管理是IDEA的一项基本功能,但往往最基本的也是最重要的,也是最容易被忽视的。因此,本文是您更好地了解IDEA对maven结构、gradle结构、SpringBoot项目结构管理的基础。无论上层结构如何繁多,ProjectStructure最终体现的是同一个目标,从而给予开发者几乎相同的编码体验。本文概述IntelliJIDEA的版本协议:2020.3.1TextProjectStructure是你在开发过程中偶尔/经常打开的一个窗口,但你却很少去关注它。不同于一般的设置窗口,它与项目的关系非常密切,不易理解。如果设置不当,可能会导致项目无法运行甚至代码(如编译出错,找不到jar包等),所以我做了一个一般人看不懂的块。不想做的事,就详细说明,相信做有难度的事,一定会有收获。本文以上面已经搭建好的hello项目案例为基础,继续研究其项目结构ProjectStructure的管理。从结构查看到修改定制,问题来了,如何打开一个Project工程的结构页面?如何打开项目结构?看似简单的操作,其实包含了你对IDEAProject和Module的理解,否则势必无从下手。据了解,也许你已经做了很多年的程序员,你可能不知道从哪里开始。按照一般的思路,鼠标会选择hello,然后右键:但是不好意思,右键菜单里没有ProjectStructure选项。ProjectStructure顾名思义就是Project维度的结构窗口,而你用鼠标选中的hello只是一个模块,所以自然弹出这个模块的操作菜单,而不是Project。也许你会说:我点了OpenModuleSettings,打开了ProjectStructure窗口。是的,你可能实际上打开了它,但事实并非如此,这只是因为你把它们放在一起(同一个窗口)。?说明:了解IDEA中Project和Module这两个概念,是对IDEA进行所有操作的基础。上一篇文章介绍的很详细(可能是全网最全的),大家可以花几分钟学习一下。点此解除Direct?三种打开方法要打开一个Project结构显示窗口,至少有以下三种方法,本文均一一列举。1.顶部菜单File->ProjectStructure2.点击右上角的快捷按钮3.快捷键方法(推荐)这是我最喜欢的方法。至于快捷键,就看你怎么设置了,我的快捷键是ctrl+shift+alt+s。?啰嗦一句:建议大家多用快捷键操作IDEA,会大大提高编码效率,看起来像个高手。基本上记住50个左右的快捷键就够了。时间久了,这就是肌肉记忆后的你?打开hello项目的结构页面如下图:说明:为什么不用鼠标选择项目?对于这个动作,大家有没有注意到,打开工程结构不需要鼠标选中任何东西(可以随意使用快捷键),也就是说没有鼠标失焦的问题.一个Project对应一个窗口,它们是严格的1:1关系。也就是说,当前窗口代表的是Project,所以操作这个窗口顶部的菜单栏必须作用于Project,为什么要专门选择一些东西呢?而且,Project只是一个逻辑概念,你想选也可以选,所以窗口就这样吧。是不是觉得这很像Java中的this关键字调用?最后,这个问题的答案是:只要鼠标还在IDEA窗口中(该窗口为活动窗口),那么Project就会一直处于“选中”状态。ProjectStructure工程结构分析工程结构窗口已经打开,接下来重点说一下。可以看到它左边的“菜单栏”,分为三部分:ProjectSettings:项目设置(最重要),本文详细讲解PlatformSettings:平台设置,也叫全局设置。用于管理SDK(如JDK、Kotlin的SDK等)、全局库。一般来说全局的JDK都会在这里配置。例如,因为我经常尝试多个版本,所以我管理多个JDK版本。问题:问题。一般项目中的问题都会在这里体现出来(比如依赖不一致等)。简而言之,问题的数量是一致的,所以它是0,这是最好的。ProjectSettings中的每个选项卡都是最常用和最受关注的。以下是对其每个标签页的解释和说明。项目页面状态在此窗口中,您可以看到项目本身的基本信息。如:名称、SDK版本、语言级别等,比较简单。对于这个页面的元素,再多说几句:1.为什么是SDK版本而不是JDK版本?答:因为IntelliJIDEA是一个JVM平台的IDEA,不仅支持Java,还支持Kotlin等其他语言,所以写成SDK比较抽象2.为什么要在指定SDK后指定语言级别?答:因为SDK版本不直接决定语言等级。例如,如果你使用JDK11,你仍然可以将语言级别调整为8来编译/运行。这就是集成开发环境的优势。易于定制和支持多种环境。3.SDK和语言级别Project可以指定,as默认全局默认集成这些配置模块,但是你可以自己修改。例如,模块1使用Java5编译,模块2使用Java11编译。这是允许的模块页面。Module页面可以说是重点,甚至是最重要的。毕竟Module是一种实际的存在形式,所有的源码、配置、依赖等都在这里,需要学习的东西很多。值得注意的是,在Tests测试包中可以访问到Sources的源码,反之则不行。每个模块都可以独立管理自己的依赖关系,这种关系记录在模块自己的.iml文件中。知识点:创建Project时,默认会创建一个同名的Module模块。Module默认为Project的SDK、语言级别等设置。当然你也可以指定每个Module可以管理自己的依赖。可以是二方库,也可以是第三方库……这个模块的依赖默认存放在项目的{moduleName}.iml文件中。添加依赖既然Module可以自己管理依赖,那么如何给这个模块添加依赖呢?比如现在你需要给hello模块添加一个commons-iojar包依赖,可以点击Dependencies选项卡左下角的+号,选择Library:然后选择,如果没有就选择NewLibarary。..新建一个(有的话直接用):下面演示选择有两种不同的方式选择Java和FromMaven:新建一个Java依赖库NewLibrary,在newmenu选项中选择Java选项:这个方法很简单:从你的本地机器上选择一个jar(或者一个包含jar、文档的目录)就可以了。优点是非常便携,不依赖网络。缺点是这些jar必须实际存在于您的本地计算机上。新建一个Maven依赖库NewLibrary,在New菜单选项中选择FromMaven选项:输入GAV(或关键字搜索)定位jar。这个方法其实用起来还是很方便的,毕竟maven很好用。缺点自然是一般情况下需要依赖网络,除非你本地仓库已经有对应的jar。这两个方法各执行一次添加新的依赖,然后查看hello模块的依赖。效果如图:既然依赖发生了变化,自然会反映到hello.iml文件中。看一下:Dependencies添加进去,在源码中可以正常使用:Dependencyscope在NewLibrary中创建依赖时,无论选择哪种方法,都会弹出这个窗口让你选择scopeofthisdependencyModuleLibrary:模块级别,只能被本模块使用,其他模块看不到level,任何项目都可以在这个项目中看到和使用,在例子中,commons-io是模块级别的,commons-lang3是项目级别的。因此,在hello-client模块添加依赖的时候,也可以看到commons-lang3的依赖(commons-io看不到):在Libraries页面,当一个library是所有/大部分模块需要的依赖时,可以升级到ProjectLevel依赖提取到Libraries选项卡中统一管理。如图,因为上面步骤创建的commons-lang3是项目级别的,所以这里也会出现。至于如何创建/添加项目级依赖,这里就不用赘述了。上面的章节【添加依赖】已经解释的很清楚了。唯一不同的是页面选中后,不需要选择Library的范围(因为是Project级别的),而是让你选择要使用的模块:当然你也可以选择none(点击取消),那么jar就创建好了,不作用于任何模块modules。?说明:对于一个多模块的项目,建议将项目使用的所有Jars都放在这里统一管理。当模块需要使用时,可以直接按需选择,不需要单独添加,方便统一管理?Facets页面情况Facets可以理解为用来配置Project项目的框架区。可以看到项目各个Module模块使用的框架和语言,也可以进行配置。比如Spring框架,如果某个模块使用了,可以来这里统一配置。好处是你会发现,借助IDEA强大的功能,它已经为你想好了哪些地方可以配置,你可以改变它们,让你实现配置界面。除了Spring之外,Hibernate等其他框架也是如此。目前支持的Facets(语言/框架)类型有:模块对应的FacetsIDEA会自动检测检测,如果没有也可以手动添加。为了更形象的描述这个tab页的功能,这里贴一个自己制作的工程看看实际效果:注:不同的Facets对应最右边窗口不同的内容配置项。通过这个窗口,你可以看到你当前的Project,哪些模块使用了Spring框架,哪些是web项目,一目了然。从项目的角度对各个模块进行整体控制具有非常重要的作用。比如你发现一个模块不需要是web项目(不需要对外提供服务接口),那么它一定是多引入包。可以立即解决,有针对性地消除隐患。在实际工作中,我更多的是使用这个函数来定位模块的性质。比如,如果是普通模块,绝对不允许做web项目,如果不需要依赖Spring,则绝对不允许做Spring项目。因为严格控制Jar包依赖和工程属性是应对大型项目的有效手段。当然Facets还有一个功能可以让IDEA编译器识别你的模块。比如你是一个web模块,如果没有在Facets中体现出来,那么IDEA就不会认识你,也就无法为你提供一些方便的web操作。向上。神器页面情况IDEA是如何制作Jar包的?如何制作战争包?来吧,开服啦~在Maven的今天,用IDEA打包虽然很少用到,但有时候对你本地调试还是蛮有用的,有助于理解Maven的打包仍然有效,快来了解一下。Artifacts的概念并不是特别容易理解。Artifact是maven中的一个概念,是IDEA借用的。表示某个模块的打包形式,如jar、warexploded、war、ear等。Artifact是项目资源的组合,集成编译好的java文件、资源文件等。有不同的集成方式,如jar、war,warexploded等。对于一个模块,可以部署Artifact,类似于maven的package打包。?说明:war和warexploded的区别在于后者没有压缩。开发时可以选择后者,实时查看修改后的文件效果。?下面是将hello模块打包成Jar的演示:配置完成后,在顶部菜单栏中选择Build->BuildArtifacts,就可以打印这个Jar包:执行该命令后,可以看到打包后的文件输出目录中的hello.jar。然后java-jar.\hello.jar就可以运行了(因为我们打的是一个可执行的Jar包)。关于IDEA打包的使用,还包括打印可执行jar包、Fatjar、引用包外jar包等,这里就不展开了,以后会单独放在一篇文章中讲各种方法。一般来说,不管是Facets还是Artifacts的配置,IntellijIDEA都需要我们去做(虽然有些是可以自动识别的),这样它就可以识别这些文件,集成各种插件来实现功能(比如自动配置,自动打包),都是为了打码体验和打码效率。模块如何依赖其他模块一个大中型项目一般有多个模块,每个模块各司其职。模块之间一般存在依赖关系。例如,常见的xxx-core模块一般都依赖于几乎所有其他模块。模块依赖外部库Library,知道怎么做,那么如何增加这个项目的模块依赖呢?其实原理和步骤基本一样。比如hello-core模块中有一个Person类:hello-service模块也需要使用Person类及其函数,那么就需要依赖hello-core模块,操作步骤如下:添加Dependency依赖时,请选择ModuleDependency...选项:选择本项目需要依赖的模块:选择hello-core模块进行依赖进来hello-service:点击ok,大功告成。相应的,这种依赖也会体现在配置文件hello-service.iml中:这样我们就可以在hello-service模块中正常使用Person类了:publicstaticvoidmain(String[]args){System.out.println(新人());}完美的。总结本文对IntelliJIDEA的项目结构ProjectStructure的各个tab页进行了全面的解析。以我的目光短浅,可能全网就一个人写这个内容。很多同学认为IntelliJIDEA不需要专门学习和分析。他们会用它来导入maven项目,运行main函数并启动SpringBoot,但我不这么认为。新手和高手的区别不在于顺风顺水,而在于谁解决问题快,谁只能叹气。我相信薪水的差异也体现在这一点上。我见过的“高手”在最常用的工具上都非常666。这不就是一个技术迷该有的样子吗?牛~好了,先说IDEA吧。其实我想到的话题有几个,比如:IDEA如何主动识别并导入无法自动识别的Maven项目?原理是什么?IDEA如何创建可执行的Jar包?如何创建FatJar?如何打包外部Jar包(松散包)?IDEA是如何巧妙利用其最新的HttpClient脚本能力,结合Controller的嗅探快速完成本地测试的呢?......本文思考题本文已收录于https://www.yourbatman.cn。