介绍
脚手架可以帮助我们快速创建SpringBoot项目。
Spring提供的脚手架
页面地址,核心为 https://github.com/spring-io/initializr 这个项目,https://github.com/spring-io/start.spring.io 这个项目在此基础上提供了一些额外配置,并提供了前端页面。
内部是通过 https://start.spring.io/metadata/client 此接口来获取页面要展示的信息,如可选的依赖、版本等。
阿里云提供的脚手架
页面,这个是阿里云提供的一个脚手架,源码地址为 https://github.com/alibaba/cloud-native-app-initializer,内部依赖 https://github.com/spring-io/initializr 的很多模块,在此基础上提供了一些额外功能,如可以选择应用结构(MVC架构,分层架构)。如果我们想提供自己的定制化功能,就可以参考此项目。
使用命令行创建阿里云的cola架构代码
最开始阿里云脚手架也提供了 cola 架构的选项,后来页面上去掉了,我们还可以使用命令的方式来创建 cola 架构代码。
mvn archetype:generate -DgroupId=com.imooc -DartifactId=wechat-pay -Dversion=1.0.0-SNAPSHOT -Dpackage=com.imooc.wechat -DarchetypeArtifactId=cola-framework-archetype-web -DarchetypeGroupId=com.alibaba.cola -DarchetypeVersion=4.3.1
修改为自己项目的groupId,artifactId,package
注意,windows下不要使用PowerShell,会报错,要使用命令提示符(Cmd),默认使用的是
C:\Users\xxx\.m2
目录下的settings.xml配置文件,如果我们没有配置阿里云仓库镜像,可能会很慢。
The goal you specified requires a project to execute but there is no POM in this directory (C:\Users\xxx). Please verify you invoked Maven from the correct directory. -> [Help 1]
原理解析
以自己的项目为例,https://gitee.com/strongmore/springboot-generator,在本地运行,java版本必须为17及以上,但是本机的IDEA版本为2019.3,不支持java17,所以这里我们将代码中的新特性适配为低版本代码(java11),之后就可以正常运行了。
获取元数据接口流程
- InitializerMetadataConfigure获取yml配置文件中的各种元数据信息并封装到InitializerProperties类中
- InitializerMetadataConfigure配置类根据InitializerProperties创建DefaultInitializrMetadataProvider
- InitializerProjectMetadataController使用InitializerMetadataV21JsonMapper(JSON转换器)将DefaultInitializrMetadataProvider中的元数据返回给前端
创建模板代码zip包接口流程
- CodeGenerationProtocolFilter过滤以zip,tar,tra.gz,git等结尾的请求,这里我们以zip为例
- 进入BootstrapProjectGenerator的generate()方法
- 进入InitializerProjectGenerationInvoker的invokeProjectStructureGeneration()方法
- 继续InitializerProjectGenerator的generate()方法,其中会调用InitializerProjectGenerationInvoker的generateProject()方法创建的生成器中
- 会在当前电脑系统的临时目录创建一个文件夹
C:\Users\${user}\AppData\Local\Temp\project-6844619005582396801\demo
- 主要通过多个ProjectContributor类来创建项目目录及源代码文件,如MainSourceCodeProjectContributor来生成main目录及源代码文件。
- 根据生成的临时目录创建zip压缩包,读取为字节数组,并通过ProjectGenerationController类的springZip()方法的来返回到前端
- 通过HttpEntityMethodProcessor处理ProjectGenerationController类的springZip()方法的返回值信息将字节数组返回到前端
如何控制是maven或gradle项目
通过ArchedMavenProjectGenerationConfiguration和ArchedGradleProjectGenerationConfiguration控制,使用到了@ConditionalOnBuildSystem注解,它会使用ProjectDescription中的BuildSystem字段来判断使用哪一种,ProjectDescription是在InitializerProjectGenerator的generate()方法时注入到Spring容器中的。
gradle类型
- MainSourceCodeProjectContributor,
- TestSourceCodeProjectContributor,
- SettingsGradleProjectContributor,
- GradleWrapperContributor,
- GradleBuildProjectContributor,
- SampleCodeContributor,
- HelpDocumentProjectContributor,
- GitIgnoreContributor
maven类型
- MainSourceCodeProjectContributor,
- TestSourceCodeProjectContributor,
- MulitModuleMavenBuildProjectContributor
- SampleCodeContributor,
- HelpDocumentProjectContributor,
- GitIgnoreContributor