PlexusContainer的前世今生,Maven底层容器,终结一代青年,其实我不关心内部实现,我现在必须拉着大家告诉你。这是一个问题。Maven的内部相对来说没有那么简单,也不是一个小项目。核心功能大家都很清楚,内部执行过程大家也能猜到:解析命令行参数准备各种上下文,简单的mvnclean涉及到当前项目的元数据pom.xml和settings.xml(主要是相关的到本地和远程仓库);根据mvnclean或者mvncompile找到对应的生命周期(maven的三个生命周期大家应该都知道);这也与包装方式有关。jar/war时,打包组件不同);依次执行生命周期中的各个阶段时,找到对应绑定的插件,然后执行插件(执行插件还包括:根据插件的坐标,去本地仓库/远程仓库找到对应的artifact,解析artifact中的插件元数据,元数据会告诉你支持哪些参数,参数类型是什么。)执行完成后返回结果。这么大的项目,想必,还是会有很多对象相互依赖的。在没有依赖注入之前,都是通过new或者factory来缓解的;在(https://blog.sonatype.com/201...)中,提到:我们知道我们需要某种组件框架,一些标准机制来实例化插件并根据一组配置点配置它们大致意思是,它们还发现他们需要一个组件框架,一种用于实例化组件并根据一组配置对其进行配置的标准化机制。说明早期的Maven开发者已经意识到他们可能需要类似容器的东西,那么为什么不选择Spring呢?下面,让我们一层层揭开历史的面纱。在Maven之初,我查看了Maven的官网,发现Maven的第一个版本早在2002年就已经存在了。(http://jakarta.apache.org/sit...)。2003年成为Apache顶级项目,2004年发布1.0版本。反观我们耳熟能详的Spring,第一个版本是什么时候?第一个版本由RodJohnson编写),他在2002年10月出版了他的专家一对一J2EE设计和开发一书时发布了该框架。在这里,spring的第一个版本也于2002年发布,与一起发布罗德约翰逊的书《Expert One-on-One J2EE Design and Development 》。同样在2003年,使用Apache2.0许可证发布了一个版本;2004年3月,发布了生产版本。所以,我们可以理解Maven开发者在那篇2010年的文章中写的:当我们启动Maven项目时,依赖注入还在开发中。Spring刚刚起步,Apache的Avalon项目真的是唯一的简单地说,周围的IoC框架是Maven启动时,依赖注入仍在开发中。Spring刚刚起步,Avalon项目只是一个ioc框架。由于外部不成熟,他们的重点不在这些依赖注入框架上,所以他们根据自己的需要,自己搭建了一个适合Maven的,叫做:Plexus。早期Maven:制作自己的IOC容器Plexus项目Plexus:读音(?pleks?s),体内神经或血管的网络。Plexus,中文意思,可能是神经网络或血管网络,因为血管是网状的,像him互联网也一样,所以用它作为框架名,也许吧。本项目(官网:https://codehaus-plexus.github...)定位为容器。官网不知道为什么,打不开,但是我找到了一个记录上网历史的网站:https://web.archive.org/web/2....基于Plexus项目,基于PlexusContainer子项目,应用程序可以使用基于组件的编程来构建模块化和可重用的组件。Plexus与其他IOC框架类似,如Spring,但它也提供了很多额外的特性,例如:组件生命周期管理、组件实例化策略、嵌套容器、组件配置、自动注入、组件依赖、各种依赖注入方式(如作为构造函数注入、setter注入、字段注入)。总的来说,个人感觉Spring好像有这些特点,哈哈。像Plexus下的Plexus这样的项目,当然不局限于容器。大概有以下几种:PlexusClassworlds,类加载器框架,Maven今天还在用,个人觉得挺好的。推荐学习;Plexus容器、IOC容器、Maven1.x/2.x正在使用中。在3.0版本之后,Maven本身不再使用PlexusComponents。Maven的工作是处理各种文件和目录。这期间会沉淀出很多常用的组件:IO相关的,PlexusIOComponents,其maven坐标:dependency>org.codehaus.plexusplexus-io3.2.0归档相关,PlexusArchiver组件,maven坐标:org.codehaus.plexusplexus-archiver4.2.5cli相关,PlexusCLI编译相关,PlexusCompilerDigest/Hashcode相关,PlexusDigest/HashcodeComponents国际化相关,i18n等一些,懒得罗列了,大家可以自己看,https://web.archive.org/web/2...PlexusMavenPlugin,用来支持Maven插件PlexusUtils,tools,还是用Plexus组件的现状打开我本机maven安装目录的lib,发现plexus相关,只剩几个了比如下图中的几个工具:还有就是下图中的启动类:一开始约定的IOC容器,但是为什么Maven不用呢?我们来看看容器相关的组件。容器相关,一共有4个maven组件。在这里,我们刚刚看到了plexus-component-annotations,它仍在使用中。它有什么作用?类似于Spring中的注解,如@Service/@Controller。而plexus-component-metadata是一个用来生成组件xml的maven插件,有点像我们的springxml时代。这个项目可以分析我们的代码,帮我们生成springbean.xml,就像不需要手动配置依赖一样。这里,真正的IOC容器实现是:plexus-container-default。这个组件,可以说是Maven的老婆,陪伴了Maven的青春,且看这个组件最早出现在什么时候。以下是其1.0版本的坐标:plexusplexus-container-default1.0-alpha-1时间是2005年,至于maven是什么时候开始使用这个容器的,我没有找到maven1.x版本的pom依赖,但是在2.0.alpha版本中,我已经看到了容器:此时,是2006年。仅仅几年后,在maven3.0版本中,不再有plexusioc容器,而是来了一位不速之客。在开始说不速之客之前,我们还是要问,为什么plexusioc容器不行呢?如果你对这段历史感兴趣,可以直接阅读:https://blog.sonatype.com/201...为什么?因为时代变了,此时,Spring已经开始成为事实上的IOC容器标准。不过,虽然Spring在应用开发领域所向披靡,但是在各种框架中,框架开发者还是觉得Spring太重了。引入几个jar包太臃肿了。因此,在2007年,谷歌推出了一个名为GoogleGuice的轻量级依赖注入框架。这个时候经过多年的迭代,2010年左右,guice已经比较成熟了,在谷歌得到了广泛的应用,依赖注入领域也在不断的发展。比如java官方定义了相关的StandardAPI。此时Maven开发者很难同时维护PlexusIOC容器(比如适配新的java官方标准,兼容周边的Spring等),所以Maven决定,为了节省精力,Maven将不再基于PlexusIOC容器,而是使用Guice,以后只会用它,而Guice的维护和升级自然会由Guice的开源团队跟进。说了这么多,为了纪念PlexusContainer的终结,我们来看看这个IOC组件是如何使用的吧?PlexusIOC容器的初始使用示例也来自官网。根据文档,我把它组织成一个maven模块。你可以把代码拉下来。https://gitee.com/ckl111/mave...1。像所有的IOC容器一样,定义一个接口和实现类publicinterfaceCheese{/**Plexus角色标识符。*/字符串ROLE=Cheese.class。获取名称();/***将奶酪切片以分配到饼干上。*@paramslices切片的个数*/voidslice(intslices);/***获取奶酪香气的描述。*@returnthearoma*/StringgetAroma();}publicclassParmesanCheeseimplementsCheese{publicvoidslice(intslices){thrownewUnsupportedOperationException("Nocando");}publicStringgetAroma(){返回“强”;像spring的xml时代,定义组件的依赖关系。注意这里的组件配置中有三个元素:role,这里:接口名role-hint,这里:实现类的限定符,类似于spring,一个接口有多个实现类,我们会为它定义一个显示名这多个实现类,@Qualifierimplementation,实现类的类名。好的,这定义了一个组件。我们开始测试。从容器中获取组件publicclassApp{publicstaticvoidmain(Stringargs[])throwsException{//1定义一个容器,该容器会在classpath下的META-INF/Plexus/component.xml中加载组件PlexusContainer容器=新的DefaultPlexusContainer();//2获取组件,完成依赖注入等工作Cheesecheese=(Cheese)container.lookup(Cheese.ROLE,"parmesan");//3使用组件System.out.println("Parmesanis"+cheese.getAroma());//4销毁容器container.dispose();}}其他用法如果这个组件依赖于其他组件,怎么办?怎么注射呢?在maven源码项目中看到了这样一个组件配置,想必是这样配置的。org.apache.maven.profiles.activation.ProfileActivator错误org.ext.Apporg.apache.maven.artifact.ArtifactResolver<字段名>artifactResolver字段名>循环依赖呢?别着急,别人也能解决,这里就不截图了。总结一个组件写出来,感觉也有情怀,也有点意思。但无论如何,伴随Maven走过了整个2.x版本,PlexusContainer也就告一段落了。接下来是Guice时代,到现在,2021年,十多年过去了,Guice依然在稳定支持Maven。Guice足够好。在那之前,我对它了解不多。Guice在哪里有应用程序?这里有几个:google内部的scalatestTestNGCaffeineCacheSpringSecurityConfielasticsearchjenkins还有其他一些我不熟悉的技术。可以看看:https://mvnrepository.com/art...本文由多帖博客平台OpenWrite发布!