- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
你好,我是A哥(YourBatman).
如何给Module模块单独增加依赖?如何知道哪些Module模块用了Spring框架,哪些是web工程?IDEA如何打Jar包?打War包?
熟练的正确使用IntelliJ IDEA,是一个“高手”该有的样子,因为那是你的门面。上篇文章 重点介绍了IDEA里最为重要的两个概念:Project项目和Module模块。相信你看完后再也不会把IDEA的Project比作Eclipse的Workspace,并且对IDEA有了一份更深的了解.
本文继续理解IDEA对项目、模块的管理。管理项目是一个IDEA的基本功能,但往往最基础的是最重要的更是最容易被忽略的。因此本文是你更好去理解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视窗呀,是的效果上你可能是打开了但道理并非如此,而仅仅是因为把它俩放在了一起(同一视窗)而已.
三种打开方式 。
要打开一个Project的结构展示窗口,至少有如下三种办法,本文都例举给你.
1.顶部菜单File -> Project Structure 。
2.点击右上角的快捷按钮 。
3.快捷键方式(推荐) 。
这是我本人最喜欢的方式,至于快捷键是哪个就看你是如何设定的喽,我的快捷键是ctrl + shift + alt + s.
打开hello项目的结构页如下图所示:
解释:为何不需要鼠标选中项目?
对于这个动作,敏感的你是否有发现:打开项目结构并不需要鼠标选中任何东西(快捷键随意使用),也就是说鼠标失焦状态都没问题,何解呢?
回答这个问题并不难,前提是你已经对IDEA的Project概念烂熟于胸。一个Project对应一个视窗,它们是严格1:1的关系。换句话讲,当前视窗就代表着Project,因此操作本视窗顶部菜单栏就肯定是作用在该Project上,又何须专门选中什么呢?再者,Project只是个逻辑概念,你想选都没得选中的,所以把视窗当作它就好。有没有觉得,这和Java中的this关键字调用特别像?
最后,这个问题的答案是:只要鼠标还在IDEA视窗内(该视窗是活跃窗口),那么对Project就永远就是“选中”状态.
Project Structure项目结构剖析 。
项目结构视窗已打开,那接下来重点来喽。可以看到它左边的“菜单栏”,共分为三个part:
一般来讲,全局的JDK都会配置在此处,比如我因为经常要做多版本尝试,就管理了多个JDK版本 。
其中Project Settings里面的每个标签页是最常用,最关心的。下面就对它的每个tab页作出解释和使用说明.
Project页情况 。
此视窗可以看到Project本身的基础信息。如:名称、SDK版本、语言等级等等,比较简单.
对于此页面的元素,多啰嗦几句:
1.为何是SDK版本而不是JDK版本?答:因为IntelliJ IDEA是JVM平台IDEA,不仅仅支持Java还有其它语言如Kotlin,所以写成SDK更抽象 。
2.为何指定了SDK还要指定语言等级?答:因为SDK版本并不直接决定语言等级。如你用的JDK 11,但依旧可以把语言等级调为8来进行编译/运行 。
这是集成开发环境的优势所在,轻松对多环境进行定制化支持 。
3.SDK和语言等级Project都可指定,作为全局默认 。
这些配置Module默认集成,但可自行修改自己的。比如module 1使用Java 5编译,module 2使用Java 11编译,这是允许的 。
Module页情况 。
Module页可谓是重点中的重点,甚至是最重要。毕竟Module作为实际存在形式,所有的源代码、配置、依赖等都在这里,因此大有可学呀.
值得注意:Tests测试包里面的是可以访问Sources源码的,但反过来不行.
每个模块都能独立管理着自己的依赖,这种关系在模块自己的.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创建依赖的时候,不管用哪种方式选中后,它都会弹出这个窗口让你选择此依赖的作用范围 。
在本例中commons-io是模块级别,commons-lang3是项目级别。因此hello-client模块添加依赖时也是能够看到commons-lang3这个依赖的(但看不见commons-io):
Libraries页情况 。
当某Library是所有/大部分模块都需要的依赖时,就可以上升为Project级别的依赖,抽取到Libraries标签页来统一管理。如图,因为上面步骤创建的commons-lang3是项目级别的,所以也会出现在这里.
至于如何创建/添加Project级别的依赖,这里就不用再赘述了吧,上面【新增依赖】章节已讲得很明白。唯一区别在该页面选好后不用再选择Library的作用范围了(因为就是Project级别的嘛),取而代之的是让你选择作用的模块:
当然喽,你也可以一个都不选(点击cancle),那么该jar只是被创建了,而不作用于任何module模块.
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打包.
来个栗子,这里演示下将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的话题暂且先聊到这。其实我想到的主题还有好几个,如:
本文思考题 。
本文已被https://www.yourbatman.cn收录.
。
原文地址:https://mp.weixin.qq.com/s/j_yIiXvNlp7JMZaVO1FSrA 。
最后此篇关于玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定的文章就讲到这里了,如果你想了解更多关于玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下内容: sourceSets { integrationTest { java.srcDir file('.') } } dependencies {
有没有一种简单的方法可以在 IntelliJ IDEA 中为非 Java 项目配置完全自定义的构建过程?基本上,我只需要运行一个自定义的 shell 命令,而不是任何更智能的构建过程。 最佳答案 尝试
有没有办法用快捷方式将变量拉到 try-catch 块之外?例如: 来自: try{ AbstractList t1 = new ArrayList(); } catch (Exception
当我启动 IntelliJ IDEA 时,会出现该消息,但我找不到有关该功能的任何信息以及它如何帮助我。 Enable smart keyboard internalization for IDEA.
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Intellij Idea 9, what folders to check into (or not check
我的目录中有一个名为 protected.keys 的新资源文件。创建它时,我要求 IntelliJ 将其视为 properties。 相反,我想将其更改为 text 请问我该怎么做? 最佳答案 您可
我的目录中有一个名为 protected.keys 的新资源文件。创建它时,我要求 IntelliJ 将其视为 properties。 相反,我想将其更改为 text 请问我该怎么做? 最佳答案 您可
我有一个带有两个 child 的 Gradle 的 Kotlin 项目。每当我尝试在 IDEA 中打开它时,其中一个 child 会在树中显示两次。 在树中,您可以在顶层看到两个项目,grpc 和 g
我不确定这是更多 Gradle 还是 Intellij Idea 问题。在 projet 中,我使用 gradle import(从 Idea 中的 Gradle 外部模型导入)导入到 Idea,我的
我在 Gradle 多项目配置上使用 idea 插件来生成 Intellij 配置文件。目前,构建在 Gradle 中运行良好,但由于缺少 JPA 元模型源文件,它在 IDE 上给了我错误。 我的问题
我在 事件日志 中得到信息 08:54:02 无法导入 maven 项目:查看日志了解详情 在 Intellij IDEA 15CE 中哪里可以找到这个日志文件? 最佳答案 您可以从 Help 访问事
我的 IntelliJ IDEA 有问题。当我打开 Find in Path 时,它显示在第二个监视器的模态窗口中,而不是像以前一样显示在主窗口内的窗口中。无法将该窗口移动到主监视器。我不记得我是否更
我按照以下 session 中的说明安装了 IntelliJ IDEA。 Install IntelliJ IDEA as a snap package on Linux sudo snap inst
可以在 IntelliJ IDEA 中配置多种类型的终端,例如cmd、powershell、git bash 等? 最佳答案 目前不可能,但有一个相关的功能请求:https://youtrack.je
我下载了 intellij 社区版。DropToFrame 是不是只有终极版才有? 任何其他插件将此添加到 intellij 社区版 谢谢 最佳答案 Drop Frame 已重命名为 Reset Fr
每次写“todo”评论时,我都面临着写我的 vcs 当前分支名称的问题。 最近我了解了 Intellij 的“Live Templates”,使用起来非常舒服。我尝试将它应用于我的问题,但没有模板可以
有一天,我运行了一些大的东西,弹出一个窗口说堆内存内存不足,我在那个窗口中将其设置为2014M,然后单击继续。一切都很好。 但我不喜欢数字 2014,我想要它 2048。因此,我更改了 idea64.
当我尝试编辑和保存 javascript 文件时,IntelliJ 使它不可能: 无法保存 C:\Users\dev\joo-web\trunk\joo-admin-web\src\main\weba
我在一个相当大的项目中升级了 IntelliJ Idea 中的语言级别,我想找到所有已弃用的方法用法 - 我寻找所有出现的罢工。 我为 PhpStorm 找到了一个类似的问题建议的方法在哪里: 代码
我必须对使用匈牙利表示法的遗留代码(以及系统匈牙利语)进行一些维护。不幸的是,将它全部从代码库中清除对我来说是不切实际的。 本地 Eclipse 用户声称可以配置 Eclipse 以便自动生成的访问器
我是一名优秀的程序员,十分优秀!