Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save RajaniCode/9b8e54f9d089c676436357212cbb36fa to your computer and use it in GitHub Desktop.
Save RajaniCode/9b8e54f9d089c676436357212cbb36fa to your computer and use it in GitHub Desktop.
Gradle Kotlin Groovy Maven Java Spring Boot Spring MVC Spring Data JPA Spring JPA Hibernate Docker
###########################################################################################################################
# Gradle # Kotlin # Groovy # Maven # Java # Spring Boot # Spring Web # Spring MVC # Spring Data JPA # Spring JPA Hibernate # Docker
###########################################################################################################################
***************************************************************************************************************************
# Gradle # Kotlin # Java # Spring Boot # gradle init
***************************************************************************************************************************
# Java 23.0.2 # Gradle 8.12.1
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12.1/bin/":$PATH
% java --version
% gradle --version
% mkdir -p Gradle/Kotlin/sample
% cd Gradle/Kotlin/sample
# Java 23
% gradle init
% tree
[
.
├── app
│   ├── build.gradle.kts
│   └── src
│   ├── main
│   │   ├── java
│   │   │   └── org
│   │   │   └── example
│   │   │   └── App.java
│   │   └── resources
│   └── test
│   ├── java
│   │   └── org
│   │   └── example
│   │   └── AppTest.java
│   └── resources
├── gradle
│   ├── libs.versions.toml
│   └── wrapper
│   ├── gradle-wrapper.jar
│   └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
15 directories, 10 files
]
% cat settings.gradle.kts
[
/*
* This file was generated by the Gradle 'init' task.
*
* The settings file is used to specify which projects to include in your build.
* For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.12.1/userguide/multi_project_builds.html in the Gradle documentation.
*/
plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
}
rootProject.name = "sample"
include("app")
]
% cat app/build.gradle.kts
[
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java application project to get you started.
* For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.12.1/userguide/building_java_projects.html in the Gradle documentation.
*/
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
application
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Use JUnit Jupiter for testing.
testImplementation(libs.junit.jupiter)
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
// This dependency is used by the application.
implementation(libs.guava)
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
application {
// Define the main class for the application.
mainClass = "org.example.App"
}
tasks.named<Test>("test") {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
]
% cat app/src/main/java/org/example/App.java
[
/*
* This source file was generated by the Gradle 'init' task
*/
package org.example;
public class App {
public String getGreeting() {
return "Hello World!";
}
public static void main(String[] args) {
System.out.println(new App().getGreeting());
}
}
]
% cat app/src/test/java/org/example/AppTest.java
/*
* This source file was generated by the Gradle 'init' task
*/
package org.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test void appHasAGreeting() {
App classUnderTest = new App();
assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
}
}
% ./gradlew run
% ./gradlew build
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/app/build/reports/tests/test --port 8000
# Terminal New Window
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
# Gradle # Groovy # Java # Spring Boot # gradle init
***************************************************************************************************************************
# Java 23.0.2 # Gradle 8.12.1
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12.1/bin/":$PATH
% java --version
% gradle --version
% mkdir -p Gradle/Groovy/sample
% cd Gradle/Groovy/sample
# Java 23 # 2: Groovy
% gradle init
[
Select type of build to generate:
1: Application
2: Library
3: Gradle plugin
4: Basic (build structure only)
Enter selection (default: Application) [1..4]
Select implementation language:
1: Java
2: Kotlin
3: Groovy
4: Scala
5: C++
6: Swift
Enter selection (default: Java) [1..6]
Enter target Java version (min: 7, default: 21): 23
Project name (default: sample):
Select application structure:
1: Single application project
2: Application and library project
Enter selection (default: Single application project) [1..2]
Select build script DSL:
1: Kotlin
2: Groovy
Enter selection (default: Kotlin) [1..2] 2
Select test framework:
1: JUnit 4
2: TestNG
3: Spock
4: JUnit Jupiter
Enter selection (default: JUnit Jupiter) [1..4]
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
> Task :init
Learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.12.1/samples/sample_building_java_applications.html
BUILD SUCCESSFUL in 53s
1 actionable task: 1 executed
]
% tree
[
.
├── app
│   ├── build.gradle
│   └── src
│   ├── main
│   │   ├── java
│   │   │   └── org
│   │   │   └── example
│   │   │   └── App.java
│   │   └── resources
│   └── test
│   ├── java
│   │   └── org
│   │   └── example
│   │   └── AppTest.java
│   └── resources
├── gradle
│   ├── libs.versions.toml
│   └── wrapper
│   ├── gradle-wrapper.jar
│   └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
15 directories, 10 files
]
% cat settings.gradle
[
/*
* This file was generated by the Gradle 'init' task.
*
* The settings file is used to specify which projects to include in your build.
* For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.12.1/userguide/multi_project_builds.html in the Gradle documentation.
*/
plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
}
rootProject.name = 'sample'
include('app')
]
% cat app/build.gradle
[
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java application project to get you started.
* For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.12.1/userguide/building_java_projects.html in the Gradle documentation.
*/
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
// Use JUnit Jupiter for testing.
testImplementation libs.junit.jupiter
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// This dependency is used by the application.
implementation libs.guava
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
application {
// Define the main class for the application.
mainClass = 'org.example.App'
}
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
]
% cat app/src/main/java/org/example/App.java
[
/*
* This source file was generated by the Gradle 'init' task
*/
package org.example;
public class App {
public String getGreeting() {
return "Hello World!";
}
public static void main(String[] args) {
System.out.println(new App().getGreeting());
}
}
]
% cat app/src/test/java/org/example/AppTest.java
[
/*
* This source file was generated by the Gradle 'init' task
*/
package org.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test void appHasAGreeting() {
App classUnderTest = new App();
assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
}
}
]
% ./gradlew run
% ./gradlew build
# yes
% ./gradlew build --scan
% jwebserver --directory $(pwd)/app/build/reports/tests/test --port 8000
# Terminal New Window
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
###########################################################################################################################
###########################################################################################################################
# Gradle # Groovy # Kotlin # Maven # Java # Spring Web
###########################################################################################################################
***************************************************************************************************************************
% mkdir -p sample
% cd sample
# By default, Maven and Gradle compile sources from src/main/java and src/test/java
[
.
└── src
├── main
│   └── java
│   └── com
│   └── commons
│   └── project
└── test
└── java
└── com
└── commons
└── project
]
% mkdir -p src/main/java/com/commons/project
% ls src/main/java/com/commons/project
% mkdir -p src/test/java/com/commons/project
% ls src/test/java/com/commons/project
% mkdir -p src/main/resources
% ls src/main/resources
% nano src/main/resources/application.properties
[
# Enable the /actuator/shutdown as an HTTP endpoint visible only through JMX by default
! management.endpoint.shutdown.enabled=true
# Expose the /actuator/shutdown HTTP endpoint
! management.endpoints.web.exposure.include=health,info,shutdown
]
% cat src/main/resources/application.properties
% nano settings.gradle
[
rootProject.name = 'sample'
]
% cat settings.gradle
% nano build.gradle
[
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.commons.project'
version = '1.0-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
repositories {
mavenCentral()
}
dependencies {
// tag::actuator[]
implementation 'org.springframework.boot:spring-boot-starter-actuator'
// end::actuator[]
implementation 'org.springframework.boot:spring-boot-starter-web'
// tag::tests[]
testImplementation('org.springframework.boot:spring-boot-starter-test')
// end::tests[]
}
tasks.named('test') {
useJUnitPlatform()
}
]
% cat build.gradle
% nano pom.xml
[
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.2</version>
<relativePath/>
</parent>
<groupId>com.commons.project</groupId>
<artifactId>sample</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sample</name>
<description>Spring Boot Spring Web Maven</description>
<properties>
<java.version>23</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- tag::actuator[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- end::actuator[] -->
<!-- tag::tests[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- end::tests[] -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>3.6.0</version>
<reportSets>
<reportSet>
<reports>
<report>jxr-no-fork</report>
<report>test-jxr-no-fork</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
</project>
]
% cat pom.xml
% nano src/main/java/com/commons/project/Application.java
[
package com.commons.project;
import java.util.Arrays;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
System.out.println("Let's inspect the beans provided by Spring Boot:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
};
}
}
]
% cat src/main/java/com/commons/project/Application.java
% nano src/main/java/com/commons/project/JavaRestController.java
[
package com.commons.project;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class JavaRestController {
@GetMapping("/")
public String index() {
String systemProperties = String.format("OS Name: %s OS Version: %s OS Architecture: %s Java Version: %s Spring Version: %s",
System.getProperty("os.name"),
System.getProperty("os.version"),
System.getProperty("os.arch"),
System.getProperty("java.version"),
org.springframework.core.SpringVersion.getVersion()
);
System.out.println(systemProperties);
// System.getProperties().list(System.out);
return systemProperties;
}
}
]
% cat src/main/java/com/commons/project/JavaRestController.java
% nano src/test/java/com/commons/project/ApplicationTests.java
[
package com.commons.project;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ApplicationTests {
@Autowired
private JavaRestController controller;
@Test
void contextLoads() throws Exception {
assertThat(controller).isNotNull();
}
}
]
% cat src/test/java/com/commons/project/ApplicationTests.java
% nano src/test/java/com/commons/project/JavaRestControllerTest.java
[
package com.commons.project;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
@SpringBootTest
@AutoConfigureMockMvc
public class JavaRestControllerTest {
private String systemProperties = String.format("OS Name: %s OS Version: %s OS Architecture: %s Java Version: %s Spring Version: %s",
System.getProperty("os.name"),
System.getProperty("os.version"),
System.getProperty("os.arch"),
System.getProperty("java.version"),
org.springframework.core.SpringVersion.getVersion()
);
@Autowired
private MockMvc mvc;
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo(systemProperties)));
}
}
]
% cat src/test/java/com/commons/project/JavaRestControllerTest.java
% nano src/test/java/com/commons/project/JavaRestControllerIntegrationTest.java
[
package com.commons.project;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class JavaRestControllerIntegrationTest {
private String systemProperties = String.format("OS Name: %s OS Version: %s OS Architecture: %s Java Version: %s Spring Version: %s",
System.getProperty("os.name"),
System.getProperty("os.version"),
System.getProperty("os.arch"),
System.getProperty("java.version"),
org.springframework.core.SpringVersion.getVersion()
);
@Autowired
private TestRestTemplate template;
@Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity("/", String.class);
assertThat(response.getBody()).isEqualTo(systemProperties);
}
}
]
% cat src/test/java/com/commons/project/JavaRestControllerIntegrationTest.java
% tree
.
├── build.gradle
├── pom.xml
├── settings.gradle
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   │   ├── Application.java
│   │   └── JavaRestController.java
│   └── resources
│   └── application.properties
└── test
└── java
└── com
└── commons
└── project
├── ApplicationTests.java
├── JavaRestControllerIntegrationTest.java
└── JavaRestControllerTest.java
13 directories, 9 files
***************************************************************************************************************************
# Terminal Window # Spring Web # Maven Wrapper
************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Apache Maven 3.9.9
% export JAVA_HOME="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home"
% export M2_HOME="$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9"
% export M2="$M2_HOME/bin"
% export PATH=$PATH:"$M2:$JAVA_HOME/bin"
[
% export MAVEN_OPTS="-Xms256m -Xmx512m --enable-preview"
]
% export MAVEN_OPTS="-Xms256m -Xmx512m"
# Or
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9/bin/":$PATH
% java --version
% mvn --version
% mvn wrapper:wrapper
[
% ./mvnw clean
]
% ./mvnw spring-boot:run
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
[
# Check the health of the application
% curl http://localhost:8080/actuator/health
{"status":"UP"}
% open http://localhost:8080/actuator/health
# Invoke shutdown through curl by commenting out the application.properties
% curl -X POST http://localhost:8080/actuator/shutdown
{"timestamp":1401820343710,"error":"Not Found","status":404,"message":"","path":"/actuator/shutdown"}
# Invoke shutdown through curl by uncommenting the application.properties
% curl -X POST http://localhost:8080/actuator/shutdown
{"message":"Shutting down, bye..."}
]
# Terminal Window # Spring Web # Maven Wrapper
<control + c>
[
% ./mvnw clean
]
% ./mvnw package
% java -jar target/sample-1.0-SNAPSHOT.jar
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl http://localhost:8080/actuator/health
% open http://localhost:8080/actuator/health
% curl -X POST http://localhost:8080/actuator/shutdown
# Spring Web # Maven Wrapper # Surefire Report
# Terminal Window # Spring Web # Maven Wrapper
[
<control + c>
% ./mvnw test
]
% ./mvnw surefire-report:report
% jwebserver --version
% jwebserver --directory $(pwd)/target/reports --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/surefire.html
% open http://127.0.0.1:8000/surefire.html
************************************************************************************************************************
# Terminal Window # Spring Web # Gradle Wrapper # Groovy
************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% gradle wrapper
[
% ./gradlew clean
]
% ./gradlew bootRun
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl http://localhost:8080/actuator/health
% open http://localhost:8080/actuator/health
% curl -X POST http://localhost:8080/actuator/shutdown
# Terminal Window # Spring Web # Gradle Wrapper # Groovy
[
<control + c>
% ./gradlew clean
]
% ./gradlew build
% java -jar build/libs/sample-1.0-SNAPSHOT.jar
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl http://localhost:8080/actuator/health
% open http://localhost:8080/actuator/health
% curl -X POST http://localhost:8080/actuator/shutdown
# Terminal Window # Spring Web # Gradle Wrapper # Groovy # Reports
[
<control + c>
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
# Terminal Window # Spring Web # Gradle Wrapper # Kotlin
************************************************************************************************************************
[
% mkdir -p Maven; mkdir -p Gradle/Kotlin; mkdir -p Gradle/Groovy
% cp -r sample Maven
% cp -r sample Gradle/Groovy
% mv sample Gradle/Kotlin
% cd Gradle/Kotlin/sample
]
% rm -rf gradle gradlew gradlew.bat settings.gradle build.gradle build .gradle
% nano settings.gradle.kts
[
rootProject.name = "sample"
]
% cat settings.gradle.kts
% nano build.gradle.kts
[
plugins {
java
id("org.springframework.boot") version "3.4.2"
id("io.spring.dependency-management") version "1.1.7"
}
group = "com.commons.project"
version = "1.0-SNAPSHOT"
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
repositories {
mavenCentral()
}
dependencies {
// tag::actuator[]
implementation("org.springframework.boot:spring-boot-starter-actuator")
// end::actuator[]
implementation("org.springframework.boot:spring-boot-starter-web")
// tag::tests[]
testImplementation("org.springframework.boot:spring-boot-starter-test")
// end::tests[]
}
tasks.withType<Test> {
useJUnitPlatform()
}
]
% cat build.gradle.kts
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% gradle wrapper
[
% ./gradlew clean
]
% ./gradlew bootRun
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl http://localhost:8080/actuator/health
% open http://localhost:8080/actuator/health
% curl -X POST http://localhost:8080/actuator/shutdown
# Terminal Window # Spring MVC # Gradle Wrapper # Kotlin
[
<control + c>
% ./gradlew clean
]
% ./gradlew build
% java -jar build/libs/sample-1.0-SNAPSHOT.jar
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl http://localhost:8080/actuator/health
% open http://localhost:8080/actuator/health
% curl -X POST http://localhost:8080/actuator/shutdown
# Terminal Window # Spring MVC # Gradle Wrapper # Kotlin # Reports
[
<control + c>
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
###########################################################################################################################
###########################################################################################################################
# Gradle # Groovy # Kotlin # Maven # Java # Spring MVC
###########################################################################################################################
***************************************************************************************************************************
.
├── build.gradle
├── pom.xml
├── settings.gradle
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   │   ├── ServingWebContentApplication.java
│   │   └── SpringMVCController.java
│   └── resources
│   ├── static
│   │   └── index.html
│   └── templates
│   └── springmvc.html
└── test
└── java
└── com
└── commons
└── project
└── ServingWebContentApplicationTest.java
15 directories, 8 files
***************************************************************************************************************************
% mkdir -p sample
% cd sample
% mkdir -p src/main/java/com/commons/project
% ls src/main/java/com/commons/project
% mkdir -p src/test/java/com/commons/project
% ls src/test/java/com/commons/project
% mkdir -p src/main/resources/static
% ls src/main/resources/static
% mkdir -p src/main/resources/templates
% ls src/main/resources/templates
% mkdir -p src/test/java/com/commons/project
% ls src/test/java/com/commons/project
% tree
.
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   └── resources
│   ├── static
│   └── templates
└── test
└── java
└── com
└── commons
└── project
15 directories, 0 files
% nano settings.gradle
[
rootProject.name = 'sample'
]
% cat settings.gradle
% nano build.gradle
[
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.commons.project'
version = '1.0-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
]
% cat build.gradle
% nano pom.xml
[
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/>
</parent>
<groupId>com.commons.project</groupId>
<artifactId>sample</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sample</name>
<description>Spring Boot Spring MVC Maven</description>
<properties>
<java.version>23</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>3.6.0</version>
<reportSets>
<reportSet>
<reports>
<report>jxr-no-fork</report>
<report>test-jxr-no-fork</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
</project>
]
% cat pom.xml
% nano src/main/java/com/commons/project/SpringMVCController.java
[
package com.commons.project;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class SpringMVCController {
@GetMapping("/springmvc")
public String springmvc(@RequestParam(name="name", required=false, defaultValue="Framework") String name, Model model) {
model.addAttribute("name", name);
return "springmvc";
}
}
]
% cat src/main/java/com/commons/project/SpringMVCController.java
% nano src/main/java/com/commons/project/ServingWebContentApplication.java
[
package com.commons.project;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ServingWebContentApplication {
public static void main(String[] args) {
SpringApplication.run(ServingWebContentApplication.class, args);
}
}
]
% cat src/main/java/com/commons/project/ServingWebContentApplication.java
% nano src/main/resources/static/index.html
[
<!DOCTYPE HTML>
<html>
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>Spring MVC Request Parameter <a href="/springmvc">here</a></p>
</body>
</html>
]
% cat src/main/resources/static/index.html
% nano src/main/resources/templates/springmvc.html
[
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="|Spring MVC Request Parameter: ${name}!|" />
</body>
</html>
]
% cat src/main/resources/templates/springmvc.html
% nano src/test/java/com/commons/project/ServingWebContentApplicationTest.java
[
package com.commons.project;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(controllers = SpringMVCController.class)
public class ServingWebContentApplicationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void homePage() throws Exception {
// N.B. jsoup can be useful for asserting HTML content
mockMvc.perform(get("/index.html"))
.andExpect(content().string(containsString("Spring MVC Request Parameter")));
}
@Test
public void springmvc() throws Exception {
mockMvc.perform(get("/springmvc"))
.andExpect(content().string(containsString("Spring MVC Request Parameter: Framework!")));
}
@Test
public void springmvcWithRequestParam() throws Exception {
mockMvc.perform(get("/springmvc").param("name", org.springframework.core.SpringVersion.getVersion()))
.andExpect(content().string(containsString("Spring MVC Request Parameter: " + org.springframework.core.SpringVersion.getVersion() + "!")));
}
}
]
% cat src/test/java/com/commons/project/ServingWebContentApplicationTest.java
% tree
.
├── build.gradle
├── pom.xml
├── settings.gradle
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   │   ├── ServingWebContentApplication.java
│   │   └── SpringMVCController.java
│   └── resources
│   ├── static
│   │   └── index.html
│   └── templates
│   └── springmvc.html
└── test
└── java
└── com
└── commons
└── project
└── ServingWebContentApplicationTest.java
15 directories, 8 files
***************************************************************************************************************************
# Terminal Window # Spring MVC # Maven Wrapper
************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Apache Maven 3.9.9
% export JAVA_HOME="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home"
% export M2_HOME="$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9"
% export M2="$M2_HOME/bin"
% export PATH=$PATH:"$M2:$JAVA_HOME/bin"
[
% export MAVEN_OPTS="-Xms256m -Xmx512m --enable-preview"
]
% export MAVEN_OPTS="-Xms256m -Xmx512m"
# Or
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9/bin/":$PATH
% java --version
% mvn --version
% mvn wrapper:wrapper
[
% ./mvnw clean
]
% ./mvnw spring-boot:run
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl "http://localhost:8080/springmvc?name=Maven%20Wrapper"
% open "http://localhost:8080/springmvc?name=Maven%20Wrapper"
# Terminal Window # Spring MVC # Maven Wrapper
<control + c>
[
% ./mvnw clean
]
% ./mvnw package
% java -jar target/sample-1.0-SNAPSHOT.jar
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl "http://localhost:8080/springmvc?name=Maven%20Wrapper%20Jar"
% open "http://localhost:8080/springmvc?name=Maven%20Wrapper%20Jar"
# Terminal Window # Spring MVC # Maven Wrapper
<control + c>
# Spring MVC # Maven Wrapper # Surefire Report
[
% ./mvnw test
]
% ./mvnw surefire-report:report
% jwebserver --version
% jwebserver --directory $(pwd)/target/reports --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/surefire.html
% open http://127.0.0.1:8000/surefire.html
************************************************************************************************************************
# Terminal Window # Spring MVC # Gradle Wrapper # Groovy
************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% gradle wrapper
[
% ./gradlew clean
]
% ./gradlew bootRun
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl "http://localhost:8080/springmvc?name=Gradle%20Wrapper"
% open "http://localhost:8080/springmvc?name=Gradle%20Wrapper"
# Terminal Window # Spring MVC # Gradle Wrapper # Groovy
<control + c>
[
% ./gradlew clean
]
% ./gradlew build
% java -jar build/libs/sample-1.0-SNAPSHOT.jar
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl "http://localhost:8080/springmvc?name=Gradle%20Wrapper%20Jar"
% open "http://localhost:8080/springmvc?name=Gradle%20Wrapper%20Jar"
# Terminal Window # Spring MVC # Gradle Wrapper # Groovy
<control + c>
# Spring MVC # Gradle Wrapper # Reports
[
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
# Terminal Window # Spring MVC # Gradle Wrapper # Kotlin
************************************************************************************************************************
[
% mkdir -p Maven; mkdir -p Gradle/Kotlin; mkdir -p Gradle/Groovy
% cp -r sample Maven
% cp -r sample Gradle/Groovy
% mv sample Gradle/Kotlin
% cd Gradle/Kotlin/sample
]
% rm -rf gradle gradlew gradlew.bat settings.gradle build.gradle build .gradle
% nano settings.gradle.kts
[
rootProject.name = "sample"
]
% cat settings.gradle.kts
% nano build.gradle.kts
[
plugins {
id("java")
id("org.springframework.boot") version "3.4.2"
id("io.spring.dependency-management") version "1.1.7"
}
group = "com.commons.project"
version = "1.0-SNAPSHOT"
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(23))
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-web")
developmentOnly("org.springframework.boot:spring-boot-devtools")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.test {
useJUnitPlatform()
}
]
% cat build.gradle.kts
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% gradle wrapper
[
% ./gradlew clean
]
% ./gradlew bootRun
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl "http://localhost:8080/springmvc?name=Gradle%20Wrapper%20Kotlin"
% open "http://localhost:8080/springmvc?name=Gradle%20Wrapper%20Kotlin"
# Terminal Window # Spring MVC # Gradle Wrapper # Kotlin
<control + c>
[
% ./gradlew clean
]
% ./gradlew build
% java -jar build/libs/sample-1.0-SNAPSHOT.jar
# Terminal Window # curl # open
% curl http://localhost:8080/
% open http://localhost:8080/
% curl "http://localhost:8080/springmvc?name=Gradle%20Wrapper%20Kotlin%20Jar"
% open "http://localhost:8080/springmvc?name=Gradle%20Wrapper%20Kotlin%20Jar"
# Terminal Window # Spring MVC # Gradle Wrapper # Kotlin
<control + c>
# Spring MVC # Gradle Wrapper # Kotlin # Reports
[
% ./gradlew clean
]
% ./gradlew build
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
###########################################################################################################################
###########################################################################################################################
# Gradle # Kotlin # Groovy # Maven # Java # Spring Data JPA # Docker
###########################################################################################################################
***************************************************************************************************************************
# Gradle # Kotlin # Maven # Java # Spring Data JPA
***************************************************************************************************************************
.
├── build.gradle.kts
├── pom.xml
├── settings.gradle.kts
└── src
├── main
│   └── java
│      └── com
│      └── commons
│      └── project
│      ├── AccessingDataMongodbApplication.java
│      ├── Customer.java
│      └── CustomerRepository.java
│     
│  
│  
└── test
└── java
└── com
└── commons
└── project
└── CustomerRepositoryTests.java
12 directories, 7 files
***************************************************************************************************************************
% mkdir -p sample
% cd sample
% mkdir -p src/main/java/com/commons/project
% ls src/main/java/com/commons/project
% mkdir -p src/test/java/com/commons/project
% ls src/test/java/com/commons/project
% tree
.
└── src
├── main
│   └── java
│   └── com
│   └── commons
│   └── project
└── test
└── java
└── com
└── commons
└── project
12 directories, 0 files
% nano settings.gradle.kts
[
rootProject.name = "sample"
]
% cat settings.gradle.kts
% nano build.gradle.kts
[
plugins {
id("java")
id("org.springframework.boot") version "3.4.2"
id("io.spring.dependency-management") version "1.1.7"
}
group = "com.commons.project"
version = "1.0-SNAPSHOT"
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(23))
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.boot:spring-boot-testcontainers")
testImplementation("org.testcontainers:junit-jupiter")
testImplementation("org.testcontainers:mongodb")
}
tasks.test {
useJUnitPlatform()
}
]
% cat build.gradle.kts
% nano pom.xml
[
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.commons.project</groupId>
<artifactId>sample</artifactId>
<version>1.0-SNAPSHOT</version>
<name>sample</name>
<description>Spring Boot Spring Data JPA Maven</description>
<properties>
<java.version>23</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mongodb</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>3.6.0</version>
<reportSets>
<reportSet>
<reports>
<report>jxr-no-fork</report>
<report>test-jxr-no-fork</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
</project>
]
% cat pom.xml
% nano src/main/java/com/commons/project/AccessingDataMongodbApplication.java
[
package com.commons.project;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataMongodbApplication implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(AccessingDataMongodbApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
repository.deleteAll();
// save a couple of customers
repository.save(new Customer("Alice", "Smith"));
repository.save(new Customer("Bob", "Smith"));
// fetch all customers
System.out.println("Customers found with findAll():");
System.out.println("-------------------------------");
for (Customer customer : repository.findAll()) {
System.out.println(customer);
}
System.out.println();
// fetch an individual customer
System.out.println("Customer found with findByFirstName('Alice'):");
System.out.println("--------------------------------");
System.out.println(repository.findByFirstName("Alice"));
System.out.println("Customers found with findByLastName('Smith'):");
System.out.println("--------------------------------");
for (Customer customer : repository.findByLastName("Smith")) {
System.out.println(customer);
}
}
}
]
% cat src/main/java/com/commons/project/AccessingDataMongodbApplication.java
% nano src/main/java/com/commons/project/Customer.java
[
package com.commons.project;
import org.springframework.data.annotation.Id;
public class Customer {
@Id
public String id;
public String firstName;
public String lastName;
public Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%s, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
}
]
% cat src/main/java/com/commons/project/Customer.java
% nano src/main/java/com/commons/project/CustomerRepository.java
[
package com.commons.project;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface CustomerRepository extends MongoRepository<Customer, String> {
public Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName);
}
]
% cat src/main/java/com/commons/project/CustomerRepository.java
% nano src/test/java/com/commons/project/CustomerRepositoryTests.java
[
package com.commons.project;
import static org.assertj.core.api.Assertions.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.data.domain.Example;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@SpringBootTest
@Testcontainers
public class CustomerRepositoryTests {
@Container
@ServiceConnection
static MongoDBContainer container = new MongoDBContainer("mongo:7.0.2");
@Autowired
CustomerRepository repository;
Customer dave, oliver, carter;
@BeforeEach
public void setUp() {
repository.deleteAll();
dave = repository.save(new Customer("Dave", "Matthews"));
oliver = repository.save(new Customer("Oliver August", "Matthews"));
carter = repository.save(new Customer("Carter", "Beauford"));
}
@Test
public void setsIdOnSave() {
Customer dave = repository.save(new Customer("Dave", "Matthews"));
assertThat(dave.id).isNotNull();
}
@Test
public void findsByLastName() {
List<Customer> result = repository.findByLastName("Beauford");
assertThat(result).hasSize(1).extracting("firstName").contains("Carter");
}
@Test
public void findsByExample() {
Customer probe = new Customer(null, "Matthews");
List<Customer> result = repository.findAll(Example.of(probe));
assertThat(result).hasSize(2).extracting("firstName").contains("Dave", "Oliver August");
}
}
]
% cat src/test/java/com/commons/project/CustomerRepositoryTests.java
% tree
.
├── build.gradle.kts
├── pom.xml
├── settings.gradle.kts
└── src
├── main
│   └── java
│   └── com
│   └── commons
│   └── project
│   ├── AccessingDataMongodbApplication.java
│   ├── Customer.java
│   └── CustomerRepository.java
└── test
└── java
└── com
└── commons
└── project
└── CustomerRepositoryTests.java
12 directories, 7 files
***************************************************************************************************************************
# Terminal Window # Spring Data JPA # Maven Wrapper
***************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Apache Maven 3.9.9
% export JAVA_HOME="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home"
% export M2_HOME="$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9"
% export M2="$M2_HOME/bin"
% export PATH=$PATH:"$M2:$JAVA_HOME/bin"
[
% export MAVEN_OPTS="-Xms256m -Xmx512m --enable-preview"
]
% export MAVEN_OPTS="-Xms256m -Xmx512m"
# Or
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9/bin/":$PATH
% java --version
% mvn --version
% mvn wrapper:wrapper
[
% brew services start mongodb-community
% brew services stop mongodb-community
]
% brew services restart mongodb/brew/mongodb-community
% export PATH="/Applications/Docker.app/Contents/Resources/bin/:/Applications/Docker.app/Contents/Resources/cli-plugins/":$PATH
% docker version
[
% ./mvnw clean
]
% ./mvnw spring-boot:run
[
% ./mvnw clean
]
% ./mvnw package
% java -jar target/sample-1.0-SNAPSHOT.jar
# Spring Data JPA # Maven Wrapper # Surefire Report
[
% ./mvnw test
]
% ./mvnw surefire-report:report
% jwebserver --version
% jwebserver --directory $(pwd)/target/reports --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/surefire.html
% open http://127.0.0.1:8000/surefire.html
***************************************************************************************************************************
# Terminal Window # Spring Data JPA # Gradle Wrapper # Kotlin
***************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% gradle wrapper
[
% brew services start mongodb-community
% brew services stop mongodb-community
]
% brew services restart mongodb/brew/mongodb-community
% export PATH="/Applications/Docker.app/Contents/Resources/bin/:/Applications/Docker.app/Contents/Resources/cli-plugins/":$PATH
% docker version
[
% ./gradlew clean
]
% ./gradlew bootRun
[
% ./gradlew clean
]
% ./gradlew build
% java -jar build/libs/sample-1.0-SNAPSHOT.jar
# Spring Data JPA # Gradle Wrapper # Kotlin # Reports
[
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
# Terminal Window # Spring Data JPA # Gradle Wrapper # Groovy
***************************************************************************************************************************
[
% mkdir -p Maven; mkdir -p Gradle/Kotlin; mkdir -p Gradle/Groovy
% cp -r sample Maven
% cp -r sample Gradle/Kotlin
% mv sample Gradle/Groovy
% cd Gradle/Groovy/sample
]
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% rm -rf gradle gradlew gradlew.bat settings.gradle.kts build.gradle.kts build .gradle
% nano settings.gradle
[
rootProject.name = 'sample'
]
% cat settings.gradle
% nano build.gradle
[
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.commons.project'
version = '1.0-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-testcontainers'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mongodb'
}
test {
useJUnitPlatform()
}
]
% cat build.gradle
% gradle wrapper
[
% brew services start mongodb-community
% brew services stop mongodb-community
]
% brew services restart mongodb/brew/mongodb-community
% export PATH="/Applications/Docker.app/Contents/Resources/bin/:/Applications/Docker.app/Contents/Resources/cli-plugins/":$PATH
% docker version
[
% ./gradlew clean
]
% ./gradlew bootRun
[
% ./gradlew clean
]
% ./gradlew build
% java -jar build/libs/sample-1.0-SNAPSHOT.jar
# Spring Data JPA # Gradle Wrapper # Groovy # Reports
[
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
###########################################################################################################################
###########################################################################################################################
# Gradle # Kotlin # Groovy # Maven # Java # Spring JPA Hibernate # Docker
###########################################################################################################################
***************************************************************************************************************************
# Gradle # Kotlin # Maven # Java # Spring JPA Hibernate
***************************************************************************************************************************
.
├── compose.yaml
├── pom.xml
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   │   ├── AccessingDataMysqlApplication.java
│   │   ├── MainController.java
│   │   ├── User.java
│   │   └── UserRepository.java
│   └── resources
│   └── application.properties
└── test
└── java
└── com
└── commons
└── project
└── AccessingDataMysqlApplicationTests.java
13 directories, 8 files
***************************************************************************************************************************
% mkdir -p sample
% cd sample
% mkdir -p src/main/java/com/commons/project
% ls src/main/java/com/commons/project
% mkdir -p src/test/java/com/commons/project
% ls src/test/java/com/commons/project
% mkdir -p src/main/resources
% ls src/main/resources
% tree
.
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   └── resources
└── test
└── java
└── com
└── commons
└── project
13 directories, 0 files
% nano src/main/resources/application.properties
[
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=myuser
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql: true
]
% cat src/main/resources/application.properties
% nano compose.yaml
[
services:
mysql:
image: 'mysql:latest'
environment:
- 'MYSQL_DATABASE=mydatabase'
- 'MYSQL_PASSWORD=secret'
- 'MYSQL_ROOT_PASSWORD=verysecret'
- 'MYSQL_USER=myuser'
ports:
- '3306'
]
% cat compose.yaml
% nano src/main/java/com/commons/project/User.java
[
package com.commons.project;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity // This tells Hibernate to make a table out of this class
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
]
% cat src/main/java/com/commons/project/User.java
% nano src/main/java/com/commons/project/UserRepository.java
[
package com.commons.project;
import org.springframework.data.repository.CrudRepository;
import com.commons.project.User;
// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete
public interface UserRepository extends CrudRepository<User, Integer> {
}
]
% cat src/main/java/com/commons/project/UserRepository.java
% nano src/main/java/com/commons/project/MainController.java
[
package com.commons.project;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // This means that this class is a Controller
@RequestMapping(path="/sample") // This means URL's start with /demo (after Application path)
public class MainController {
@Autowired // This means to get the bean called userRepository
// Which is auto-generated by Spring, we will use it to handle the data
private UserRepository userRepository;
@PostMapping(path="/add") // Map ONLY POST Requests
public @ResponseBody String addNewUser (@RequestParam String name
, @RequestParam String email) {
// @ResponseBody means the returned String is the response, not a view name
// @RequestParam means it is a parameter from the GET or POST request
User n = new User();
n.setName(name);
n.setEmail(email);
userRepository.save(n);
return "Saved";
}
@GetMapping(path="/all")
public @ResponseBody Iterable<User> getAllUsers() {
// This returns a JSON or XML with the users
return userRepository.findAll();
}
}
]
% cat src/main/java/com/commons/project/MainController.java
% nano src/main/java/com/commons/project/AccessingDataMysqlApplication.java
[
package com.commons.project;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataMysqlApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataMysqlApplication.class, args);
}
}
]
% cat src/main/java/com/commons/project/AccessingDataMysqlApplication.java
% nano src/test/java/com/commons/project/AccessingDataMysqlApplicationTests.java
[
package com.commons.project;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
@Testcontainers
@SpringBootTest
class AccessingDataMysqlApplicationTests {
@Container
@ServiceConnection
static MySQLContainer<?> mySQLContainer = new MySQLContainer<>(DockerImageName.parse("mysql:latest"));
@Test
void contextLoads() {
}
}
]
% cat src/test/java/com/commons/project/AccessingDataMysqlApplicationTests.java
% nano settings.gradle.kts
[
rootProject.name = "sample"
]
% cat settings.gradle.kts
% nano build.gradle.kts
[
plugins {
java
war
id("org.springframework.boot") version "3.4.2"
id("io.spring.dependency-management") version "1.1.7"
}
group = "com.commons.project"
version = "1.0-SNAPSHOT"
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-web")
developmentOnly("org.springframework.boot:spring-boot-docker-compose")
runtimeOnly("com.mysql:mysql-connector-j")
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.boot:spring-boot-testcontainers")
testImplementation("org.testcontainers:junit-jupiter")
testImplementation("org.testcontainers:mysql")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
tasks.withType<Test> {
useJUnitPlatform()
}
]
% cat build.gradle.kts
% nano pom.xml
[
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.commons.project</groupId>
<artifactId>sample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>sample</name>
<description>Spring Boot Web JPA MySQL Docker Testcontainers Maven</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>23</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>3.6.0</version>
<reportSets>
<reportSet>
<reports>
<report>jxr-no-fork</report>
<report>test-jxr-no-fork</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
</project>
]
% cat pom.xml
% tree
.
├── build.gradle.kts
├── compose.yaml
├── pom.xml
├── settings.gradle.kts
└── src
├── main
│   ├── java
│   │   └── com
│   │   └── commons
│   │   └── project
│   │   ├── AccessingDataMysqlApplication.java
│   │   ├── MainController.java
│   │   ├── User.java
│   │   └── UserRepository.java
│   └── resources
│   └── application.properties
└── test
└── java
└── com
└── commons
└── project
└── AccessingDataMysqlApplicationTests.java
13 directories, 10 files
***************************************************************************************************************************
# Terminal Window # Spring JPA Hibernate # Maven Wrapper
***************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Apache Maven 3.9.9
% export JAVA_HOME="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home"
% export M2_HOME="$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9"
% export M2="$M2_HOME/bin"
% export PATH=$PATH:"$M2:$JAVA_HOME/bin"
[
% export MAVEN_OPTS="-Xms256m -Xmx512m --enable-preview"
]
% export MAVEN_OPTS="-Xms256m -Xmx512m"
# Or
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/ApacheMaven/apache-maven-3.9.9/bin/":$PATH
% java --version
% mvn --version
% mvn wrapper:wrapper
% export PATH="/Applications/Docker.app/Contents/Resources/bin/:/Applications/Docker.app/Contents/Resources/cli-plugins/":$PATH
% docker version
[
% ./mvnw clean
]
% ./mvnw spring-boot:run
# Terminal Window # curl # open
% curl http://localhost:8080/sample/all
[
[]
]
% curl http://localhost:8080/sample/add -d name=Maven -d [email protected]
[
Saved
]
% curl http://localhost:8080/sample/all
[
[{"id":1,"name":"Maven","email":"[email protected]"}]
]
# Spring MVC # Maven Wrapper # Surefire Report
# Original Terminal Window
<control + c>
[
% ./mvnw test
]
% ./mvnw surefire-report:report
% jwebserver --version
% jwebserver --directory $(pwd)/target/reports --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/surefire.html
% open http://127.0.0.1:8000/surefire.html
***************************************************************************************************************************
# Terminal Window # Spring JPA Hibernate # Gradle Wrapper # Kotlin
***************************************************************************************************************************
[
% cd sample
]
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% gradle wrapper
% export PATH="/Applications/Docker.app/Contents/Resources/bin/:/Applications/Docker.app/Contents/Resources/cli-plugins/":$PATH
% docker version
[
% ./gradlew clean
]
% ./gradlew bootRun
# Terminal Window # curl # open
% curl http://localhost:8080/sample/all
[
[{"id":1,"name":"Maven","email":"[email protected]"}]
]
% curl http://localhost:8080/sample/add -d name=Kotlin -d [email protected]
[
Saved
]
% curl http://localhost:8080/sample/all
[
[{"id":1,"name":"Maven","email":"[email protected]"},{"id":2,"name":"Kotlin","email":"[email protected]"}]
]
# Spring JPA Hibernate # Gradle Wrapper # Kotlin # Reports
# Terminal Window # Spring Data JPA # Maven Wrapper
<control + c>
[
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
# Terminal Window # Spring JPA Hibernate # Gradle Wrapper # Groovy
***************************************************************************************************************************
[
% mkdir -p Maven; mkdir -p Gradle/Kotlin; mkdir -p Gradle/Groovy
% cp -r sample Maven
% cp -r sample Gradle/Kotlin
% mv sample Gradle/Groovy
% cd Gradle/Groovy/sample
]
# Java 23.0.2 # Gradle 8.12
% export PATH="$HOME/Downloads/Software/OpenJDK/JDK23.0.2/jdk-23.0.2.jdk/Contents/Home/bin/:$HOME/Downloads/Software/Gradle/gradle-8.12/bin/":$PATH
% java --version
% gradle --version
% rm -rf gradle gradlew gradlew.bat settings.gradle.kts build.gradle.kts build .gradle
% nano settings.gradle
[
rootProject.name = 'sample'
]
% cat settings.gradle
% nano build.gradle
[
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.4.2'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.commons.project'
version = '1.0-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(23)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
runtimeOnly 'com.mysql:mysql-connector-j'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-testcontainers'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mysql'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
]
% cat build.gradle
% gradle wrapper
% export PATH="/Applications/Docker.app/Contents/Resources/bin/:/Applications/Docker.app/Contents/Resources/cli-plugins/":$PATH
% docker version
[
% ./gradlew clean
]
% ./gradlew bootRun
# Terminal Window # curl # open
% curl http://localhost:8080/sample/all
[
[{"id":1,"name":"Maven","email":"[email protected]"},{"id":2,"name":"Kotlin","email":"[email protected]"}]
]
% curl http://localhost:8080/sample/add -d name=Groovy -d [email protected]
[
Saved
]
% curl http://localhost:8080/sample/all
[
[{"id":1,"name":"Maven","email":"[email protected]"},{"id":2,"name":"Kotlin","email":"[email protected]"},{"id":52,"name":"Groovy","email":"[email protected]"}]
]
# Spring JPA Hibernate # Gradle Wrapper # Groovy # Reports
# Terminal Window # Spring JPA Hibernate # Gradle Wrapper # Groovy
<control + c>
[
% ./gradlew clean
% ./gradlew build
]
# yes
% ./gradlew build --scan
% jwebserver --version
% jwebserver --directory $(pwd)/build/reports/tests/test --port 8000
# Terminal Window # curl # open
% curl http://127.0.0.1:8000/
% open http://127.0.0.1:8000/
***************************************************************************************************************************
###########################################################################################################################
###########################################################################################################################
***************************************************************************************************************************
# Docker # Cleanup
***************************************************************************************************************************
% docker version
% docker container list --all
% docker image list --all
[
% docker ps --all --quiet
% docker stop $(docker ps -a -q)
% docker rm $(docker ps -a -q) --force
]
% docker container list --all --quiet
% docker stop $(docker container list -a -q)
% docker rm $(docker container list -a -q) --force
% docker container prune
% docker image list --all --quiet
% docker rmi $(docker image list -a -q) --force
% docker image prune --all
% docker volume list --quiet
% docker volume rm $(docker volume list --quiet) --force
% docker volume prune --all
% docker network list --quiet --filter "type=custom"
% docker network rm $(docker network list --quiet --filter "type=custom")
% docker network prune
% docker system info
% docker system prune --all --volumes
***************************************************************************************************************************
###########################################################################################################################
// Credits
/*
https://openjdk.org/
https://oracle.com/java/
https://spring.io/
https://start.spring.io/
https://maven.apache.org/
https://gradle.org/
https://gradle.com/
https://groovy-lang.org/
https://kotlinlang.org/
https://mongodb.com/
https://hibernate.org/
https://docker.com/
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment