From 0816d41b61179e3bcd0aef7414f0a5de13338d00 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 14:51:01 +0100 Subject: [PATCH 01/36] Remove publishing configuration Sample projects should not include artifact publishing configuration. Changes: - Removed distributionManagement section from pom.xml - Removed maven-publish plugin from build.gradle - Removed publishing block from build.gradle - Removed publishing properties from gradle.properties - Added Gradle build optimizations to gradle.properties This aligns with CICS sample repository standards where samples are not published to artifact repositories. --- build.gradle | 30 ------------------------------ gradle.properties | 22 +++++++++------------- pom.xml | 21 --------------------- 3 files changed, 9 insertions(+), 64 deletions(-) diff --git a/build.gradle b/build.gradle index c36af4d..296a203 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,6 @@ plugins id 'eclipse' id 'idea' id 'war' - id 'maven-publish' } group = 'com.ibm.cicsdev.springboot' @@ -55,32 +54,3 @@ dependencies // Don't include JCICS in the final build (no need for version because we have BOM) compileOnly("com.ibm.cics:com.ibm.cics.server") } - - - -publishing { - publications { - // Publication for JCICS - maven(MavenPublication) { - groupId "${group}" - version "${version}" - artifactId "${archivesBaseName}" - artifact bootWar - } - } - - // Configure the Maven repository to publish to somewhere which is configurable - // with environment variables from outside gradle. - // - // For example: - // gradle build publish \ - // -Ppublish_repo_releases_url="file://my-folder" \ - // -Ppublish_repo_releases_name="my-maven-repo" - // - repositories { - maven { - url = "${publish_repo_releases_url}/${publish_repo_releases_name}" - } - } - -} diff --git a/gradle.properties b/gradle.properties index 3538325..ef37fb3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,13 @@ # -# Values in this file provide defaults to variables used in the +# Values in this file provide defaults to variables used in the # gradle files. # -# Normally we don't publish any built artifacts to a repository. -# But if we do, these are the default values we use to indicate -# where the files should be placed. -# -# These can be over-ridden from the command line -# with -Ppublish_repo_releases_url="file://my-folder" for example. -# -# These values only have any effect if the publish goal is used. -# For example: gradle build publish. -publish_repo_releases_url = 'default-value-for-publish_repo_releases_url' -publish_repo_releases_name = 'default-value-for-publish_repo_releases_name' -java_version = 8 \ No newline at end of file +# Java version for toolchain +java_version = 8 + +# Gradle build optimizations +org.gradle.daemon=true +org.gradle.parallel=true +# Configuration cache disabled for CICS Bundle Plugin compatibility +# org.gradle.configuration-cache=true \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0431e66..177dc49 100644 --- a/pom.xml +++ b/pom.xml @@ -68,25 +68,4 @@ - - - - - ${publish_repo_snapshots_name} - ${publish_repo_snapshots_url} - - - ${publish_repo_releases_name} - ${publish_repo_releases_url} - - - From cebf7e34e1edd91786b5e2c5a8e5e63465d1d97f Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 15:05:05 +0100 Subject: [PATCH 02/36] Update to Java 17 baseline Java 17 is required as the foundation for Spring Boot 3.x upgrade. Changes: - Updated java.version to 17 in pom.xml - Added Maven compiler plugin with release parameter - Updated java_version to 17 in gradle.properties - Updated README prerequisites to Java SE 17 - Updated CICS TS requirement to V5.6+ (minimum for Java 17) This establishes the Java 17 baseline required for Spring Boot 3.x. --- README.md | 4 ++-- gradle.properties | 2 +- pom.xml | 13 ++++++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2ce8475..cd7fba3 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This sample project demonstrates a Spring Boot application running asynchronous ## Prerequisites - - CICS TS V5.3 or later + - CICS TS V5.6 or later (required for Java 17 support) - A configured Liberty JVM server in CICS - - Java SE 1.8 or later on the workstation + - Java SE 17 or later on the workstation - An Eclipse development environment on the workstation (optional) - Either Gradle or Apache Maven on the workstation (optional if using Wrappers) diff --git a/gradle.properties b/gradle.properties index ef37fb3..6e02650 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ # # Java version for toolchain -java_version = 8 +java_version = 17 # Gradle build optimizations org.gradle.daemon=true diff --git a/pom.xml b/pom.xml index 177dc49..d091128 100644 --- a/pom.xml +++ b/pom.xml @@ -16,12 +16,11 @@ cics-java-liberty-springboot-asynchronous Demo project for Spring Boot - 1.8 - + 17 UTF-8 ${java.version} ${java.version} - + @@ -61,6 +60,14 @@ war + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + + org.springframework.boot spring-boot-maven-plugin From 804f6ab6cb26626ebfbdd5a4eb5527a67933cebb Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 15:24:30 +0100 Subject: [PATCH 03/36] Modernize GitHub Actions workflows Updated CI/CD workflows to modern standards with Java 17+ support. Changes to java.yaml: - Added permissions block (contents: read) - Updated Java version matrix to 17, 21, 25 (all stable, none experimental) - Updated action versions to v4 (checkout, setup-java, upload-artifact) - Added copyright checking job using cicsdev reusable action - Updated Gradle action to gradle/actions/setup-gradle@v4 - Added explicit Gradle version 8.14.4 for CICS Bundle Plugin compatibility - Added work branch (spring-boot-3-modernization) to trigger branches - Removed -Djava.version parameter (now uses centralized property) - Fixed artifact naming for uniqueness - Copyright directory points to -app module for multi-module structure Added cleanup-old-runs.yml: - Automatic cleanup of old workflow runs - 30-day retention with minimum 3 runs - Weekly schedule (Sunday midnight UTC) - Manual trigger support This modernizes CI/CD infrastructure before Spring Boot 3 upgrade. --- .github/workflows/cleanup-old-runs.yml | 24 +++++++++ .github/workflows/java.yaml | 67 ++++++++++++++------------ 2 files changed, 60 insertions(+), 31 deletions(-) create mode 100644 .github/workflows/cleanup-old-runs.yml diff --git a/.github/workflows/cleanup-old-runs.yml b/.github/workflows/cleanup-old-runs.yml new file mode 100644 index 0000000..5528d98 --- /dev/null +++ b/.github/workflows/cleanup-old-runs.yml @@ -0,0 +1,24 @@ +name: Cleanup Old Workflow Runs + +on: + schedule: + - cron: '0 0 * * 0' # Run weekly on Sunday at midnight UTC + workflow_dispatch: # Allow manual triggering + +permissions: + actions: write + contents: read + +jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - name: Delete old workflow runs + uses: Mattraks/delete-workflow-runs@v2 + with: + token: ${{ github.token }} + repository: ${{ github.repository }} + retain_days: 30 + keep_minimum_runs: 3 + +# Made with Bob diff --git a/.github/workflows/java.yaml b/.github/workflows/java.yaml index 6d9baee..f21bc51 100644 --- a/.github/workflows/java.yaml +++ b/.github/workflows/java.yaml @@ -1,85 +1,90 @@ name: Build +permissions: + contents: read + on: push: - branches: ["main"] + branches: ["main", "spring-boot-3-modernization"] pull_request: - branches: ["main"] + branches: ["main", "spring-boot-3-modernization"] schedule: - cron: '0 0 * * *' jobs: + check-copyright: + runs-on: ubuntu-latest + name: Check Copyright + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - id: copyright-action + uses: cicsdev/.github/.github/actions/samples-copyright-checker@4134522d8109169bb8c460db841f94167ec2802f + with: + directory: './cics-java-liberty-springboot-asynchronous-app/' + file-extensions: '*.java' + base-copyright: 'Copyright IBM Corp. 2026' + token: ${{ secrets.GITHUB_TOKEN }} + build-maven: name: Build Maven runs-on: ubuntu-latest - continue-on-error: ${{ matrix.experimental }} strategy: matrix: - jdk: [8, 11] - experimental: [false] - include: - - jdk: 17 - experimental: true + jdk: [17, 21, 25] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.jdk }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ matrix.jdk }} distribution: "semeru" cache: maven - name: Build with Maven - run: mvn --batch-mode --update-snapshots --file pom.xml -Djava.version=${{ matrix.jdk }} package + run: mvn --batch-mode --update-snapshots --file pom.xml package - run: mkdir staging && cp target/*.war staging - uses: actions/upload-artifact@v4 with: - name: cics-java-liberty-sprintboot-asynchronous (Maven, Java ${{ matrix.jdk }}) + name: cics-java-liberty-springboot-asynchronous-maven-java${{ matrix.jdk }} path: staging build-mvnw: name: Build Maven Wrapper runs-on: ubuntu-latest - continue-on-error: ${{ matrix.experimental }} strategy: matrix: - jdk: [8, 11] - experimental: [false] - include: - - jdk: 17 - experimental: true + jdk: [17, 21, 25] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.jdk }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ matrix.jdk }} distribution: "semeru" cache: maven - - name: Build with Maven - run: ./mvnw --batch-mode --update-snapshots --file pom.xml -Djava.version=${{ matrix.jdk }} package + - name: Build with Maven Wrapper + run: ./mvnw --batch-mode --update-snapshots package build-gradle: name: Build Gradle runs-on: ubuntu-latest - continue-on-error: ${{ matrix.experimental }} strategy: matrix: - jdk: [8, 11] - experimental: [false] - include: - - jdk: 17 - experimental: true + jdk: [17, 21, 25] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.jdk }} uses: actions/setup-java@v4 with: java-version: ${{ matrix.jdk }} distribution: 'semeru' - name: Build with Gradle - uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 + uses: gradle/actions/setup-gradle@v4 with: - arguments: bootWar -Pjava_version=${{ matrix.jdk }} + gradle-version: 8.14.4 + - name: Execute Gradle build + run: ./gradlew bootWar From 21c5071b3a00cd8dc8b16abf936ef243a7d17475 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 15:40:33 +0100 Subject: [PATCH 04/36] Update CICS BOM to 6.1-20250812133513-PH63856 - Update BOM version in pom.xml from 5.5 to 6.1 - Update BOM version in build.gradle from 5.5 to 6.1 - Update README documentation with new BOM version - Align comments with JCICS repository standards - BOM now compatible with CICS TS V6.1 with APAR PH63856 --- README.md | 6 +++--- build.gradle | 11 ++++++----- pom.xml | 5 +++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index cd7fba3..7f222ee 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,13 @@ This sample project demonstrates a Spring Boot application running asynchronous ### Check dependencies -Before building this sample, you should verify that the correct CICS TS bill of materials (BOM) is specified for your target release of CICS. The BOM specifies a consistent set of artifacts, and adds information about their scope. In the example below the version specified is compatible with CICS TS V5.5 with JCICS APAR PH25409, or newer. That is, the Java byte codes built by compiling against this version of JCICS will be compatible with later CICS TS versions and subsequent JCICS APARs. +Before building this sample, you should verify that the correct CICS TS bill of materials (BOM) is specified for your target release of CICS. The BOM specifies a consistent set of artifacts, and adds information about their scope. In the example below the version specified is compatible with CICS TS V6.1 with JCICS APAR PH63856, or newer. That is, the Java byte codes built by compiling against this version of JCICS will be compatible with later CICS TS versions and subsequent JCICS APARs. You can browse the published versions of the CICS BOM at [Maven Central.](https://mvnrepository.com/artifact/com.ibm.cics/com.ibm.cics.ts.bom) Gradle (build.gradle): -`compileOnly enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:5.5-20200519131930-PH25409")` +`compileOnly(enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:6.1-20250812133513-PH63856"))` Maven (POM.xml): @@ -36,7 +36,7 @@ Maven (POM.xml): com.ibm.cics com.ibm.cics.ts.bom - 5.5-20200519131930-PH25409 + 6.1-20250812133513-PH63856 pom import diff --git a/build.gradle b/build.gradle index 296a203..faaa2c0 100644 --- a/build.gradle +++ b/build.gradle @@ -48,9 +48,10 @@ dependencies // Don't include TomCat in the runtime build, but do put it in WEB-INF so it can be run standalone a well as embedded providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") - // CICS TS V5.5 Maven BOM (as of 19th May 2020) - compileOnly enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:5.5-20200519131930-PH25409") - - // Don't include JCICS in the final build (no need for version because we have BOM) - compileOnly("com.ibm.cics:com.ibm.cics.server") + // Use correct BOM version for CICS TS (6.1 is the minimum supported release for this sample) + // If you are running on a higher CICS TS version, you may replace this with a newer BOM) + compileOnly(enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:6.1-20250812133513-PH63856")) + + // JCICS API (version inherited from BOM) + compileOnly("com.ibm.cics:com.ibm.cics.server") } diff --git a/pom.xml b/pom.xml index d091128..3e1edba 100644 --- a/pom.xml +++ b/pom.xml @@ -22,13 +22,14 @@ ${java.version} - + + com.ibm.cics com.ibm.cics.ts.bom - 5.5-20200519131930-PH25409 + 6.1-20250812133513-PH63856 pom import From 44d5b80461c589c26fddf7146317ef3db8ff1937 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 16:39:04 +0100 Subject: [PATCH 05/36] Upgrade to Spring Boot 3.5.14 - Update Spring Boot version from 2.7.0 to 3.5.14 in pom.xml - Update Spring Boot version from 2.7.0 to 3.5.14 in build.gradle - Update dependency-management plugin from 1.0.11.RELEASE to 1.1.7 - Add relativePath to parent POM for consistency - Spring Boot 3.x requires Java 17+ and Jakarta EE 10 - No code changes needed (no javax.* imports found) --- build.gradle | 4 ++-- pom.xml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index faaa2c0..ae206f9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'org.springframework.boot' version '2.7.0' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'org.springframework.boot' version '3.5.14' + id 'io.spring.dependency-management' version '1.1.7' id 'java' id 'eclipse' id 'idea' diff --git a/pom.xml b/pom.xml index 3e1edba..74ffcaa 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,8 @@ org.springframework.boot spring-boot-starter-parent - 2.7.0 + 3.5.14 + From 503f3d4ff017bc927ab77495a74c9b4b2706a118 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:15:21 +0100 Subject: [PATCH 06/36] Restructure to multi-module layout - Create parent pom.xml with Spring Boot 3.5.14 parent - Create cics-java-liberty-springboot-asynchronous-app module - Move src/ directory to app module - Update pom.xml to reference parent project - Update build.gradle with proper structure - Add bootWar { enabled = false } configuration - Create cics-java-liberty-springboot-asynchronous-cicsbundle module - Add pom.xml with cics-bundle-maven-plugin - Add build.gradle with com.ibm.cics.bundle plugin - Configure dependency on app module WAR - Update settings.gradle to include both modules - Align with JCICS repository structure and standards --- .../build.gradle | 49 ++++++----- .../pom.xml | 78 +++++++++++++++++ .../springboot/asynchronous/Application.java | 0 .../asynchronous/AsyncExceptionHandler.java | 0 .../springboot/asynchronous/AsyncService.java | 0 .../asynchronous/RESTControllerAsync.java | 0 .../src}/main/webapp/WEB-INF/web.xml | 0 .../build.gradle | 32 +++++++ .../pom.xml | 56 ++++++++++++ pom.xml | 86 +++++++------------ settings.gradle | 11 ++- 11 files changed, 233 insertions(+), 79 deletions(-) rename build.gradle => cics-java-liberty-springboot-asynchronous-app/build.gradle (66%) create mode 100644 cics-java-liberty-springboot-asynchronous-app/pom.xml rename {src => cics-java-liberty-springboot-asynchronous-app/src}/main/java/com/ibm/cicsdev/springboot/asynchronous/Application.java (100%) rename {src => cics-java-liberty-springboot-asynchronous-app/src}/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncExceptionHandler.java (100%) rename {src => cics-java-liberty-springboot-asynchronous-app/src}/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncService.java (100%) rename {src => cics-java-liberty-springboot-asynchronous-app/src}/main/java/com/ibm/cicsdev/springboot/asynchronous/RESTControllerAsync.java (100%) rename {src => cics-java-liberty-springboot-asynchronous-app/src}/main/webapp/WEB-INF/web.xml (100%) create mode 100644 cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle create mode 100644 cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml diff --git a/build.gradle b/cics-java-liberty-springboot-asynchronous-app/build.gradle similarity index 66% rename from build.gradle rename to cics-java-liberty-springboot-asynchronous-app/build.gradle index ae206f9..f8673ad 100644 --- a/build.gradle +++ b/cics-java-liberty-springboot-asynchronous-app/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'org.springframework.boot' version '3.5.14' - id 'io.spring.dependency-management' version '1.1.7' + id 'org.springframework.boot' version '3.5.14' + id 'io.spring.dependency-management' version '1.1.7' id 'java' id 'eclipse' id 'idea' @@ -9,45 +9,47 @@ plugins } group = 'com.ibm.cicsdev.springboot' -archivesBaseName='cics-java-liberty-springboot-asynchronous' version = '0.1.0' - -// If in Eclipse, add Javadoc to the local project classpath -eclipse +base { - classpath - { - downloadJavadoc = true - } + archivesName = "cics-java-liberty-springboot-asynchronous" } -repositories +java { - mavenCentral() + toolchain + { + languageVersion = JavaLanguageVersion.of(java_version) + } } - -java +// If in Eclipse, add Javadoc to the local project classpath +eclipse { - toolchain + classpath { - languageVersion = JavaLanguageVersion.of(java_version) - vendor = JvmVendorSpec.IBM - implementation = JvmImplementation.J9 + downloadJavadoc = true } } +repositories +{ + mavenCentral() -dependencies +} + + +dependencies { + // Spring Boot web starter for building REST/HTTP endpoints implementation("org.springframework.boot:spring-boot-starter-web") - - // Don't include TomCat in the runtime build, but do put it in WEB-INF so it can be run standalone a well as embedded + + // Tomcat provided by CICS Liberty at runtime providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") - + // Use correct BOM version for CICS TS (6.1 is the minimum supported release for this sample) // If you are running on a higher CICS TS version, you may replace this with a newer BOM) compileOnly(enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:6.1-20250812133513-PH63856")) @@ -55,3 +57,6 @@ dependencies // JCICS API (version inherited from BOM) compileOnly("com.ibm.cics:com.ibm.cics.server") } + +//Don't generate a FAT bootWar, we don't need to run standalone +bootWar { enabled = false } diff --git a/cics-java-liberty-springboot-asynchronous-app/pom.xml b/cics-java-liberty-springboot-asynchronous-app/pom.xml new file mode 100644 index 0000000..2d53aad --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + + + + + com.ibm.cicsdev.springboot + cics-java-liberty-springboot-asynchronous + 0.1.0 + + + + + + cics-java-liberty-springboot-asynchronous-app + war + CICS Asynchronous Springboot - Application + + + true + + + + + + + + com.ibm.cics + com.ibm.cics.ts.bom + 6.1-20250812133513-PH63856 + pom + import + + + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.ibm.cics + com.ibm.cics.server + + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + + + + + cics-java-liberty-springboot-asynchronous + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/ibm/cicsdev/springboot/asynchronous/Application.java b/cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/Application.java similarity index 100% rename from src/main/java/com/ibm/cicsdev/springboot/asynchronous/Application.java rename to cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/Application.java diff --git a/src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncExceptionHandler.java b/cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncExceptionHandler.java similarity index 100% rename from src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncExceptionHandler.java rename to cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncExceptionHandler.java diff --git a/src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncService.java b/cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncService.java similarity index 100% rename from src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncService.java rename to cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/AsyncService.java diff --git a/src/main/java/com/ibm/cicsdev/springboot/asynchronous/RESTControllerAsync.java b/cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/RESTControllerAsync.java similarity index 100% rename from src/main/java/com/ibm/cicsdev/springboot/asynchronous/RESTControllerAsync.java rename to cics-java-liberty-springboot-asynchronous-app/src/main/java/com/ibm/cicsdev/springboot/asynchronous/RESTControllerAsync.java diff --git a/src/main/webapp/WEB-INF/web.xml b/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from src/main/webapp/WEB-INF/web.xml rename to cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle b/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle new file mode 100644 index 0000000..e34e350 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle @@ -0,0 +1,32 @@ +// ============================================================================ +// Plugins +// ============================================================================ +plugins +{ + id 'com.ibm.cics.bundle' version '1.0.8' +} + +// ============================================================================ +// Project Information +// ============================================================================ +description = 'CICS Asynchronous Springboot Application - CICS Bundle' +version = '0.1.0' + +// ============================================================================ +// Dependencies +// ============================================================================ +dependencies +{ + // Application WAR from sibling project + cicsBundlePart project(path: ':cics-java-liberty-springboot-asynchronous-app', configuration: 'archives') +} + +cicsBundle +{ + build + { + defaultJVMServer = project.findProperty("cics.jvmserver") ?: "DFHWLP" + } +} + +// Made with Bob diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml new file mode 100644 index 0000000..cd10b11 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + + + + + com.ibm.cicsdev.springboot + cics-java-liberty-springboot-asynchronous + 0.1.0 + + + + + + cics-java-liberty-springboot-asynchronous-cicsbundle + cics-bundle + CICS Asynchronous Springboot - CICS Bundle + + + + + + + + ${project.groupId} + cics-java-liberty-springboot-asynchronous-app + ${project.version} + war + + + + + + + + + + + com.ibm.cics + cics-bundle-maven-plugin + 1.0.8 + true + + ${cics.jvmserver} + + + + + + + + diff --git a/pom.xml b/pom.xml index 74ffcaa..6179611 100644 --- a/pom.xml +++ b/pom.xml @@ -9,72 +9,46 @@ 3.5.14 - + com.ibm.cicsdev.springboot cics-java-liberty-springboot-asynchronous 0.1.0 - cics-java-liberty-springboot-asynchronous - Demo project for Spring Boot + pom + Demo project for Spring Boot Asynchronous + 17 UTF-8 ${java.version} ${java.version} + DFHWLP - - - - - - - com.ibm.cics - com.ibm.cics.ts.bom - 6.1-20250812133513-PH63856 - pom - import - - - - - - - - com.ibm.cics - com.ibm.cics.server - - - - org.springframework.boot - spring-boot-starter-web - - - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - - - war - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + + cics-java-liberty-springboot-asynchronous-app + cics-java-liberty-springboot-asynchronous-cicsbundle + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + + + + + + diff --git a/settings.gradle b/settings.gradle index 0bfcef1..834641f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,10 @@ -rootProject.name = 'com.ibm.cicsdev.springboot.asynchronous' +// ============================================================================ +// Root Project Configuration +// ============================================================================ +rootProject.name = 'cics-java-liberty-springboot-asynchronous' + +// ============================================================================ +// Subprojects +// ============================================================================ +include(':cics-java-liberty-springboot-asynchronous-app') +include(':cics-java-liberty-springboot-asynchronous-cicsbundle') From 5ff1ea9b7b502a5d4d7e847c5dcc46dc214e999d Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:20:51 +0100 Subject: [PATCH 07/36] Add Eclipse configuration files - Add Gradle Buildship configuration - Add Web module component configuration with context-root - Add project facets for Java 17 and Web 2.4 - Aligns with JCICS repository structure --- .../.settings/org.eclipse.buildship.core.prefs | 13 +++++++++++++ .../.settings/org.eclipse.wst.common.component | 9 +++++++++ .../org.eclipse.wst.common.project.facet.core.xml | 8 ++++++++ 3 files changed, 30 insertions(+) create mode 100644 cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs create mode 100644 cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component create mode 100644 cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..60b1463 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=false +show.console.view=false +show.executions.view=false \ No newline at end of file diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..ee4aada --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..a299bfd --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,8 @@ + + + + + + + + From 552773f080e36393f84282f8e947510f74cd29ad Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:24:28 +0100 Subject: [PATCH 08/36] Update README for Spring Boot 3 accuracy - Update CICS TS requirement from V5.6 to V6.1 (Spring Boot 3 requires Jakarta EE 10) - Update servlet feature from servlet-3.1/4.0 to servlet-6.0 (Jakarta EE 10 requirement) - Update concurrent feature from concurrent-1.0 to concurrent-3.0 - Update build commands for multi-module structure (clean build instead of clean bootWar) - Update output paths to reflect multi-module structure (app/build/libs and app/target) - Remove outdated servlet-4.0 compatibility note --- README.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7f222ee..7224d97 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This sample project demonstrates a Spring Boot application running asynchronous ## Prerequisites - - CICS TS V5.6 or later (required for Java 17 support) + - CICS TS V6.1 or later (required for Spring Boot 3.x and Jakarta EE 10 support) - A configured Liberty JVM server in CICS - Java SE 17 or later on the workstation - An Eclipse development environment on the workstation (optional) @@ -52,7 +52,7 @@ On the command line, you simply swap the Gradle or Maven command for the wrapper For an IDE, taking Eclipse as an example, the plug-ins for Gradle *buildship* and Maven *m2e* will integrate with the "Run As..." capability, allowing you to specify whether you want to build the project with a Wrapper, or a specific version of your chosen build tool. -The required build-tasks are typically `clean bootWar` for Gradle and `clean package` for Maven. Once run, Gradle will generate a WAR file in the `build/libs` directory, while Maven will generate it in the `target` directory. +The required build-tasks are typically `clean build` for Gradle and `clean package` for Maven. Once run, Gradle will generate a WAR file in the `cics-java-liberty-springboot-asynchronous-app/build/libs` directory, while Maven will generate it in the `cics-java-liberty-springboot-asynchronous-app/target` directory. **Note:** When building a WAR file for deployment to Liberty it is good practice to exclude Tomcat from the final runtime artifact. We demonstrate this in the pom.xml with the *provided* scope, and in build.gradle with the *providedRuntime()* dependency. @@ -67,16 +67,16 @@ Run the following in a local command prompt: On Linux or Mac: ```shell -./gradlew clean bootWar +./gradlew clean build ``` On Windows: ```shell -gradlew.bat clean bootWar +gradlew.bat clean build ``` -This creates a WAR file inside the `build/libs` directory. +This creates a WAR file inside the `cics-java-liberty-springboot-asynchronous-app/build/libs` directory. ### Maven Wrapper (command line) @@ -94,18 +94,16 @@ On Windows: mvnw.cmd clean package ``` -This creates a WAR file inside the `target` directory. +This creates a WAR file inside the `cics-java-liberty-springboot-asynchronous-app/target` directory. ## Deploying to a CICS Liberty JVM server Ensure you have the following features defined in your Liberty `server.xml`: -- `servlet-3.1` or `servlet-4.0` depending on the version of Java EE in use. -- `concurrent-1.0`. +- `servlet-6.0` (required for Spring Boot 3.x and Jakarta EE 10) +- `concurrent-3.0` - `cicsts:security-1.0` if CICS security is enabled. A template `server.xml` is provided [here](./etc/config/liberty/server.xml). - -> **Note:** `servlet-4.0` will only work for CICS TS V5.5 or later ### Deploying with CICS bundles 1. Copy and paste the built WAR from your *target* or *build/libs* directory into a Eclipse CICS bundle project. From b8cf0b8d4d6072fedb55b3ec883d176e3c1055c1 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:31:40 +0100 Subject: [PATCH 09/36] Update Liberty server.xml for Spring Boot 3 - Update servlet feature from servlet-3.1 to servlet-6.0 (Jakarta EE 10) - Update concurrent feature from concurrent-1.0 to concurrent-3.0 - Aligns with Spring Boot 3.x requirements and README documentation --- etc/config/liberty/server.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/config/liberty/server.xml b/etc/config/liberty/server.xml index eb16f8d..1e2ed2a 100644 --- a/etc/config/liberty/server.xml +++ b/etc/config/liberty/server.xml @@ -4,8 +4,8 @@ cicsts:core-1.0 - servlet-3.1 - concurrent-1.0 + servlet-6.0 + concurrent-3.0 From 4d671985ce056b4a40627615c7a41b767d961de1 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:40:28 +0100 Subject: [PATCH 10/36] Fix root Eclipse configuration for multi-module project - Update .gitignore to use directory patterns instead of root-level patterns - Ensures build artifacts in sub-modules are properly ignored - Adds *.war and *.jar patterns for artifact exclusion - Update root .classpath to reference JavaSE-17 (was JavaSE-1.8) - Simplify root .classpath to minimal structure for parent POM - Remove source folder references (source is in child modules) - Aligns with multi-module Eclipse configuration standards Fixes three critical issues identified in validation against Agents_CONSOLIDATED.md --- .classpath | 7 +++---- .gitignore | 10 ++++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.classpath b/.classpath index e0bda94..cb43ed6 100644 --- a/.classpath +++ b/.classpath @@ -1,11 +1,10 @@ - + - - + - + diff --git a/.gitignore b/.gitignore index f96e0f8..80afe75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ -/.gradle/ -/target/ -/build/ -/bin/ +.gradle/ +target/ +build/ +bin/ +*.war +*.jar From 6bbd26d329e031abab66ea40354ce67d9d814189 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:54:37 +0100 Subject: [PATCH 11/36] Fix Eclipse Project --- .settings/org.eclipse.core.resources.prefs | 2 ++ .settings/org.eclipse.jdt.core.prefs | 9 +++++++++ .settings/org.eclipse.wst.common.project.facet.core.xml | 8 ++++---- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..62ef348 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml index cea524a..0b217ec 100644 --- a/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,7 +1,7 @@ - - - - + + + + From c568705a5f35cdbca4906ad17b27bcb430d17c6f Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 17:59:32 +0100 Subject: [PATCH 12/36] Add root Eclipse settings and fix Gradle wrapper version - Add .settings/org.eclipse.core.resources.prefs for UTF-8 encoding - Add .settings/org.eclipse.jdt.core.prefs for Java 17 compiler settings - Update .settings/org.eclipse.wst.common.project.facet.core.xml to Java 17 - Fix Gradle wrapper from 7.5-rc-1 to 8.14.4 (required for Java 25 support) These changes eliminate Eclipse warnings and ensure compatibility with modern Java versions. --- gradle/wrapper/gradle-wrapper.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fcfb29d..b068af1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists + +# Made with Bob From ce32f53cbd10cbe37caf80ab7e29c3e9f94f5534 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 18:07:10 +0100 Subject: [PATCH 13/36] chore: update Maven wrapper to 3.9.9 - Upgrade from Maven 3.8.5 to 3.9.9 for better Java 21/25 support - Update wrapper JAR and scripts to version 3.3.4 - Ensures compatibility with Java 17+ and future-proofs the build --- .mvn/wrapper/maven-wrapper.jar | Bin 59925 -> 63093 bytes .mvn/wrapper/maven-wrapper.properties | 22 +- mvnw | 362 +++++++++++++----------- mvnw.cmd | 388 ++++++++++++++------------ 4 files changed, 405 insertions(+), 367 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index bf82ff01c6cdae4a1bb754a6e062954d77ac5c11..eebc3c18b4e0bce4a2a9e66be24c4a410f17a1fa 100644 GIT binary patch delta 53319 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 RIc0m;j-SEdx?oZi^MB**xrhJ& delta 50295 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 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 687668b..fc26f08 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,18 +1,4 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar +wrapperVersion=3.3.4 +distributionType=bin +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar diff --git a/mvnw b/mvnw index 41c0f0c..1ddd97b 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script +# Apache Maven Wrapper startup batch script, version 3.3.4 # # Required ENV vars: # ------------------ @@ -27,284 +27,312 @@ # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir # MAVEN_OPTS - parameters passed to the Java VM when running Maven # e.g. to debug Maven itself, use # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 # MAVEN_SKIP_RC - flag to disable loading of mavenrc files # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then +if [ -z "$MAVEN_SKIP_RC" ]; then - if [ -f /etc/mavenrc ] ; then + if [ -f /usr/local/etc/mavenrc ]; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ]; then . /etc/mavenrc fi - if [ -f "$HOME/.mavenrc" ] ; then + if [ -f "$HOME/.mavenrc" ]; then . "$HOME/.mavenrc" fi fi # OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; +cygwin=false +darwin=false mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi +case "$(uname)" in +CYGWIN*) cygwin=true ;; +MINGW*) mingw=true ;; +Darwin*) + darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="$(/usr/libexec/java_home)" + export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home" + export JAVA_HOME fi - ;; + fi + ;; esac -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` +if [ -z "$JAVA_HOME" ]; then + if [ -r /etc/gentoo-release ]; then + JAVA_HOME=$(java-config --jre-home) fi fi -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - # For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +if $cygwin; then + [ -n "$JAVA_HOME" ] \ + && JAVA_HOME=$(cygpath --unix "$JAVA_HOME") + [ -n "$CLASSPATH" ] \ + && CLASSPATH=$(cygpath --path --unix "$CLASSPATH") fi # For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +if $mingw; then + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] \ + && JAVA_HOME="$( + cd "$JAVA_HOME" || ( + echo "cannot cd into $JAVA_HOME." >&2 + exit 1 + ) + pwd + )" fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "$javaExecutable" : '\([^ ]*\)')" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then + if $darwin; then + javaHome="$(dirname "$javaExecutable")" + javaExecutable="$(cd "$javaHome" && pwd -P)/javac" else - javaExecutable="`readlink -f \"$javaExecutable\"`" + javaExecutable="$(readlink -f "$javaExecutable")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + javaHome="$(dirname "$javaExecutable")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') JAVA_HOME="$javaHome" export JAVA_HOME fi fi fi -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="$( + \unset -f command 2>/dev/null + \command -v java + )" fi fi -if [ ! -x "$JAVACMD" ] ; then +if [ ! -x "$JAVACMD" ]; then echo "Error: JAVA_HOME is not defined correctly." >&2 echo " We cannot execute $JAVACMD" >&2 exit 1 fi -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +if [ -z "$JAVA_HOME" ]; then + echo "Warning: JAVA_HOME environment variable is not set." >&2 fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" + if [ -z "$1" ]; then + echo "Path not specified to find_maven_basedir" >&2 return 1 fi basedir="$1" wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then basedir=$wdir break fi # workaround for JBEAP-8937 (on Solaris 10/Sparc) if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + wdir=$( + cd "$wdir/.." || exit 1 + pwd + ) fi # end of workaround done - echo "${basedir}" + printf '%s' "$( + cd "$basedir" || exit 1 + pwd + )" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' <"$1" fi } -BASE_DIR=`find_maven_basedir "$(pwd)"` +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") if [ -z "$BASE_DIR" ]; then - exit 1; + exit 1 fi +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. ########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" + fi + while IFS="=" read -r key value; do + case "$key" in wrapperUrl) + wrapperUrl=$(trim "${value-}") + break + ;; + esac + done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") + fi + + if command -v wget >/dev/null; then + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget ${QUIET:+"$QUIET"} "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + wget ${QUIET:+"$QUIET"} --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" + elif command -v curl >/dev/null; then + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl ${QUIET:+"$QUIET"} -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl ${QUIET:+"$QUIET"} --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + else + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" + fi fi + fi fi ########################################################################################## # End of extension ########################################################################################## -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in wrapperSha256Sum) + wrapperSha256Sum=$(trim "${value-}") + break + ;; + esac +done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum >/dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c - >/dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c >/dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi fi + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" # For Cygwin, switch paths to Windows format before running java if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` + [ -n "$JAVA_HOME" ] \ + && JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") + [ -n "$CLASSPATH" ] \ + && CLASSPATH=$(cygpath --path --windows "$CLASSPATH") + [ -n "$MAVEN_PROJECTBASEDIR" ] \ + && MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") fi # Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +# shellcheck disable=SC2086 # safe args exec "$JAVACMD" \ $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 8611571..c453424 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,182 +1,206 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.4 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. >&2 +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. >&2 +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. >&2 +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. >&2 +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash;"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Error 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% From 246d9ace692ddabbe57c14a5e7b9ea0ac700607e Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 18:16:14 +0100 Subject: [PATCH 14/36] Update gradle-wrapper.properties --- gradle/wrapper/gradle-wrapper.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b068af1..03b32a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,5 +3,3 @@ distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists - -# Made with Bob From f7b3d4c820e13841ca2fba7c8c8aff543477dfba Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 18:17:16 +0100 Subject: [PATCH 15/36] chore: regenerate Gradle wrapper JAR for 8.14.4 - Update gradle-wrapper.jar to match 8.14.4 version - Regenerate wrapper scripts (gradlew, gradlew.bat) - Ensures wrapper JAR is properly versioned and committed --- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 4 +-- gradlew | 41 ++++++++++++++--------- gradlew.bat | 27 ++++++++------- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch literal 43764 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 /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -133,22 +133,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,16 +200,20 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 53a6b23..5eed7ee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -26,6 +28,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -42,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From 82cab10193b47de1a14698628e858e8664f5df67 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 18:47:23 +0100 Subject: [PATCH 16/36] feat: add complete 4-way build matrix and run on all PRs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add build-gradlew job to test Gradle wrapper separately - Update build-gradle to use direct Gradle installation (not wrapper) - Complete 4-way matrix: Gradle, Gradlew, Maven, Mvnw - Each build tool tested against Java 17, 21, 25 - Total: 12 build jobs (4 tools × 3 Java versions) - Update triggers: run on ALL pull requests (branches: **), not just specific branches - Ensures all PRs are validated before merge, regardless of target branch --- .github/workflows/java.yaml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/.github/workflows/java.yaml b/.github/workflows/java.yaml index f21bc51..7695afd 100644 --- a/.github/workflows/java.yaml +++ b/.github/workflows/java.yaml @@ -5,9 +5,9 @@ permissions: on: push: - branches: ["main", "spring-boot-3-modernization"] + branches: ["main"] pull_request: - branches: ["main", "spring-boot-3-modernization"] + branches: ["**"] schedule: - cron: '0 0 * * *' @@ -87,4 +87,21 @@ jobs: with: gradle-version: 8.14.4 - name: Execute Gradle build + run: gradle bootWar + + build-gradlew: + name: Build Gradle Wrapper + + runs-on: ubuntu-latest + strategy: + matrix: + jdk: [17, 21, 25] + steps: + - uses: actions/checkout@v4 + - name: Set up JDK ${{ matrix.jdk }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.jdk }} + distribution: 'semeru' + - name: Build with Gradle Wrapper run: ./gradlew bootWar From 82325134cf716446a345c9016c8d079618b32a8c Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 19:04:42 +0100 Subject: [PATCH 17/36] fix: standardize workflow triggers to target main branch only - Changed pull_request trigger from branches: ["**"] to ["main"] - Aligns with standard pattern where all PRs target main branch - Work branch was temporary exception, now standardizing across all repos --- .github/workflows/java.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/java.yaml b/.github/workflows/java.yaml index 7695afd..02bfffb 100644 --- a/.github/workflows/java.yaml +++ b/.github/workflows/java.yaml @@ -7,7 +7,7 @@ on: push: branches: ["main"] pull_request: - branches: ["**"] + branches: ["main"] schedule: - cron: '0 0 * * *' From 8d2b32604c5971eb1720506354e0f19eebd747a6 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 8 Jun 2026 23:23:13 +0100 Subject: [PATCH 18/36] refactor: rename workflow file to build.yaml - Renamed .github/workflows/java.yaml to build.yaml - Aligns filename with workflow name 'Build' - More descriptive of workflow's actual purpose (build and test) - Standardizes naming convention across CICS sample repositories --- .github/workflows/{java.yaml => build.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{java.yaml => build.yaml} (100%) diff --git a/.github/workflows/java.yaml b/.github/workflows/build.yaml similarity index 100% rename from .github/workflows/java.yaml rename to .github/workflows/build.yaml From 3c38b5aad1162694818e4091d3f459f55eeade15 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Tue, 9 Jun 2026 00:00:03 +0100 Subject: [PATCH 19/36] chore: remove attribution comments --- .github/workflows/cleanup-old-runs.yml | 1 - .../build.gradle | 1 - cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml | 1 - pom.xml | 1 - 4 files changed, 4 deletions(-) diff --git a/.github/workflows/cleanup-old-runs.yml b/.github/workflows/cleanup-old-runs.yml index 5528d98..31fcd3e 100644 --- a/.github/workflows/cleanup-old-runs.yml +++ b/.github/workflows/cleanup-old-runs.yml @@ -21,4 +21,3 @@ jobs: retain_days: 30 keep_minimum_runs: 3 -# Made with Bob diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle b/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle index e34e350..e3a54a1 100644 --- a/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle @@ -29,4 +29,3 @@ cicsBundle } } -// Made with Bob diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml index cd10b11..86e97ae 100644 --- a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml @@ -53,4 +53,3 @@ - diff --git a/pom.xml b/pom.xml index 6179611..a6e6300 100644 --- a/pom.xml +++ b/pom.xml @@ -51,4 +51,3 @@ - From 8b9fedf3f50970b2f1c1ef4f80ea85e1eaf0b07e Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Tue, 9 Jun 2026 00:44:36 +0100 Subject: [PATCH 20/36] fix: update build badge to reference build.yaml workflow --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7224d97..125ff19 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # cics-java-liberty-springboot-asynchronous -[![Build](https://github.com/cicsdev/cics-java-liberty-springboot-asynchronous/actions/workflows/java.yaml/badge.svg)](https://github.com/cicsdev/cics-java-liberty-springboot-asynchronous/actions/workflows/java.yaml) +[![Build](https://github.com/cicsdev/cics-java-liberty-springboot-asynchronous/actions/workflows/build.yaml/badge.svg)](https://github.com/cicsdev/cics-java-liberty-springboot-asynchronous/actions/workflows/build.yaml) This sample project demonstrates a Spring Boot application running asynchronous operations on CICS-enabled threads. It is intended for deployment inside an IBM CICS Liberty JVM server. From 676bc1062cb6938ffa8365f35310017c265b0825 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 12 Jun 2026 16:27:48 +0100 Subject: [PATCH 21/36] Fix build commands to follow best practices - Change Maven commands from 'package' to 'verify' for comprehensive validation - Add 'clean' prefix to all Gradle commands for reproducible builds - Updated README.md documentation - Updated GitHub Actions workflow (build.yaml) These changes align with CICS sample repository standards: - Maven 'verify' runs integration tests that 'package' skips - Gradle 'clean' ensures no stale artifacts affect builds --- .github/workflows/build.yaml | 8 ++++---- README.md | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 02bfffb..1138f0a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -43,7 +43,7 @@ jobs: distribution: "semeru" cache: maven - name: Build with Maven - run: mvn --batch-mode --update-snapshots --file pom.xml package + run: mvn --batch-mode --update-snapshots --file pom.xml verify - run: mkdir staging && cp target/*.war staging - uses: actions/upload-artifact@v4 with: @@ -66,7 +66,7 @@ jobs: distribution: "semeru" cache: maven - name: Build with Maven Wrapper - run: ./mvnw --batch-mode --update-snapshots package + run: ./mvnw --batch-mode --update-snapshots verify build-gradle: name: Build Gradle @@ -87,7 +87,7 @@ jobs: with: gradle-version: 8.14.4 - name: Execute Gradle build - run: gradle bootWar + run: gradle clean bootWar build-gradlew: name: Build Gradle Wrapper @@ -104,4 +104,4 @@ jobs: java-version: ${{ matrix.jdk }} distribution: 'semeru' - name: Build with Gradle Wrapper - run: ./gradlew bootWar + run: ./gradlew clean bootWar diff --git a/README.md b/README.md index 125ff19..eb35e53 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ On the command line, you simply swap the Gradle or Maven command for the wrapper For an IDE, taking Eclipse as an example, the plug-ins for Gradle *buildship* and Maven *m2e* will integrate with the "Run As..." capability, allowing you to specify whether you want to build the project with a Wrapper, or a specific version of your chosen build tool. -The required build-tasks are typically `clean build` for Gradle and `clean package` for Maven. Once run, Gradle will generate a WAR file in the `cics-java-liberty-springboot-asynchronous-app/build/libs` directory, while Maven will generate it in the `cics-java-liberty-springboot-asynchronous-app/target` directory. +The required build-tasks are typically `clean build` for Gradle and `clean verify` for Maven. Once run, Gradle will generate a WAR file in the `cics-java-liberty-springboot-asynchronous-app/build/libs` directory, while Maven will generate it in the `cics-java-liberty-springboot-asynchronous-app/target` directory. **Note:** When building a WAR file for deployment to Liberty it is good practice to exclude Tomcat from the final runtime artifact. We demonstrate this in the pom.xml with the *provided* scope, and in build.gradle with the *providedRuntime()* dependency. @@ -85,13 +85,13 @@ Run the following in a local command prompt: On Linux or Mac: ```shell -./mvnw clean package +./mvnw clean verify ``` On Windows: ```shell -mvnw.cmd clean package +mvnw.cmd clean verify ``` This creates a WAR file inside the `cics-java-liberty-springboot-asynchronous-app/target` directory. From 6e733805f6621f84213041a45cbfccb23acdc13d Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 12 Jun 2026 16:55:44 +0100 Subject: [PATCH 22/36] Update Eclipse project configuration and README - Update project name in .project to match repository name - Reorder build commands in .project for consistency - Update .settings/org.eclipse.wst.common.component configuration - Clarify README wording: 'CICS bundles' -> 'CICS Bundle Project' --- .project | 10 +++++----- .settings/org.eclipse.wst.common.component | 19 ++++++++++++------- README.md | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.project b/.project index 63cf886..9541560 100644 --- a/.project +++ b/.project @@ -1,27 +1,27 @@ - com.ibm.cicsdev.springboot.asynchronous + cics-java-liberty-springboot-asynchronous - org.eclipse.jdt.core.javabuilder + org.eclipse.buildship.core.gradleprojectbuilder - org.eclipse.wst.common.project.facet.core.builder + org.eclipse.jdt.core.javabuilder - org.eclipse.wst.validation.validationbuilder + org.eclipse.wst.common.project.facet.core.builder - org.eclipse.buildship.core.gradleprojectbuilder + org.eclipse.wst.validation.validationbuilder diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component index 85aa12a..727bded 100644 --- a/.settings/org.eclipse.wst.common.component +++ b/.settings/org.eclipse.wst.common.component @@ -1,8 +1,13 @@ - - - - - - - + + + + + + + + + + + + diff --git a/README.md b/README.md index eb35e53..780903b 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Ensure you have the following features defined in your Liberty `server.xml`: A template `server.xml` is provided [here](./etc/config/liberty/server.xml). -### Deploying with CICS bundles +### Deploying with a CICS Bundle Project 1. Copy and paste the built WAR from your *target* or *build/libs* directory into a Eclipse CICS bundle project. 2. Create a new WAR bundlepart that references the WAR file. 3. Deploy the CICS bundle project from CICS Explorer using the **Export Bundle Project to z/OS UNIX File System** wizard. From bcd903264e6e6ee43b2aab04dcf824921d6a7a95 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Tue, 16 Jun 2026 15:32:15 +0100 Subject: [PATCH 23/36] Add Eclipse project files for submodules - Add .classpath and .project for app submodule - Add .project for cicsbundle submodule - Update buildship settings to reference parent project - Ensures clean Eclipse import without manual refresh --- .settings/org.eclipse.buildship.core.prefs | 11 ++++++ .../.classpath | 17 +++++++++ .../.project | 36 +++++++++++++++++++ .../org.eclipse.buildship.core.prefs | 4 +-- .../.settings/org.eclipse.jdt.core.prefs | 4 +++ .../org.eclipse.wst.common.component | 1 - ....eclipse.wst.common.project.facet.core.xml | 1 - .../.project | 17 +++++++++ .../org.eclipse.buildship.core.prefs | 2 ++ 9 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 cics-java-liberty-springboot-asynchronous-app/.classpath create mode 100644 cics-java-liberty-springboot-asynchronous-app/.project create mode 100644 cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs create mode 100644 cics-java-liberty-springboot-asynchronous-cicsbundle/.project create mode 100644 cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.buildship.core.prefs diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs index e889521..e479558 100644 --- a/.settings/org.eclipse.buildship.core.prefs +++ b/.settings/org.eclipse.buildship.core.prefs @@ -1,2 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) connection.project.dir= eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=false +show.console.view=false +show.executions.view=false diff --git a/cics-java-liberty-springboot-asynchronous-app/.classpath b/cics-java-liberty-springboot-asynchronous-app/.classpath new file mode 100644 index 0000000..166d3b5 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.classpath @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/cics-java-liberty-springboot-asynchronous-app/.project b/cics-java-liberty-springboot-asynchronous-app/.project new file mode 100644 index 0000000..f135340 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.project @@ -0,0 +1,36 @@ + + + cics-java-liberty-springboot-asynchronous-app + Project cics-java-liberty-springboot-asynchronous-app created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs index 60b1463..258eb47 100644 --- a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.buildship.core.prefs @@ -2,7 +2,7 @@ arguments= auto.sync=false build.scans.enabled=false connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= +connection.project.dir=.. eclipse.preferences.version=1 gradle.user.home= java.home= @@ -10,4 +10,4 @@ jvm.arguments= offline.mode=false override.workspace.settings=false show.console.view=false -show.executions.view=false \ No newline at end of file +show.executions.view=false diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..626e0e1 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.source=17 diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component index ee4aada..a3a0305 100644 --- a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.component @@ -6,4 +6,3 @@ - diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml index a299bfd..7859c6b 100644 --- a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -5,4 +5,3 @@ - diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/.project b/cics-java-liberty-springboot-asynchronous-cicsbundle/.project new file mode 100644 index 0000000..699ab05 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/.project @@ -0,0 +1,17 @@ + + + cics-java-liberty-springboot-asynchronous-cicsbundle + Project cics-java-liberty-springboot-asynchronous-cicsbundle created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.buildship.core.prefs b/cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..b1886ad --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=.. +eclipse.preferences.version=1 From d05b81cc901fbefcc93c3cbabd4122db4102ac6b Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Tue, 16 Jun 2026 15:36:30 +0100 Subject: [PATCH 24/36] Remove outdated IDE refresh note from README Eclipse project files are now committed, so no manual refresh needed --- README.md | 4 ---- .../.classpath | 11 +++++------ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 780903b..208bea7 100644 --- a/README.md +++ b/README.md @@ -56,10 +56,6 @@ The required build-tasks are typically `clean build` for Gradle and `clean verif **Note:** When building a WAR file for deployment to Liberty it is good practice to exclude Tomcat from the final runtime artifact. We demonstrate this in the pom.xml with the *provided* scope, and in build.gradle with the *providedRuntime()* dependency. -**Note:** If you import the project to your IDE, you might experience local project compile errors. To resolve these errors you should run a tooling refresh on that project. For example, in Eclipse: right-click on "Project", select "Gradle -> Refresh Gradle Project", **or** right-click on "Project", select "Maven -> Update Project...". - ->Tip: *In Eclipse, Gradle (buildship) is able to fully refresh and resolve the local classpath even if the project was previously updated by Maven. However, Maven (m2e) does not currently reciprocate that capability. If you previously refreshed the project with Gradle, you'll need to manually remove the 'Project Dependencies' entry on the Java build-path of your Project Properties to avoid duplication errors when performing a Maven Project Update.* - ### Gradle Wrapper (command line) Run the following in a local command prompt: diff --git a/cics-java-liberty-springboot-asynchronous-app/.classpath b/cics-java-liberty-springboot-asynchronous-app/.classpath index 166d3b5..a0cd34f 100644 --- a/cics-java-liberty-springboot-asynchronous-app/.classpath +++ b/cics-java-liberty-springboot-asynchronous-app/.classpath @@ -1,11 +1,5 @@ - - - - - - @@ -13,5 +7,10 @@ + + + + + From d5f51515b71e40876678de7bd78ac12ebf4abbf5 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 22 Jun 2026 22:13:46 +0100 Subject: [PATCH 25/36] Fix Agents.md compliance issues - Update web.xml to Jakarta EE 10 / servlet 6.0 (required for Spring Boot 3.x) - Fix .gitignore patterns to use recursive matching (**/target/, **/build/) - Add missing Eclipse configuration file (org.eclipse.core.resources.prefs) - Remove artifact upload from GitHub workflow (samples should only compile/test) - Restructure README.md to follow standard format from cics-java-liberty-springboot-jcics - Add License badge - Add Key Features section - Improve Requirements section with clear workstation/z/OS split - Standardize deployment method names (Method 1/2/3) - Add proper section separators - Update Contributing section with link to guidelines --- .github/workflows/build.yaml | 5 - .gitignore | 4 +- README.md | 258 +++++++++++++----- .../org.eclipse.core.resources.prefs | 2 + .../src/main/webapp/WEB-INF/web.xml | 9 +- 5 files changed, 203 insertions(+), 75 deletions(-) create mode 100644 cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.core.resources.prefs diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1138f0a..33cd330 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -44,11 +44,6 @@ jobs: cache: maven - name: Build with Maven run: mvn --batch-mode --update-snapshots --file pom.xml verify - - run: mkdir staging && cp target/*.war staging - - uses: actions/upload-artifact@v4 - with: - name: cics-java-liberty-springboot-asynchronous-maven-java${{ matrix.jdk }} - path: staging build-mvnw: name: Build Maven Wrapper diff --git a/.gitignore b/.gitignore index 80afe75..4f93d53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .gradle/ -target/ -build/ +**/target/ +**/build/ bin/ *.war *.jar diff --git a/README.md b/README.md index 208bea7..9d428a3 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,57 @@ # cics-java-liberty-springboot-asynchronous [![Build](https://github.com/cicsdev/cics-java-liberty-springboot-asynchronous/actions/workflows/build.yaml/badge.svg)](https://github.com/cicsdev/cics-java-liberty-springboot-asynchronous/actions/workflows/build.yaml) +[![License](https://img.shields.io/badge/License-EPL%202.0-red.svg)](https://www.eclipse.org/legal/epl-2.0/) -This sample project demonstrates a Spring Boot application running asynchronous operations on CICS-enabled threads. It is intended for deployment inside an IBM CICS Liberty JVM server. +## Overview -## Prerequisites +This sample provides a Spring Boot application that demonstrates asynchronous operations running on CICS-enabled threads. The sample shows how to use Spring's `@Async` annotation to execute methods asynchronously while maintaining CICS transaction context, making it ideal for deployment inside an IBM CICS Liberty JVM server. - - CICS TS V6.1 or later (required for Spring Boot 3.x and Jakarta EE 10 support) - - A configured Liberty JVM server in CICS - - Java SE 17 or later on the workstation - - An Eclipse development environment on the workstation (optional) - - Either Gradle or Apache Maven on the workstation (optional if using Wrappers) +## Key Features + +- **Asynchronous Execution**: Spring Boot `@Async` annotation for concurrent operations +- **CICS Thread Management**: Maintains CICS transaction context across async threads +- **JCICS API Integration**: Uses JCICS to write results to Temporary Storage Queue (TSQ) +- **Thread Pool Configuration**: Proper configuration for CICS environments +- **Error Handling**: Examples of exception handling in asynchronous operations + +## Table of Contents + +- [Overview](#overview) +- [Key Features](#key-features) +- [Requirements](#requirements) +- [Downloading](#downloading) +- [Building the Sample](#building-the-sample) +- [Deploying to a CICS Liberty JVM server](#deploying-to-a-cics-liberty-jvm-server) +- [Running the Sample](#running-the-sample) +- [License](#license) +- [Additional Resources](#additional-resources) +- [Contributing](#contributing) + +The sample is structured as a multi-module project with: +- **cics-java-liberty-springboot-asynchronous-app** - The Spring Boot application module +- **cics-java-liberty-springboot-asynchronous-cicsbundle** - The CICS bundle module for deployment + +--- + +## Requirements + +### Workstation Requirements +- **Java:** Java SE 17 or later (required for Spring Boot 3.x) +- **Build Tools:** + - **Gradle:** Version 7.3+ (Java 17 support) - Recommended: 8.0+ - included via wrapper + - **Maven:** Version 3.8.1+ (Java 17 support) - Recommended: 3.9.0+ - included via wrapper +- **IDE (Optional):** + - Eclipse with IBM CICS SDK for Java EE, Jakarta EE and Liberty + - IntelliJ IDEA, VS Code, or any IDE with Gradle/Maven support + - Command line (no IDE required if using wrappers) + +### z/OS Requirements +- **CICS TS:** V6.1 or later +- **WebSphere Liberty:** Included with CICS +- **Java:** IBM Semeru Runtime 17 or later on z/OS +- **Jakarta EE:** 10 or later + +--- ## Downloading @@ -26,7 +68,7 @@ You can browse the published versions of the CICS BOM at [Maven Central.](https: Gradle (build.gradle): -`compileOnly(enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:6.1-20250812133513-PH63856"))` +`compileOnly enforcedPlatform("com.ibm.cics:com.ibm.cics.ts.bom:6.1-20250812133513-PH63856")` Maven (POM.xml): @@ -44,94 +86,180 @@ Maven (POM.xml): ``` -## Building +## Building the Sample -You can build the sample using an IDE of your choice, or you can build it from the command line. For both approaches, using the supplied Gradle or Maven wrapper is the recommended way to get a consistent version of build tooling. - -On the command line, you simply swap the Gradle or Maven command for the wrapper equivalent, `gradlew` or `mvnw` respectively. - -For an IDE, taking Eclipse as an example, the plug-ins for Gradle *buildship* and Maven *m2e* will integrate with the "Run As..." capability, allowing you to specify whether you want to build the project with a Wrapper, or a specific version of your chosen build tool. - -The required build-tasks are typically `clean build` for Gradle and `clean verify` for Maven. Once run, Gradle will generate a WAR file in the `cics-java-liberty-springboot-asynchronous-app/build/libs` directory, while Maven will generate it in the `cics-java-liberty-springboot-asynchronous-app/target` directory. - -**Note:** When building a WAR file for deployment to Liberty it is good practice to exclude Tomcat from the final runtime artifact. We demonstrate this in the pom.xml with the *provided* scope, and in build.gradle with the *providedRuntime()* dependency. +You can build using Gradle, Maven, or Eclipse. The wrappers are pre-configured with compatible versions. -### Gradle Wrapper (command line) +### Option 1: Building with Gradle -Run the following in a local command prompt: +**From the root directory:** -On Linux or Mac: - -```shell +Linux/Mac: +```bash ./gradlew clean build ``` -On Windows: - -```shell +Windows: +```cmd gradlew.bat clean build ``` -This creates a WAR file inside the `cics-java-liberty-springboot-asynchronous-app/build/libs` directory. +**Output:** +- WAR file: `cics-java-liberty-springboot-asynchronous-app/build/libs/cics-java-liberty-springboot-asynchronous-0.1.0.war` +- CICS bundle ZIP: `cics-java-liberty-springboot-asynchronous-cicsbundle/build/distributions/cics-java-liberty-springboot-asynchronous-cicsbundle-0.1.0.zip` -### Maven Wrapper (command line) +**Note:** +- In Eclipse, the `build` directory may be hidden. To view it: Package Explorer → ⋮ menu → Filters → Uncheck "Gradle build folder" -Run the following in a local command prompt: +--- -On Linux or Mac: +### Option 2: Building with Maven -```shell +**From the root directory:** + +Linux/Mac: +```bash ./mvnw clean verify ``` -On Windows: - -```shell +Windows: +```cmd mvnw.cmd clean verify ``` -This creates a WAR file inside the `cics-java-liberty-springboot-asynchronous-app/target` directory. +**Output:** +- WAR file: `cics-java-liberty-springboot-asynchronous-app/target/cics-java-liberty-springboot-asynchronous-0.1.0.war` +- CICS bundle ZIP: `cics-java-liberty-springboot-asynchronous-cicsbundle/target/cics-java-liberty-springboot-asynchronous-cicsbundle-0.1.0.zip` + +--- + +### Option 3: Building with Eclipse + +1. Import the project into Eclipse (File → Import → Existing Projects) +2. Right-click on the root project +3. Select either: + - **Gradle → Refresh Gradle Project** then **Run As → Gradle Build** (specify `clean build`) + - **Maven → Update Project** then **Run As → Maven build** (specify `clean verify`) + +**Note:** When building a WAR file for deployment to Liberty it is good practice to exclude Tomcat from the final runtime artifact. We demonstrate this in the pom.xml with the *provided* scope, and in build.gradle with the *providedRuntime()* dependency. + +--- ## Deploying to a CICS Liberty JVM server + Ensure you have the following features defined in your Liberty `server.xml`: - `servlet-6.0` (required for Spring Boot 3.x and Jakarta EE 10) - `concurrent-3.0` -- `cicsts:security-1.0` if CICS security is enabled. +- `cicsts:security-1.0` if CICS security is enabled A template `server.xml` is provided [here](./etc/config/liberty/server.xml). - -### Deploying with a CICS Bundle Project -1. Copy and paste the built WAR from your *target* or *build/libs* directory into a Eclipse CICS bundle project. -2. Create a new WAR bundlepart that references the WAR file. -3. Deploy the CICS bundle project from CICS Explorer using the **Export Bundle Project to z/OS UNIX File System** wizard. - -### Deploying with Liberty configuration -1. Manually upload the WAR file to zFS -2. Add an `` element to the Liberty server.xml to define the web application with access to all authenticated users. For example the following application element can be used to install a WAR, and grant access to all authenticated users if security is enabled: - - ```xml - - - - - - - - ``` -## Running the Sample -1. Ensure the web application started successfully in Liberty by checking for msg `CWWKT0016I` in the Liberty messages.log: - - `A CWWKT0016I: Web application available (default_host): http://zos.example.com:9080/cics-java-liberty-springboot-asynchronous-0.1.0` - - `I SRVE0292I: Servlet Message - [cics-java-liberty-springboot-asynchronous-0.1.0]:.2 Spring WebApplicationInitializers detected on classpath` +--- + +### Method 1: CICS Bundle Plugin Deployment (Recommended) -2. Copy the context root from message CWWKT0016I along with the REST service suffix 'test' into the browser e.g. `http://zos.example.com:9080/cics-java-liberty-springboot-asynchronous-0.1.0/test`. +This method uses the cics-bundle-gradle-plugin or cics-bundle-maven-plugin to automatically generate a CICS bundle. -3. If successful, the application will spawn 10 asynchronous requests (5 to each of two services). You can check the output from these asynchronous methods by viewing the TSQ called SPRINGTHREADS and/or messages.log. One way to achieve this is through the CICS command "CEBR SPRINGTHREADS". - You should see a number of entries (one per thread) for each of the two services (methods) we call: `"Task : Hello from asynchronous service()"`. Although each service is spawned 5 times in round-robin fashion the execution of those services is asynchronous and on separate CICS-enabled threads - so the TSQ writes will be of an unpredictable order. +**Configure your JVM server name:** + +Gradle (`cics-java-liberty-springboot-asynchronous-cicsbundle/build.gradle`): +```gradle +cics.jvmserver = 'YOUR_JVMSERVER_NAME' // e.g., 'DFHWLP' +``` + +Maven (`cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml`): +```xml +YOUR_JVMSERVER_NAME +``` + +**Deploy the bundle:** + +1. Upload the CICS bundle ZIP file to zFS: + - Gradle: `cics-java-liberty-springboot-asynchronous-cicsbundle/build/distributions/cics-java-liberty-springboot-asynchronous-cicsbundle-0.1.0.zip` + - Maven: `cics-java-liberty-springboot-asynchronous-cicsbundle/target/cics-java-liberty-springboot-asynchronous-cicsbundle-0.1.0.zip` + +2. Unzip the bundle on zFS + +3. Create a CICS BUNDLE resource definition: + ``` + CEDA DEFINE BUNDLE(ASYNCAPP) GROUP(MYGROUP) BUNDLEDIR(/path/to/bundle) + ``` + +4. Install the bundle: + ``` + CEDA INSTALL BUNDLE(ASYNCAPP) GROUP(MYGROUP) + ``` + +--- + +### Method 2: CICS Explorer SDK Deployment + +1. Copy the built WAR from your *target* or *build/libs* directory into an Eclipse CICS Bundle Project +2. Create a new WAR bundlepart that references the WAR file +3. Deploy the CICS Bundle Project from CICS Explorer using the **Export Bundle Project to z/OS UNIX File System** wizard + +--- + +### Method 3: Direct Liberty Application Deployment + +Manually upload the WAR file to zFS and add an `` element to the Liberty server.xml: + +```xml + + + + + + + +``` + +--- + +## Running the Sample + +### Testing the Application + +1. **Verify Deployment:** + + Ensure the web application started successfully in Liberty by checking for msg `CWWKT0016I` in the Liberty messages.log: + ``` + CWWKT0016I: Web application available (default_host): http://myzos.mycompany.com:httpPort/cics-java-liberty-springboot-asynchronous-0.1.0 + SRVE0292I: Servlet Message - [cics-java-liberty-springboot-asynchronous-0.1.0]:.2 Spring WebApplicationInitializers detected on classpath + ``` + +2. **Trigger Asynchronous Operations:** + + Access the test endpoint: + ``` + http://myzos.mycompany.com:httpPort/cics-java-liberty-springboot-asynchronous-0.1.0/test + ``` + +3. **Verify Results:** + + The application will spawn 10 asynchronous requests (5 to each of two services). Check the output by: + - Viewing the TSQ called `SPRINGTHREADS` using the CICS command: `CEBR SPRINGTHREADS` + - Checking Liberty messages.log + + You should see entries like: `"Task : Hello from asynchronous service()"` + + Although each service is spawned 5 times in round-robin fashion, the execution is asynchronous on separate CICS-enabled threads, so the TSQ writes will be in unpredictable order. + +--- ## License +This project is licensed under [Eclipse Public License - v 2.0](LICENSE). + +## Additional Resources + +- [CICS TS for z/OS Documentation](https://www.ibm.com/docs/en/cics-ts) +- [Spring Framework Async Documentation](https://docs.spring.io/spring-framework/reference/integration/scheduling.html) +- [CICS Java Development](https://www.ibm.com/docs/en/cics-ts/latest?topic=programming-java-applications) +- [Spring Boot Documentation](https://spring.io/projects/spring-boot) + +## Contributing -This project is licensed under [Eclipse Public License - v 2.0](LICENSE). +Contributions are welcome! Please read our [contributing guidelines](https://github.com/cicsdev/.github/blob/main/CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests. diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.core.resources.prefs b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..896a9a5 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 \ No newline at end of file diff --git a/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml b/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml index 8eb3867..cc57d90 100644 --- a/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml +++ b/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml @@ -1,7 +1,8 @@ - + cics-java-liberty-springboot-asynchronous BASIC @@ -23,3 +24,5 @@ cicsAllAuthenticated + + From 1da954e5879d294d4ac24c4883be72e75ae5798c Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 22 Jun 2026 22:31:59 +0100 Subject: [PATCH 26/36] Fix web.xml formatting and remove tool attribution comment - Remove trailing spaces after closing tags - Remove 'Made with Bob' comment (violates Agents.md no tool attribution rule) - Ensure proper XML formatting --- .../src/main/webapp/WEB-INF/web.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml b/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml index cc57d90..78f8e2f 100644 --- a/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml +++ b/cics-java-liberty-springboot-asynchronous-app/src/main/webapp/WEB-INF/web.xml @@ -3,10 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> - cics-java-liberty-springboot-asynchronous + cics-java-liberty-springboot-asynchronous BASIC - + com.ibm.cicsdev.springboot.asynchronous @@ -15,14 +15,13 @@ /* - All Authenticated users + All Authenticated users cicsAllAuthenticated - + The CICS cicsAllAuthenticated role cicsAllAuthenticated - From 8ad5c4c86910f4ffe877602d58ec63d0b5eb8c19 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Mon, 22 Jun 2026 23:13:27 +0100 Subject: [PATCH 27/36] Add Eclipse encoding configuration for cicsbundle module - Add org.eclipse.core.resources.prefs to cicsbundle module - Sets UTF-8 encoding to resolve Eclipse warning - Completes Eclipse configuration for all modules --- .../.settings/org.eclipse.core.resources.prefs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.core.resources.prefs diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.core.resources.prefs b/cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 From d65a94c26d98cceaab1a7091ca4a4766aa566c56 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:31 +0100 Subject: [PATCH 28/36] Fix cicsbundle pom.xml: use explicit groupId instead of ${project.groupId} --- cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml index 86e97ae..524514c 100644 --- a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml @@ -26,7 +26,7 @@ - ${project.groupId} + com.ibm.cicsdev.springboot cics-java-liberty-springboot-asynchronous-app ${project.version} war From 45ab4cdf92323b6585d408ccb42867760c5aee08 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:32 +0100 Subject: [PATCH 29/36] Fix app module Eclipse settings: add missing compiler preference entries to match standard template --- .../.settings/org.eclipse.jdt.core.prefs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs index 626e0e1..d4540a5 100644 --- a/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs +++ b/cics-java-liberty-springboot-asynchronous-app/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,10 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled org.eclipse.jdt.core.compiler.source=17 From d42f137ec5bf1be935233f831dfdccd0103cdffb Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:33 +0100 Subject: [PATCH 30/36] =?UTF-8?q?Fix=20cleanup=20workflow:=20keep=5Fminimu?= =?UTF-8?q?m=5Fruns=203=20=E2=86=92=206=20(matches=20CICSdev=20standard)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cleanup-old-runs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cleanup-old-runs.yml b/.github/workflows/cleanup-old-runs.yml index 31fcd3e..e72e8df 100644 --- a/.github/workflows/cleanup-old-runs.yml +++ b/.github/workflows/cleanup-old-runs.yml @@ -19,5 +19,5 @@ jobs: token: ${{ github.token }} repository: ${{ github.repository }} retain_days: 30 - keep_minimum_runs: 3 + keep_minimum_runs: 6 From 75489a64557f1c2909e932334e7c1ac19765f6e6 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:33 +0100 Subject: [PATCH 31/36] Upgrade Maven wrapper to 3.9.12 with only-script type (matches CICSdev standard) --- .mvn/wrapper/maven-wrapper.properties | 5 +- mvnw | 477 ++++++++++++-------------- mvnw.cmd | 343 +++++++++--------- 3 files changed, 382 insertions(+), 443 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index fc26f08..8dea6c2 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,4 +1,3 @@ wrapperVersion=3.3.4 -distributionType=bin -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip diff --git a/mvnw b/mvnw index 1ddd97b..bd8896b 100755 --- a/mvnw +++ b/mvnw @@ -21,185 +21,81 @@ # ---------------------------------------------------------------------------- # Apache Maven Wrapper startup batch script, version 3.3.4 # -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# # Optional ENV vars # ----------------- -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ]; then - - if [ -f /usr/local/etc/mavenrc ]; then - . /usr/local/etc/mavenrc - fi - - if [ -f /etc/mavenrc ]; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ]; then - . "$HOME/.mavenrc" - fi - -fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x -# OS specific support. $var _must_ be set to either true or false. -cygwin=false -darwin=false -mingw=false +# OS specific support. +native_path() { printf %s\\n "$1"; } case "$(uname)" in -CYGWIN*) cygwin=true ;; -MINGW*) mingw=true ;; -Darwin*) - darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - JAVA_HOME="$(/usr/libexec/java_home)" - export JAVA_HOME - else - JAVA_HOME="/Library/Java/Home" - export JAVA_HOME - fi - fi +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } ;; esac -if [ -z "$JAVA_HOME" ]; then - if [ -r /etc/gentoo-release ]; then - JAVA_HOME=$(java-config --jre-home) - fi -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin; then - [ -n "$JAVA_HOME" ] \ - && JAVA_HOME=$(cygpath --unix "$JAVA_HOME") - [ -n "$CLASSPATH" ] \ - && CLASSPATH=$(cygpath --path --unix "$CLASSPATH") -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw; then - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] \ - && JAVA_HOME="$( - cd "$JAVA_HOME" || ( - echo "cannot cd into $JAVA_HOME." >&2 - exit 1 - ) - pwd - )" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="$(which javac)" - if [ -n "$javaExecutable" ] && ! [ "$(expr "$javaExecutable" : '\([^ ]*\)')" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=$(which readlink) - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then - if $darwin; then - javaHome="$(dirname "$javaExecutable")" - javaExecutable="$(cd "$javaHome" && pwd -P)/javac" - else - javaExecutable="$(readlink -f "$javaExecutable")" - fi - javaHome="$(dirname "$javaExecutable")" - javaHome=$(expr "$javaHome" : '\(.*\)/bin') - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ]; then - if [ -n "$JAVA_HOME" ]; then +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" else JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi fi else JAVACMD="$( - \unset -f command 2>/dev/null - \command -v java - )" - fi -fi - -if [ ! -x "$JAVACMD" ]; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ]; then - echo "Warning: JAVA_HOME environment variable is not set." >&2 -fi + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - if [ -z "$1" ]; then - echo "Path not specified to find_maven_basedir" >&2 - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ]; do - if [ -d "$wdir"/.mvn ]; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=$( - cd "$wdir/.." || exit 1 - pwd - ) + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 fi - # end of workaround - done - printf '%s' "$( - cd "$basedir" || exit 1 - pwd - )" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - # Remove \r in case we run on Windows within Git Bash - # and check out the repository with auto CRLF management - # enabled. Otherwise, we may read lines that are delimited with - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word - # splitting rules. - tr -s '\r\n' ' ' <"$1" fi } -log() { - if [ "$MVNW_VERBOSE" = true ]; then - printf '%s\n' "$1" - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h } -BASE_DIR=$(find_maven_basedir "$(dirname "$0")") -if [ -z "$BASE_DIR" ]; then - exit 1 -fi +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -export MAVEN_PROJECTBASEDIR -log "$MAVEN_PROJECTBASEDIR" +die() { + printf %s\\n "$1" >&2 + exit 1 +} trim() { # MWRAPPER-139: @@ -209,130 +105,191 @@ trim() { printf "%s" "${1}" | tr -d '[:space:]' } -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" -if [ -r "$wrapperJarPath" ]; then - log "Found $wrapperJarPath" +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT else - log "Couldn't find $wrapperJarPath, downloading it ..." + die "cannot create temp dir" +fi - if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" - else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" - fi - while IFS="=" read -r key value; do - case "$key" in wrapperUrl) - wrapperUrl=$(trim "${value-}") - break - ;; - esac - done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" - log "Downloading from: $wrapperUrl" - - if $cygwin; then - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") - fi +mkdir -p -- "${MAVEN_HOME%/*}" - if command -v wget >/dev/null; then - log "Found wget ... using wget" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget ${QUIET:+"$QUIET"} "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - else - wget ${QUIET:+"$QUIET"} --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" - fi - elif command -v curl >/dev/null; then - log "Found curl ... using curl" - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl ${QUIET:+"$QUIET"} -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - else - curl ${QUIET:+"$QUIET"} --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" - fi - else - log "Falling back to using Java to download" - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaSource=$(cygpath --path --windows "$javaSource") - javaClass=$(cygpath --path --windows "$javaClass") - fi - if [ -e "$javaSource" ]; then - if [ ! -e "$javaClass" ]; then - log " - Compiling MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/javac" "$javaSource") - fi - if [ -e "$javaClass" ]; then - log " - Running MavenWrapperDownloader.java ..." - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" - fi - fi - fi +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -########################################################################################## -# End of extension -########################################################################################## -# If specified, validate the SHA-256 sum of the Maven wrapper jar file -wrapperSha256Sum="" -while IFS="=" read -r key value; do - case "$key" in wrapperSha256Sum) - wrapperSha256Sum=$(trim "${value-}") - break - ;; - esac -done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" -if [ -n "$wrapperSha256Sum" ]; then - wrapperSha256Result=false - if command -v sha256sum >/dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c - >/dev/null 2>&1; then - wrapperSha256Result=true +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true fi elif command -v shasum >/dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c >/dev/null 2>&1; then - wrapperSha256Result=true + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi else echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 exit 1 fi - if [ $wrapperSha256Result = false ]; then - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 exit 1 fi fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$JAVA_HOME" ] \ - && JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") - [ -n "$CLASSPATH" ] \ - && CLASSPATH=$(cygpath --path --windows "$CLASSPATH") - [ -n "$MAVEN_PROJECTBASEDIR" ] \ - && MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi fi -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" -export MAVEN_CMD_LINE_ARGS +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -# shellcheck disable=SC2086 # safe args -exec "$JAVACMD" \ - $MAVEN_OPTS \ - $MAVEN_DEBUG_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index c453424..5761d94 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,3 +1,4 @@ +<# : batch portion @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @@ -20,187 +21,169 @@ @REM ---------------------------------------------------------------------------- @REM Apache Maven Wrapper startup batch script, version 3.3.4 @REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM @REM Optional ENV vars -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output @REM ---------------------------------------------------------------------------- -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* -if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. >&2 -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. >&2 -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. >&2 -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. >&2 -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" - -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %WRAPPER_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file -SET WRAPPER_SHA_256_SUM="" -FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) ) -IF NOT %WRAPPER_SHA_256_SUM%=="" ( - powershell -Command "&{"^ - "Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash;"^ - "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ - "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ - " Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ - " Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ - " Write-Error 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ - " exit 1;"^ - "}"^ - "}" - if ERRORLEVEL 1 goto error -) - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% ^ - %JVM_CONFIG_MAVEN_PROPS% ^ - %MAVEN_OPTS% ^ - %MAVEN_DEBUG_OPTS% ^ - -classpath %WRAPPER_JAR% ^ - "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ - %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" -if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%"=="on" pause - -if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% - -cmd /C exit /B %ERROR_CODE% +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" From a2c08b808b8a5e89762a176b343dd483be1621c6 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:34 +0100 Subject: [PATCH 32/36] Fix CI: remove schedule cron; add copyright checker permissions; fix gradle jobs to use clean build; add -Djava.version to Maven jobs --- .github/workflows/build.yaml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 33cd330..4386a15 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -8,13 +8,14 @@ on: branches: ["main"] pull_request: branches: ["main"] - schedule: - - cron: '0 0 * * *' jobs: check-copyright: runs-on: ubuntu-latest name: Check Copyright + permissions: + contents: write + pull-requests: write steps: - uses: actions/checkout@v4 with: @@ -43,7 +44,7 @@ jobs: distribution: "semeru" cache: maven - name: Build with Maven - run: mvn --batch-mode --update-snapshots --file pom.xml verify + run: mvn --batch-mode --update-snapshots --file pom.xml -Djava.version=${{ matrix.jdk }} verify build-mvnw: name: Build Maven Wrapper @@ -61,11 +62,11 @@ jobs: distribution: "semeru" cache: maven - name: Build with Maven Wrapper - run: ./mvnw --batch-mode --update-snapshots verify + run: ./mvnw --batch-mode --update-snapshots --file pom.xml -Djava.version=${{ matrix.jdk }} verify build-gradle: name: Build Gradle - + runs-on: ubuntu-latest strategy: matrix: @@ -77,16 +78,17 @@ jobs: with: java-version: ${{ matrix.jdk }} distribution: 'semeru' - - name: Build with Gradle + - name: Setup Gradle + # Use setup-gradle to install a specific Gradle version for direct 'gradle' command use uses: gradle/actions/setup-gradle@v4 with: gradle-version: 8.14.4 - - name: Execute Gradle build - run: gradle clean bootWar + - name: Build with Gradle + run: gradle clean build -Pjava_version=${{ matrix.jdk }} build-gradlew: name: Build Gradle Wrapper - + runs-on: ubuntu-latest strategy: matrix: @@ -99,4 +101,4 @@ jobs: java-version: ${{ matrix.jdk }} distribution: 'semeru' - name: Build with Gradle Wrapper - run: ./gradlew clean bootWar + run: ./gradlew clean build -Pjava_version=${{ matrix.jdk }} From d84fe70a9d37163d1ab9d9760d84c82635b9fc80 Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:35 +0100 Subject: [PATCH 33/36] =?UTF-8?q?Upgrade=20Spring=20Boot=203.5.14=20?= =?UTF-8?q?=E2=86=92=203.5.16;=20replace=20archivesName=20with=20archiveFi?= =?UTF-8?q?leName=20to=20fix=20WAR=20naming?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cics-java-liberty-springboot-asynchronous-app/build.gradle | 6 +++--- pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cics-java-liberty-springboot-asynchronous-app/build.gradle b/cics-java-liberty-springboot-asynchronous-app/build.gradle index f8673ad..f0bf6fb 100644 --- a/cics-java-liberty-springboot-asynchronous-app/build.gradle +++ b/cics-java-liberty-springboot-asynchronous-app/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'org.springframework.boot' version '3.5.14' + id 'org.springframework.boot' version '3.5.16' id 'io.spring.dependency-management' version '1.1.7' id 'java' id 'eclipse' @@ -11,9 +11,9 @@ plugins group = 'com.ibm.cicsdev.springboot' version = '0.1.0' -base +war { - archivesName = "cics-java-liberty-springboot-asynchronous" + archiveFileName = 'cics-java-liberty-springboot-asynchronous.war' } diff --git a/pom.xml b/pom.xml index a6e6300..3761d83 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.14 + 3.5.16 From c7e29b6031b8c6a19d9e48196703c1043056c6ee Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:36 +0100 Subject: [PATCH 34/36] Fix README: correct WAR output paths (remove version suffix); fix application element names; update MAINTAINERS review date --- MAINTAINERS.md | 2 +- README.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 27652f8..ad9ad7c 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -4,4 +4,4 @@ - Alex Brown [@AlexBrown](https://github.com/SoftlySplinter) - Phil Wakelin [@PhilWakelin](https://github.com/PhilWakelin) -*Last reviewed:* November 2024 +*Last reviewed:* July 2026 diff --git a/README.md b/README.md index 9d428a3..3a3c0e8 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ gradlew.bat clean build ``` **Output:** -- WAR file: `cics-java-liberty-springboot-asynchronous-app/build/libs/cics-java-liberty-springboot-asynchronous-0.1.0.war` +- WAR file: `cics-java-liberty-springboot-asynchronous-app/build/libs/cics-java-liberty-springboot-asynchronous.war` - CICS bundle ZIP: `cics-java-liberty-springboot-asynchronous-cicsbundle/build/distributions/cics-java-liberty-springboot-asynchronous-cicsbundle-0.1.0.zip` **Note:** @@ -128,7 +128,7 @@ mvnw.cmd clean verify ``` **Output:** -- WAR file: `cics-java-liberty-springboot-asynchronous-app/target/cics-java-liberty-springboot-asynchronous-0.1.0.war` +- WAR file: `cics-java-liberty-springboot-asynchronous-app/target/cics-java-liberty-springboot-asynchronous.war` - CICS bundle ZIP: `cics-java-liberty-springboot-asynchronous-cicsbundle/target/cics-java-liberty-springboot-asynchronous-cicsbundle-0.1.0.zip` --- @@ -206,9 +206,9 @@ Maven (`cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml`): Manually upload the WAR file to zFS and add an `` element to the Liberty server.xml: ```xml - + @@ -227,15 +227,15 @@ Manually upload the WAR file to zFS and add an `` element to the Li Ensure the web application started successfully in Liberty by checking for msg `CWWKT0016I` in the Liberty messages.log: ``` - CWWKT0016I: Web application available (default_host): http://myzos.mycompany.com:httpPort/cics-java-liberty-springboot-asynchronous-0.1.0 - SRVE0292I: Servlet Message - [cics-java-liberty-springboot-asynchronous-0.1.0]:.2 Spring WebApplicationInitializers detected on classpath + CWWKT0016I: Web application available (default_host): http://myzos.mycompany.com:httpPort/cics-java-liberty-springboot-asynchronous + SRVE0292I: Servlet Message - [cics-java-liberty-springboot-asynchronous]:.2 Spring WebApplicationInitializers detected on classpath ``` 2. **Trigger Asynchronous Operations:** Access the test endpoint: ``` - http://myzos.mycompany.com:httpPort/cics-java-liberty-springboot-asynchronous-0.1.0/test + http://myzos.mycompany.com:httpPort/cics-java-liberty-springboot-asynchronous/test ``` 3. **Verify Results:** From c3b3a9fef1cde49a78d88a5a56f6e9593fd0d1ed Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:09:36 +0100 Subject: [PATCH 35/36] Add foojay toolchain resolver to settings.gradle; add JDK auto-provisioning to gradle.properties --- gradle.properties | 17 +++++++++-------- settings.gradle | 10 ++++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6e02650..ebe8699 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,14 @@ -# -# Values in this file provide defaults to variables used in the -# gradle files. -# - -# Java version for toolchain +# Centralized Java version for Gradle toolchain and Maven compiler java_version = 17 -# Gradle build optimizations +# Gradle daemon and parallel build settings org.gradle.daemon=true org.gradle.parallel=true -# Configuration cache disabled for CICS Bundle Plugin compatibility + +# Enable toolchain auto-provisioning to download JDKs if not found locally +# This allows builds to work even if the specific Java version is not installed +org.gradle.java.installations.auto-detect=true +org.gradle.java.installations.auto-download=true + +# Configuration cache disabled due to CICS Bundle Plugin 1.0.8 incompatibility # org.gradle.configuration-cache=true \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 834641f..d0f14e0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,13 @@ +// ============================================================================ +// Toolchain Configuration +// ============================================================================ +// Foojay resolver enables Gradle to automatically download the required JDK +// if it is not found on the local system (requires auto-download in gradle.properties) +plugins +{ + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + // ============================================================================ // Root Project Configuration // ============================================================================ From 99d69ff2ffd666f9497f4c3d80e835fc292e201d Mon Sep 17 00:00:00 2001 From: Ivan Hargreaves Date: Fri, 3 Jul 2026 11:15:28 +0100 Subject: [PATCH 36/36] =?UTF-8?q?Revert=20cicsbundle=20groupId=20to=20${pr?= =?UTF-8?q?oject.groupId}=20=E2=80=94=20correct=20Maven=20idiom=20for=20si?= =?UTF-8?q?bling=20module=20reference?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml index 524514c..86e97ae 100644 --- a/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml +++ b/cics-java-liberty-springboot-asynchronous-cicsbundle/pom.xml @@ -26,7 +26,7 @@ - com.ibm.cicsdev.springboot + ${project.groupId} cics-java-liberty-springboot-asynchronous-app ${project.version} war