擼一個Java腳手架,一統團隊項目結構風格

雖然maven已經提供了maven-archetype-webapp、maven-archetype-quickstart等項目骨架幫助咱們快速構建項目架構,可是默認提供的archetype初始化的項目架構並不能知足開發需求,這時候就有必要本身寫一個知足項目需求的archetype了java

使用自定義archrtype生成的項目結構圖

爲了激發閱讀興趣,先放一張使用自定義archetype生成項目的項目結構圖 mysql

基本上的類都是 archetype生成的,爲了讓大家學習真是用盡辦法

archetype是什麼

能夠簡單的理解爲模板工具類,經過archetype咱們能夠快速的生成項目的基本架構。好比咱們使用idea建立一個maven web項目時,經常會選擇maven-archetype-webapp模板來初始化項目,使用maven-archetype-webapp生成的項目中包括webapp目錄,裏面包含web的配置文件 linux

archetype的組成

要想寫一個自定義archetype,首先得知道一個archetype的組成。archetype由四部分組成:git

  • prototype files 原型文件
    位於src/main/resources/archetype-resource目錄下。prototype files 原型文件能夠理解爲多模塊中的子模塊或是單模塊工程中的源文件[即src文件]。這些原型文件在使用對應archetype生成項目時被生成
  • archetype-metadata.xml
    位於src/main/resources/META-INF/maven/目錄下。該配置文件中主要列出了原型文件以及使用archetype生成模板工程須要的參數
  • prototype pom
    位於src/main/resources/archetype-resources目錄下。這個pom文件會出如今archetype建立的模板工程中,若是是單模塊工程,則是對整個項目的依賴管理;若是是多模塊工程,該pom是總pom文件,該文件中會定義項目的子模塊以及對子模塊的依賴進行管理等,子模塊pom定義在子模塊下,子模塊pom文件只管理子模塊的依賴。
  • archetype pom
    位於自定義archetype工程的根目錄下。這是archetype工程項目的pom文件,裏面通常沒什麼東西,不會出如今archetype建立的模板工程中

superman[自定義archetype]結構說明

  • superman項目結構圖
    包含了archetype的四個組成部分,兩個pom文件,一個archtype-metadata文件和五個原型文件[__rootArtifactId__-*],其中__rootArtifactId__在生成模板工程時會被傳入的值替代
  • archtype-metadata配置文件
    • 1.定義使用archetype生成模板工程須要傳入的參數
      <!--須要輸入的屬性-->
          <requiredProperties>
              <requiredProperty key="groupId">
                  <!--默認的groupId-->
                  <defaultValue>com.h2t.test</defaultValue>
              </requiredProperty>
              <requiredProperty key="artifactId">
                  <!--默認的artifactId-->
                  <defaultValue>demo</defaultValue>
              </requiredProperty>
              <requiredProperty key="package">
                  <!--默認的包名和groupId同樣-->
                  <defaultValue>${groupId}</defaultValue>
              </requiredProperty>
          </requiredProperties>
      複製代碼
      ${}標識的變量都是經過maven中的命令行傳進來的
    • 2.定義原型文件
      <module id="${rootArtifactId}-web" name="${rootArtifactId}-web" dir="__rootArtifactId__-web">
                  <fileSets>
                      <fileSet filtered="true" encoding="UTF-8" packaged="true">
                          <directory>src/main/java</directory>
                          <includes>
                              <include>**/*.*</include>
                          </includes>
                      </fileSet>
                      <fileSet filtered="true" encoding="UTF-8" packaged="true">
                          <directory>src/test/java</directory>
                          <includes>
                              <include>**/*.*</include>
                          </includes>
                      </fileSet>
                      <fileSet encoding="UTF-8">
                          <directory>src/main/resources</directory>
                          <includes>
                              <include>**/*.*</include>
                          </includes>
                      </fileSet>
                      <fileSet encoding="UTF-8">
                          <directory>src/test/resources</directory>
                          <includes>
                              <include>**/*.*</include>
                          </includes>
                      </fileSet>
                  </fileSets>
              </module>
      複製代碼
      module屬性介紹: id:子模塊工程的artifactId dir:子模塊工程源文件在archetype-resources裏對應的directory name :子模塊的名字.
  • prototype pom文件
    • 1.定義了五個子模塊
      <!--項目子模塊-->
          <modules>
              <module>${rootArtifactId}-common</module>
              <module>${rootArtifactId}-dao</module>
              <module>${rootArtifactId}-service</module>
              <module>${rootArtifactId}-web</module>
              <module>${rootArtifactId}-model</module>
          </modules>
      複製代碼
    • 子模塊依賴版本統一管理
      <dependencyManagement>
                  <!--modules-->
                  <dependency>
                      <groupId>${groupId}</groupId>
                      <artifactId>${rootArtifactId}-common</artifactId>
                      <version>${version}</version>
                  </dependency>
      
                  <dependency>
                      <groupId>${groupId}</groupId>
                      <artifactId>${rootArtifactId}-dao</artifactId>
                      <version>${version}</version>
                  </dependency>
      
                  <dependency>
                      <groupId>${groupId}</groupId>
                      <artifactId>${rootArtifactId}-service</artifactId>
                      <version>${version}</version>
                  </dependency>
      
                  <dependency>
                      <groupId>${groupId}</groupId>
                      <artifactId>${rootArtifactId}-model</artifactId>
                      <version>${version}</version>
                  </dependency>
              </dependencies>
          </dependencyManagement>
      複製代碼
      子模塊所需依賴都定義在該pom中,子模塊使用依賴時不須要<version>標籤
  • 原型文件以web模塊說明
    就是一個簡單的maven工程,裏面寫了使用archetype生成模板項目的類

附:superman archetype代碼github


supmen archetype技術選型

  • DB
    MySQL
  • ORM
    MyBatisPlus
  • Framework
    SpringBoot

DONE

  • SpringBoot、MyBatisPlus框架的整合
  • 統一異常的處理
  • 統一結果封裝
  • log4j日誌的配置
  • MybatisPlus
    • 代碼生成器
    • 分頁
    • 邏輯刪除

快速開始【superman archetype使用指南】

  • 1.下載源碼web

    git clone https://github.com/TiantianUpup/superman.git
    複製代碼
  • 2.打開superman工程,將其安裝到本地倉庫
    運行命令前先切換到20190815-v2update分支,master分支被我玩壞了【真丟人!!!】
    運行以下命令spring

    mvn clean install
    複製代碼
  • 3.使用自定義archetype初始化項目sql

    mvn archetype:generate 
    -DgroupId=com.h2t.test 
    -DartifactId=superman-demo 
    -Dversion=1.0.0-SNAPSHOT 
    -DarchetypeGroupId=com.h2t.study 
    -DarchetypeArtifactId=superman -DarchetypeVersion=0.0.1-SNAPSHOT -X -DarchetypeCatalog=local
    複製代碼

    參數說明
    -DgroupId組ID,默認項目的包名的組ID相同
    DartifactId:項目惟一標識符,即項目名稱
    -DarchetypeGroupId:superman的組ID,值不須要進行修改
    -DarchetypeArtifactId:superman的artifactId,值不須要進行改變數據庫

  • 4.修改resources文件夾下的配置文件,而且將resources文件標記成Resources Rootwindows

    該文件夾下有application.propertieslogback.propertieslogback-spring.xml三個配置文件

    • application.properties配置文件的修改 application.properties 主要是SpringMyBatisPlus和數據庫的配置信息

      spring.datasource.url=jdbc:mysql://localhost:3306/your_database?characterEncoding=UTF8&serverTimezone=UTC
      spring.datasource.username=root
      spring.datasource.password=your password
      複製代碼

      修改數據庫、密碼,默認用戶名爲root

      mybatis-plus.mapper-locations=classpath*:/mapper/*.xml  
      # mybatis-plus.type-aliases-package=
      複製代碼

      指定MybatisPlus實體類別名的包,即model模塊的po層包名,默認MybatiPlusmapper文件保存在resource下的mapper文件夾下,可自行修改

    • logback.properties配置文件的修改 logback.properties定義了error級別日誌和info級別日誌的保存地址

      LOG_ERROR_HOME=  
      LOG_INFO_HOME=
      複製代碼
    • logback-spring.xml配置文件的修改 logback-spring.xml主要是日誌輸出規則的定義,若爲windows系統無需進行修改,若爲linux osmac os,則需修改日誌保存地址

      <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern>
      複製代碼

      //修改成/

  • 5 使用代碼生成器生成controllerservicedaopo層代碼 代碼生成器類位於service模塊下的generator包下,只須要初始化幾個字段值運行就能夠生成相應的代碼。在運行前首先在項目根目錄下建立一個mp-generator-output文件夾,該文件夾的名字和OUTPUT_DIR字段值保持一致

    • PACKAGE_NAME
      生成代碼的包名,和項目的包名一致,負責複製過去代碼會有一些小問題 -OUTPUT_DIR 生成代碼保存文件地址,默認保存在項目下的mp-generator-output文件夾下,能夠修改成自定義保存地址
    • AUTHOR
      註釋中做者的名字
    • DRIVER_NAME
      數據庫驅動
    • HOST
      數據庫主機號
    • PORT
      數據庫端口
    • DATABASE
      數據庫名字
    • USERNAME
      數據庫用戶名
    • PASSWORD
      數據庫密碼
  • 6.將生成的代碼移動到對應模塊對應包下

    • controller文件夾
      實體類對應的Controller,將該目錄下的類移到web模塊下的controller包下

    • mapper文件夾 實體類對應的DAO層,該目錄下包含xml文件和對應實體的接口類,將xml文件移到dao模塊resource 下的mapper文件夾下,需自行創建mapper文件夾,將接口移到dao模塊下的mapper包下並在接口類上添加@Mapper註解,需自行創建 mapper包。同時將resource文件夾標記成Resources root

    • service 對應實體類接口

      • impl 對應實體類接口實現類

      service目錄下的接口移到service模塊下的service包下,impl目錄下的類移到service模塊下的service.impl包下

    • po文件夾 將該目錄下的類移到model模塊下的po包下,並修改繼承關係,統一繼承BasePO類,由於BasePO類 包含了idgmtCreategmtModifieddeleted這些數據庫基本字段,需將生成的實體類手動刪除這些重複字段。同時自動生成的po類缺失了@TableName@TableField註解需手動補充。註解的使用方式可參考BasePO

  • 7.修改web模塊aspect包下的環繞通知

    @Around("execution(* yourpackage.controller..*(..))")
    複製代碼

    該切面主要用於攔截controller層返回的結果,將其封裝成統一結果返回

  • 8 啓動項目
    web模塊下的Runner類爲啓動類,運行該類便可啓動,默認端口爲8081


附:superman archetype生成demo工程地址

歡迎fork與star[劃重點],因爲開發經驗有限,有些地方可能考慮不周,歡迎提bug。而且該archetype只定義了一些基礎功能,歡迎提需求。

相關文章
相關標籤/搜索