Announcing @jnxplus/nx-maven
Tags: nx, springboot, maven
Published: 2021-09-26 11:26:34

In the previous article, I show you how to add spring boot projects to a Nx workspace using Gradle. Today I will show the same thing using maven. 

I will use my plugin `@jnxplus/nx-maven` to make this integration possible.

## 0. Prerequisites

`@jnxplus/nx-maven` requires a Java 8 or higher Runtime Environment and the current Long Term Support (LTS) version of node.js.

## 1. Create a Nx workspace
We start by creating a workspace :
Open a terminal and run this command to create a new workspace :
```bash
npx create-nx-workspace@latest
```
When asked provide my-product as name and choose an empty workspace :
```bash
devs> npx create-nx-workspace@latest
npx: installed 48 in 3.278s
√ Workspace name (e.g., org name)     · my-product
√ What to create in the new workspace · empty
√ Use Nx Cloud? (It's free and doesn't require registration.) · No

>  NX  Nx is creating your workspace.
```

## 2. Install @jnxplus/nx-maven
In the same terminal go inside my-product folder :
```bash
cd my-product 
 ```
Now install `@jnxplus/nx-maven` with your package manager using the dev flag.

This is an exampel with npm:

```bash
npm install --save-dev @jnxplus/nx-maven
```

### 3. Init workspace with Spring boot and Maven

The following command adds Spring boot and Maven support (Maven wrapper and config files) to the workspace. This only needs to be performed once per workspace.

```bash
nx generate @jnxplus/nx-maven:init
```

Choose the version of Java supported by your operating system and values for the information asked for the Maven parent project :

```bash
my-product> nx generate @jnxplus/nx-maven:init
√ Which version of Java would you like to use? · 11
√ What groupId would you like to use? · com.example
√ What parentProjectName would you like to use? · boot-multi-module
√ What project version would you like to use? · 0.0.1-SNAPSHOT
CREATE mvnw
CREATE mvnw.cmd
CREATE pom.xml
CREATE .mvn/wrapper/maven-wrapper.jar
CREATE .mvn/wrapper/maven-wrapper.properties
CREATE .mvn/wrapper/MavenWrapperDownloader.java
CREATE tools/linters/checkstyle.xml
CREATE tools/linters/pmd.xml
UPDATE nx.json
UPDATE .gitignore
UPDATE .prettierignore
```

As you see, the command added the following files :

- Maven wrapper and Maven executables for windows and Linux.
- Pom.xml for maven parent project. Here we will add our apps and libs later so Maven could perform its tasks.
- `checkstyle.xml` and `pmd.xml` for java linting.

We also updated `nx.json` file to add the plugin for dep-graph feature and `.gitignore` and `.prettierignore` so we can ignore Maven build and cache folders.

## 4. Usage
Let's generate some code now :

### 4.1 Generate an application
```bash
nx generate @jnxplus/nx-maven:application my-app
```
When asked, provide answers or choose default :

```bash
my-product> nx generate @jnxplus/nx-maven:application my-app
√ Which language would you like to use? · java     
√ What groupId would you like to use? · com.example
√ What project version would you like to use? · 0.0.1-SNAPSHOT
√ Which packaging would you like to use? · jar
√ Which configuration format would you like to use? · .properties
UPDATE workspace.json
UPDATE nx.json
CREATE apps/my-app/pom.xml
CREATE apps/my-app/src/main/java/com/example/myapp/HelloController.java
CREATE apps/my-app/src/main/java/com/example/myapp/MyAppApplication.java
CREATE apps/my-app/src/main/resources/application.properties
CREATE apps/my-app/src/test/java/com/example/myapp/HelloControllerTests.java
CREATE apps/my-app/src/test/resources/application.properties
UPDATE pom.xml
```

### 4.2 Generate a library and add it to my-app project

Run this command to generate a library:
```bash
nx generate @jnxplus/nx-maven:library my-lib --projects my-app 
```

The projects option, allow to specify a host project for the library.

```bash
my-product> nx generate @jnxplus/nx-maven:library my-lib --projects my-app 
√ Which language would you like to use? · java     
√ What groupId would you like to use? · com.example
√ What project version would you like to use? · 0.0.1-SNAPSHOT
UPDATE workspace.json
UPDATE nx.json
CREATE libs/my-lib/pom.xml
CREATE libs/my-lib/src/main/java/com/example/mylib/HelloService.java
CREATE libs/my-lib/src/test/java/com/example/mylib/HelloServiceTests.java
CREATE libs/my-lib/src/test/java/com/example/mylib/TestConfiguration.java
UPDATE pom.xml
UPDATE apps/my-app/pom.xml
```
### 4.3 Project targets
`@jnxplus/nx-maven` allow us to build, test, lint, format and serve Spring Boot projects with the same commands as Nx.   
To build `my-app`, you don't need to build first `my-lib`. Nx take care to build `my-lib`.      
Run `nx build my-app` to build your app.                                         

### 4.4 Project graph

`@jnxplus/nx-maven` construct project dependencies automatically by analyzing Spring Boot projects and add them to the Nx project graph.
To visualize the dependency graph, run the following command :
```bash
nx dep-graph
```
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cfwz60quzuui7ribfmsi.PNG)
### 4.5 To know more

To know more about the plugin, visit [the GitHub repo](https://github.com/khalilou88/jnxplus) and [the documentation](https://khalilou88.github.io/jnxplus/) 
Give it a try :)