前言大家好,我是A哥(你的蝙蝠侠)。做Java开发这么久,有没有想过:为什么项目中的xxx.iml和.idea文件夹明明起着重要的作用,却不能提交到git仓库,否则工资很容易坏掉?这个项目他用Eclipse开发的,我现在用IDEA继续,担心结构问题?为什么Maven项目导入IDEA后可以正常运行?它的项目结构是什么样的?如果您有这些问题,请参阅这篇文章,您来对地方了。IntelliJIDEA和Eclipse作为目前最流行的两种IDE,在界面、操作、项目管理等方面都有很大的不同。俗话说,两派必有一战。以谁的项目结构为标准?谁选择妥协?不,两者的答案都是本文大纲版本协议IntelliJIDEA:2020.3.2SpringToolSuite:4.9。0.RELEASEtext接下来,本文将从项目层面出发,探讨这些问题是如何解决的~加油IntelliJIDEA项目,都在本系列的前两篇文章中:谁将IDEA的Project与Eclipse的Workspace进行比较,我很渴望玩转IDEA项目结构ProjectStructure、Jar包、模块/依赖管理完成Eclipse项目。由于本系列文章中没有提到Eclipse项目,所以这里简单介绍一下。老实说,A哥2015年入行后就没用过原生的eclipse,所以这里以基于Eclipse的STS为例,道理是一样的。Eclipse有workspace运行空间的概念,所有的Project项都在运行空间中进行管理。也就是说,Eclipse的一个窗口打开了整个工作区,里面加载了多少项目,就可以实现:一个窗口同时打开多个项目。新建一个项目以新建一个名为hello的java项目为例:File->New->JavaProject...用惯了IDEA的玩家,看到eclipse的这个页面,是不是要感叹:一个项目创建页面是这么复杂?创建时无需选择JRE和工作集等选项。页面太简单,有太多分散注意力的信息。点击下一步:呃,一样的感觉,别说是新手,就是老手看到这个页面都“变迷人”了,O(∩_∩)O哈哈~。eclipse的页面设计基本上存在这样的问题:太复杂,干扰选项太多。比如这里插入一个创建类的页面,大家可以感受一下:点击Finish,Project就创建好了。Project项目设置为鼠标选中项目(不??像IDEA,这里必须选中),右键选择Properties配置项目:配置项“太多”,让人望而生畏。这里就不一一介绍了,图形化的东西通俗易懂。但是你有没有发现,很多配置项都找不到Module这个词呢?为什么这么胖?Eclipse没有模块的概念。如果想在hello项目下创建一个hello-client项目怎么办?答:在逻辑层面,eclipse做不到,只是体现在路径结构上,具体的创建动作是:点击新建一个项目,然后自定义这个路径,放在hello下面。点击Finish后,工程结构如下图所示:上图是ProjectExplorer,如果切换到PackageExplorer,截图如下:从这里可以看出eclipse没有层级概念逻辑上。没有模块,只有项目。即使导入maven项目也是如此(maven有模块概念),这里有一个dubbo的例子:PackageExplorerview所以请记住,这在逻辑结构上与IDEA有很大的不同:ModuledoesnotexistinEclipse,没有Module,没有Module。对于解释.classpath和.projecteclipse的每个项目,还有两个附加文件:.classpath文件和.project文件。这两个文件比较特殊。它们没有文件名并以.它们是隐藏文件。看过A哥上一篇文章的同学(谁拿IDEA的Project和Eclipse的Workspace比,我就急谁)知道IDEA里面有两个特殊的文件,workspace.xml和${moduleName}.iml,同样有同样在eclipse中,我们可以粗略的称之为环境描述符和项目描述符。.classpath文件.classpath文件存放的是项目编译时的Java构建路径,这个路径可以被$CLASSPATH引用。hello项目的这个文件的内容如下:简而言之,.classpath定义了这个项目在编译时使用的$CLASSPATH类路径。.project文件.project提供了项目的完整描述,包括名称、描述、项目类型等。解释几个标签:name:项目名称,一般与文件夹名称同名,但它们是两个不同的东西comment:项目注释buildCommand:用于构建的命令。这里的值为org.eclipse.jdt.core.javabuilder,也就是说eclipse帮你编译,而不是手动输入java命令编译natures:项目类型,其中org.eclipse.jdt.core.javanature代表ajava简而言之,.project是项目描述符。有了这个文件,eclipse在加载工程的时候就可以根据它来显示了。说明.settings目录eclipse工程的.settings目录下的配置比较复杂,可能会看到各种后缀。其中大多数是属性或xml格式的文本文件。大多数Properties类型文件的后缀为.prefs,大多数XML类型文件的后缀为.*和.xml。因为类型很多,这里举几个比较常见的代表:org.eclipse.core.resources.prefs:指定文件的编码方式。尽量不要让一个项目出现各种代码哟org.eclipse.jdt.core.prefs:指定一些Java编译特性,比如编译版本,警告级别等结构差异,IDEA和Eclipse打架?了解了IDEA和Eclipse的项目结构后,发现这两个项目的管理方式完全不同:逻辑结构不同,元数据文件不同。元数据文件的内容和格式不同。由于这些差异,存在不同的兼容性问题:Eclipse不识别IDEA项目,反之亦然。IDEA虽然有导入Eclipse工程的功能,但是兼容性并不完善。完全是为了“协助”Eclipse反击IDEA。会出现同时使用IDEA和Eclipse的情况。诚然一般情况下不会出现这种情况,但是从更广的角度想想呢?例如,如果它是一个开源项目怎么办?是让所有的开发者一起协作,总不能限制别人的IDE吧?还是以dubbo为例:如果你想把所有的源代码提交到github,你应该使用IDEA的元数据文件还是Eclipse的?对于项目本身,项目名称、结构、依赖管理等都保存在元数据文件中。~很明显,没有人适合用。毕竟Java平台的IDE还是三足的(至少有两条腿),不可能“得罪”其中的任何一条。而且,对于程序本身来说,IDE并不是它的一部分,所以即使IntelliJIDEA一统天下,也不应该依赖它的元数据文件来帮你管理依赖和管理项目。花非百日红,谁知道明天呢~这么一揣测就没有定论了,怎么办,要不要“动手”?面对这种情况,要做的就是标准化,让所有的IDE都支持识别相同的项目/目录结构,问题自然就迎刃而解了。这时候就有“人”扛起大旗,担当这个角色的就是Maven(读作[?mev?n],不是“马瘟”)。无论是哪种IDE,都能识别并加载maven工程,解析其pom.xml文件生成IDEA自带的元数据文件,即可正常加载完成。因此,对于开发者来说,只需要管理面向Maven的项目,不再需要关心具体的IDE。这笔差价将由它为您解决。继续以dubbo为例,在实践中也是一样的:只提交maven结构和pom的源码。.值得注意的是,由于使用了maven工程结构,提交到github时,IDE本身的一些元数据文件无法提交。因此,一般在项目的.gitignore文件中添加如下配置项:#eclipseignore.settings/.project.classpath#ideaignore.idea/*.ipr*.iml*.iwsCreate/importMaven项目,由于Maven项目已经成为标准,所以在现实中无论是新建的还是摸到99.99的都是maven项目。IDEA和Eclipse都为maven项目提供了“完美”的支持。用IDEA和Maven项目创建Maven项目:在左边的分类中选择Maven,表示需要创建一个maven项目,点击下一步(当然也可以选择模板骨架,如果公司有统一的骨架):点击Finish打开一个新的IDEA窗口,大功告成:继续创建两个子模块(hello-client和hello-service),同样使用Maven工程:点击Finish,并在子模块中添加SpringContext依赖:并让hello-service模块依赖hello-client模块:所以现在即使在hello-service模块中,spring-conext相关的类也可以正常使用:请问是什么原因?这时候上一篇的内容就起作用了。查看项目结构ProjectStructure发现:hello-clientmoduleDependency:spring-contexthello-service模块中的依赖:这里有spring-context的依赖,所以可以正常使用。我发现没有。创建这个项目时,开发者只需要关心Maven的创建即可。当模块依赖它时,它们只需要更改Maven元数据文件pom.xml。IDEA会自动对其进行“解析”,并将其放入项目结构ProjectStructure中并保存在自己的元数据文件(如xxx.iml文件等)中,从而保证正常的运行和管理。打开/导入Maven项目:打开窗口,选择pom文件(或顶级文件夹)即可。导入maven模块的时候有点区别。一起来了解一下:?注意:在IDEA中,Project工程是不存在import导入的,因为它是一个独立体,只能说是打开工程?选择一个文件夹后,一定要进行下一步:如图所示,IDEA支持导入各种类型的模块,并不是说它不强大:AndroidGradle:如果是Android项目,就选这个选项Eclipse:如果是Eclipse项目,就选这个选项(请注意:有一个eclipse元素数据文件叫做eclipse项目,不一定是对方用Eclipse开发的eclipse项目,毕竟有可能是maven项目)Gradle项目:如果是是Gradle项目,请选择此选项。比如SpringFramework项目maven项目:99%的情况下,我们应该选择这一项,点击Finish导入模块。值得一提的是:很多“老程序员”似乎都在一个IDEA窗口中显示多个“项目”。事实上,他们将一个项目导入为一个模块模块。不推荐这样做。不信你打开ProjectStructure看看,乱七八糟,简直是无法管理的灾难。本系列的前几篇文章详细介绍了这样做不合适的原因,并给出了最佳实践。欢迎阅读。Eclipse和Maven项目略有相似。Maven称霸世界?说明:本文不是Maven的专题,简单说说它的称霸现状?Maven是一个项目管理工具:它包括一个项目对象模型(POM:ProjectObjectModel),一组标准项目结构、一个项目生命周期、一个依赖管理系统,以及运行在生命周期阶段定义的插件目标的逻辑。Maven的每一个功能都是杀手级的,非常强大好用,中大型项目必备。比如它的依赖管理系统,没有它,如果你依赖一个Jar,你得先去官网下载一个对应的版本,然后添加到IDE中,打包的时候打进去,极其麻烦且容易出错。不知道什么时候Maven已经一统天下了。反正A哥知道,早在2015年,SpringFramework团队就宣布官网不再提供Jar包下载;github上几乎所有流行的Java项目都使用Maven。建设与管理;对于年轻的程序员来说,如果一个项目不是Maven项目,大概率会不知道如何入门,因为在学校的时候,默认是基于maven项目的。现在2021年,Maven项目是绝对的王者,事实上的标准。不客气地说,“几乎所有”的中大型Java项目都是Maven项目(SpringBoot默认就是Maven项目),这可能是它最大的贡献之一,让全世界的Java开发者统一“语言””。Maven的存在也极大地巩固了Java生态,降低了管理、构建、依赖管理的门槛,使其始终保持活力。说到Maven,就不得不提Gradle。可能有同学会说,Gradle会取代Maven成为下一代最流行的项目管理和构建工具。如果你不相信我,你可以看到SpringFramework已经转移到Gradle。诚然,Gradle作为新一代产品有很多“优秀”之处,但在可预见的未来,Maven仍将是Java平台上的绝对标准,不可撼动。毕竟Maven的功能很齐全,关键是没有致命的缺点,改的动力也不大。而且,股市太大,船再难也不会掉头。就像xhtml一直有想要干掉html的野心,终于知道了~?Gradle是Android开发中的主流,所以用Gradle这个“新技术”是个不错的选择?总结本文介绍了IDEA项目之间的区别项目和Eclipse项目就是要吃透两者在项目管理上的区别,不要照搬别人说的。这篇文章可以从小的角度帮助大家说明,mao项目中的xxx.iml、.project等文件千万不要提交到github仓库,否则会被罚款;本文从大的角度告诉你,Maven帮你做到了屏蔽差异让项目标准化,这也是你不需要关心具体IDEA的根本原因。?说明:在Maven之前,都是用Ant来管理和构建项目,实现统一。但是因为Ant有点老,所以这篇文章直接用大家比较熟悉的Maven来回答?当然,这篇文章不是Maven话题,所以它的描述只是一段路过。Maven的作用远不止于此。如果您对Maven感兴趣,请前往Maven专栏查看。下篇文章将介绍使用IDEA打开maven项目时的一个痛点问题:Maven项目的部分模块无法被IDEA自动识别,如何手动批量导入/识别?本文思考题本文所属栏目:IDEA,后台回复栏目名即可获取全部内容,已收录在https://www.yourbatman.cn。看了可能不明白,看懂了也未必明白。来吧,文末的3道思考题帮你复习:如何使用Eclipse创建多“模块”项目?Maven项目被IDEA和Eclipse加载后,在各自IDE的项目结构中有什么表现?有时候Maven模块不能被IDEA自动发现,那么如何手动发现Mave模块呢?
