springboot在线原型工程生成工具
在線生成原型工程
前期調研
最開始實現的原型工程是通過maven archetype生成的,可以通過配置私有庫idea工具生成和腳本命令的形式生成,但是生成的過程需要檢查環(huán)境等等,而且時間也需要的長一點,大概一兩分鐘。由此,想要優(yōu)化生成工程的方式,因此提出了想要通過頁面端直接簡單配置從而生成項目工程的腳手架(包括前后端工程)。
google了下現有的類似的工具,發(fā)現了start.spring.io和start.aliyun.com,但是其實兩者都是基于使用Spring Initializr來實現這部分功能。
看一下這兩個工具的頁面:
這兩個工具功能都很強大,提供組件版本、開發(fā)語言,構建方式的選擇等等。但是目前考慮的還是簡單的原型工程生成,這個功能只是把我們自己的模板工程提供頁面簡單配置下載而已,因為可以參考,ailiyun的提供示例代碼功能,跟我們的需求很像,比較符合我們的需求,就想著仔細研究一下,加了他們自己的使用群,但是迫于這部分代碼不考慮開源,于是又開始自己的開發(fā)之路。好在他們提供了這篇實現說明:
https://developer.aliyun.com/article/752200
十分感謝陳曦大大的詳細講解。
通過這篇文章,也大概了解了Spring Initializr的使用思路。在公司架構大佬的協(xié)助下,完成了這個功能的實現,具體實現如下:
下載源碼
直接下載Spring Initializr的源碼,準備在其原工程的基礎上修改,節(jié)省時間。
具體Spring Initializr的實現原理也可以參考阿里云實驗室文檔中有關原理篇的講解,文章中有些圖片掛了,可以參考轉載文章。
首先了解下項目的各個模塊的作用:
- initializr-actuator: 監(jiān)控診斷的附加信息,這個暫時忽略;
- initializr-bom: 便于外部使用的bom依賴
- initializr-docs: 使用文檔
- initializr-generator: 核心工程生成庫
- initializr-generator-spring: 用于生成典型的spring boot工程
- initializr-generator-test: 測試框架
- initializr-metadata: 項目各個方面的元數據基礎結構
- initializr-service-sample: 基本使用案例;
- initializr-version-resolver:版本號解析能力;
- initializr-web: 提供給三方客戶端使用的web入口;
默認情況下,initializr已經支持4種項目類型:
- /pom.xml 生成一個Maven的pom.xml配置文件
- /build.gradle 生成Gradle的配置文件
- /starter.zip 生成zip方式壓縮的工程文件
- /starter.tgz 生成以tgz方式壓縮的工程文件
因為是下載的前后端的原型工程包,因此/starter.zip 就已經滿足于我們的要求,不需要自己再重新編寫。
編碼流程
主要操作的包包括
-
initializr-metadata 元數據配置
-
initializr-service-sample 示例啟動模塊、配置模塊
-
initializr-web 入口工程(controller)
-
initializr-generator: 工程生成庫
-
initializr-generator-spring: 用于生成典型的spring boot工程()
首先在initializr-service-sample 中配置文件中添加需要生成項目的types:
types:- name: WEB Projectid: web-projectdescription: Generate a WEB based project archivetags:build: webformat: builddefault: falseaction: /starter.zip- name: back Projectid: back-projectdescription: Generate a back-project based project archivetags:build: backformat: builddefault: trueaction: /starter.zip根據配置,在initializr-generator中添加對應的build代碼
public class BackBuild extends Build { ... } public final class BACKBuildSystem implements BuildSystem {/*** Maven {@link BuildSystem} identifier.*/public static final String ID = "back";@Overridepublic String id() {return ID;}@Overridepublic String toString() {return id();}} class BACKBuildSystemFactory implements BuildSystemFactory {@Overridepublic BACKBuildSystem createBuildSystem(String id) {if (BACKBuildSystem.ID.equals(id)) {return new BACKBuildSystem();}return null;} }然后在initializr-generator-spring中以Contributor的形式擴展自己需要生成項目的配置,此代碼暫不共享,提供思路,主要是在這里實現初始化項目中的變量和對靜態(tài)資源、模板資源的生成功能,主要就是在resources中放置自己原型工程的模板代碼,為了更好的維護性,將代碼分為靜態(tài)(不需要替換變量,不需要修改后綴為.mustache)、模板資源(需要將文件后綴改為.mustache:因為項目中是通過此mustache模板引擎渲染生成代碼的,mustache中替換變量格式是{{變量名}})。
新增元數據
rootArtifactId流程:
web模塊
ProjectGenerationController(invokeProjectStructureGeneration)
1.–>ProjectRequest(新增變量)
private String rootArtifactId;getter、setter ......2.–>request.convert(DefaultProjectRequestToDescriptionConverter) 新增轉換
description.setRootArtifactId(request.getRootArtifactId());3.–>BACKProjectContributor.initializeProjectModel() (獲取ProjectDescription,并轉換為Map)
private Map<String, Object> initializeProjectModel() {Map<String, Object> model = new LinkedHashMap<>();model.put("artifactId", description.getArtifactId());model.put("groupId", description.getGroupId());model.put("version", description.getVersion());model.put("packageName", description.getPackageName());model.put("rootArtifactId", description.getRootArtifactId());model.put("description", description.getDescription());return model; }4.–>MutableProjectDescription、ProjectDescription中定義新增變量
/*** 自定義參數變量* @return*/ String getRootArtifactId();5.–>BACKProjectContributor中原型工程生成分為兩個模塊,一個是不需要替換變臉的靜態(tài)資源,一個是需要替換的模板資源
generator-spring(生成springboot代碼包)1.staticResource(靜態(tài)資源): 位置在resources/module/2.templateResource(模板資源): 位置在resources/templates/module/6.–>template 替換變量,生成項目。
啟動項目
通過initializr-service-sample中ServiceApplication中啟動
注:項目部署要發(fā)布過程中打包報錯:
1.checkstyle-validation 中校驗比較多,可去除
2.默認打包方式不是以springboot方式打成一個包,因此需要自行修改
<artifactId>initializr-service-sample</artifactId> <name>Spring Initializr :: Service (Sample)</name> <packaging>jar</packaging> <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>spring-boot</classifier><mainClass>sample.service.ServiceApplication</mainClass></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins> </build>至此完畢,又通過自己寫的簡單頁面,實現了此功能。
總結
以上是生活随笔為你收集整理的springboot在线原型工程生成工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ext 2.0 Combos 使用指南
- 下一篇: 低启动,低功耗升压芯片