SpringBoot脚手架使用

介绍

脚手架可以帮助我们快速创建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),之后就可以正常运行了。

获取元数据接口流程

  1. InitializerMetadataConfigure获取yml配置文件中的各种元数据信息并封装到InitializerProperties类中
  2. InitializerMetadataConfigure配置类根据InitializerProperties创建DefaultInitializrMetadataProvider
  3. InitializerProjectMetadataController使用InitializerMetadataV21JsonMapper(JSON转换器)将DefaultInitializrMetadataProvider中的元数据返回给前端

创建模板代码zip包接口流程

  1. CodeGenerationProtocolFilter过滤以zip,tar,tra.gz,git等结尾的请求,这里我们以zip为例
  2. 进入BootstrapProjectGenerator的generate()方法
  3. 进入InitializerProjectGenerationInvoker的invokeProjectStructureGeneration()方法
  4. 继续InitializerProjectGenerator的generate()方法,其中会调用InitializerProjectGenerationInvoker的generateProject()方法创建的生成器中
  5. 会在当前电脑系统的临时目录创建一个文件夹 C:\Users\${user}\AppData\Local\Temp\project-6844619005582396801\demo
  6. 主要通过多个ProjectContributor类来创建项目目录及源代码文件,如MainSourceCodeProjectContributor来生成main目录及源代码文件。
  7. 根据生成的临时目录创建zip压缩包,读取为字节数组,并通过ProjectGenerationController类的springZip()方法的来返回到前端
  8. 通过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

参考

COLA-github

posted @ 2024-02-08 11:14  strongmore  阅读(427)  评论(0编辑  收藏  举报