Skip to content

Gradle plugin to create a clean application in Java that already works, It follows our best practices!

License

Notifications You must be signed in to change notification settings

mohitsaxenaknoldus/scaffold-clean-architecture

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Quality Gate Status Maintainability Rating codecov GitHub license

Scaffolding of Clean Architecture

Gradle plugin to create a java application based on Clean Architecture following our best practices!

Plugin Implementation

To use the plugin you need Gradle version 5.6 or later, to start add the following section into your build.gradle file.

plugins {
    id "co.com.bancolombia.cleanArchitecture" version "1.9.9"
}

Or if is a new project execute this script in the root directory of your project.

echo "plugins {
    id \"co.com.bancolombia.cleanArchitecture\" version \"1.9.9\"
}" > build.gradle

Tasks

The Scaffolding Clean Architecture plugin will allow you run 8 tasks:

Generate Project

The cleanArchitecture | ca task will generate a clean architecture structure in your project, this task has four optional parameters; package , type, name and coverage.

  • package = <package.we.need>: You can specify the main or default package of your project. Default Value = co.com.bancolombia

  • type = <imperative | reactive>: With this parameter the task will generate a POO project. Default Value = imperative

  • name = NameProject: This parameter is going to specify the name of the project. Default Value = cleanArchitecture

  • coverage = <jacoco | cobertura>: This parameter is going to specify the coverage tool for the project. Default Value = jacoco

  • lombok = <true | false>: Specify if you want to use this plugin . Default Value = true

gradle cleanArchitecture --package=co.com.bancolombia --type=imperative --name=NameProject --coverage=jacoco --lombok=true
gradle ca --package=co.com.bancolombia --type=imperative --name=NameProject --coverage=jacoco --lombok=true

The structure will look like this:

πŸ“¦NameProject
┣ πŸ“‚applications
┃ β”— πŸ“‚app-service
┃ ┃ ┣ πŸ“‚src
┃ ┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ ┃ ┣ πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚config
┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œ[configs and beans]
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œMainApplication.java
┃ ┃ ┃ ┃ β”— πŸ“‚resources
┃ ┃ ┃ ┃ ┃ ┣ πŸ“œ[properties]
┃ ┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ β”— πŸ“œbuild.gradle
┣ πŸ“‚deployment
┃ ┣ πŸ“œ[Dockerfile, Pipelines as a code]
┣ πŸ“‚domain
┃ ┣ πŸ“‚model
┃ ┃ ┣ πŸ“‚src
┃ ┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ β”— πŸ“œbuild.gradle
┃ β”— πŸ“‚usecase
┃ ┃ ┣ πŸ“‚src
┃ ┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚usecase
┃ ┃ β”— πŸ“œbuild.gradle
┣ πŸ“‚infrastructure
┃ ┣ πŸ“‚driven-adapters
┃ ┣ πŸ“‚entry-points
┃ β”— πŸ“‚helpers
┣ πŸ“œ.gitignore
┣ πŸ“œbuild.gradle
┣ πŸ“œgradle.properties
┣ πŸ“œlombok.config
┣ πŸ“œmain.gradle
┣ πŸ“œREADME.md
β”— πŸ“œsettings.gradle

Generate Model

The generateModel | gm task will generate a class and interface in model layer, this task has one required parameter name.

gradle generateModel --name=[modelName]
gradle gm --name [modelName]

This task will generate something like that:

πŸ“¦domain
┣ πŸ“‚model
┃ ┣ πŸ“‚src
┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚model
┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚gateways
┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œModelRepository.java
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œModel.java
┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚model
┃ β”— πŸ“œbuild.gradle

Generate Use Case

The generateUseCase | guc task will generate a class in model layer, this task has one required parameter name.

gradle generateUseCase --name=[useCaseName]
gradle guc --name [useCaseName]

This task will generate something like that:

πŸ“¦domain
β”— πŸ“‚usecase
┃ ┣ πŸ“‚src
┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚usecase
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚business
┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œBusinessUseCase.java
┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚usecase
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚business
┃ β”— πŸ“œbuild.gradle

Generate Driven Adapter

The generateDrivenAdapter | gda task will generate a module in Infrastructure layer, this task has one required parameter type.
Whether you'll use generic one also parameter name is required.

gradle generateDrivenAdapter --type=[drivenAdapterType]
gradle gda --type [drivenAdapterType]
Reference for drivenAdapterType Name Additional Options
generic Empty Driven Adapter --name [name]
jpa JPA Repository --secret [true-false]
mongodb Mongo Repository --secret [true-false]
asynceventbus Async Event Bus
restconsumer Rest Client Consumer --url [url]
redis Redis --mode [template-repository] --secret [true-false]
rsocket RSocket Requester
r2dbc R2dbc Postgresql Client
kms AWS Key Management Service
secrets Secrets Manager Bancolombia
s3 AWS Simple Storage Service
mq JMS MQ Client to send messages

This task will generate something like that:

πŸ“¦infrastructure
┣ πŸ“‚driven-adapters
┃ β”— πŸ“‚jpa-repository
┃ ┃ ┣ πŸ“‚src
┃ ┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚jpa
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚config
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œDBSecret.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“‚helper
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œAdapterOperations.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ ┣ πŸ“œJPARepository.java
┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“œJPARepositoryAdapter.java
┃ ┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚jpa
┃ ┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚helper
┃ ┃ β”— πŸ“œbuild.gradle

Generate Entry Point

The generateEntryPoint | gep task will generate a module in Infrastructure layer, this task has one required parameter type.
Whether you'll use generic one also parameter name is required.

gradle generateEntryPoint --type=[entryPointType]
gradle gep --type [entryPointType]
Reference for entryPointType Name Additional Options
generic Empty Entry Point --name [name]
restmvc API REST (Spring Boot Starter Web) --server [serverOption] default undertow
webflux API REST (Spring Boot Starter WebFlux) --router [true, false] default true
rsocket Rsocket Controller Entry Point
graphql API GraphQL --pathgql [name path] default /graphql
asynceventhandler Async Event Handler
mq JMS MQ Client to listen messages

Additionally, if you'll use a restmvc, you can specify the web server on which the application will run. By default, undertow.

```shell

gradle generateEntryPoint --type=restmvc --server=[serverOption] gradle gep --type=restmvc --server=[serverOption]


| Reference for **serverOption** | Name                      |
| ------------------------------ | ------------------------- |
| undertow                       | Undertow server (default) |
| tomcat                         | Tomcat server             |
| jetty                          | Jetty server              |

_**This task will generate something like that:**_

```bash
πŸ“¦infrastructure
┣ πŸ“‚entry-points
┃ β”— πŸ“‚generic
┃ ┃ ┣ πŸ“‚src
┃ ┃ ┃ ┣ πŸ“‚main
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚generic
┃ ┃ ┃ β”— πŸ“‚test
┃ ┃ ┃ ┃ β”— πŸ“‚java
┃ ┃ ┃ ┃ ┃ β”— πŸ“‚[package]
┃ ┃ ┃ ┃ ┃ ┃ β”— πŸ“‚generic
┃ ┃ β”— πŸ“œbuild.gradle

Generate Helper

The generateHelper | gh task will generate a module in Infrastructure layer, this task has one required parameter name.

gradle generateHelper --name=[helperName]
gradle gh --name=[helperName]

Generate Pipeline

The generatePipeline | gpl task will generate CI pipeline inside the folder "./deployment/", this task has one required parameter type.

gradle generatePipeline --type=[pipelineType]
gradle gpl --type=[pipelineType]
Reference for pipelineType Name
azure Azure Pipeline
github GitHub Action

Generate Acceptance Test

The generateAcceptanceTest | gat task will generate subproject by karate framework inside the folder "./deployment/",this task does not have required parameters.

  ```shell
  gradle generateAcceptanceTest
  gradle gat 
  ```

Karate is an open-source tool to combine API test-automation, mocks, performance-testing and even UI automation into a single, unified framework. The BDD syntax popularized by Cucumber is language-neutral, and easy for even non-programmers. Assertions and HTML reports are built-in, and you can run tests in parallel for speed.

Validate Structure

The validateStructure | vs Validate that project references aren't violated.

gradle validateStructure
gradle vs

Delete Module

The deleteModule | dm task will delete a sub project, this task has one required parameter module.

gradle deleteModule --module=[name]
gradle dm --module=[name]




How can I help?

Review the issues, we hear new ideas. Read more Contributing



Whats Next?

Read more About Clean Architecure

About

Gradle plugin to create a clean application in Java that already works, It follows our best practices!

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 63.4%
  • Mustache 35.9%
  • Shell 0.7%