diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..31ffcd8ee --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,45 @@ +version: 2 + +multi-ecosystem-groups: + java: + schedule: + interval: daily + +updates: + - package-ecosystem: docker + directories: + - "/fabric-chaincode-docker" + - "/examples/fabric-contract-example-as-service" + schedule: + interval: daily + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: daily + + - package-ecosystem: gradle + multi-ecosystem-group: java + patterns: + - "*" + directories: + - "/" + - "/fabric-chaincode-docker" + - "/examples/fabric-contract-example-as-service" + - "/examples/fabric-contract-example-gradle" + - "/examples/fabric-contract-example-gradle-kotlin" + - "/examples/ledger-api" + - "/fabric-chaincode-integration-test" + - "/fabric-chaincode-integration-test/src/contracts/bare-gradle" + - "/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api" + - "/fabric-chaincode-integration-test/src/contracts/fabric-shim-api" + - "/fabric-chaincode-shim" + + - package-ecosystem: maven + multi-ecosystem-group: java + patterns: + - "*" + directories: + - "/examples/fabric-contract-example-maven" + - "/fabric-chaincode-integration-test/src/contracts/bare-maven" + - "/fabric-chaincode-integration-test/src/contracts/wrapper-maven" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3ed405376..0c2d47dcc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,37 +15,46 @@ env: IMAGE_NAME: ${{ github.repository_owner }}/fabric-javaenv jobs: - # Publishing steps to both the Github Packages and the Sonatype - publishjars: - strategy: - fail-fast: false - matrix: - publish_target: - - publishAllPublicationsToGithubPackagesRepository - - publishAllPublicationsToReleaseRepository + publish-github: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: "temurin" - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 - - name: Push to registry ${{ matrix.publish_target }} + java-version: 25 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 + - name: Publish to GitHub Packages run: | - set -xev - ./gradlew -Psigning.key="${SIGNING_KEY}" -Psigning.password="${SIGNING_PASSWORD}" -PossrhUsername="${OSSRH_USER}" -PossrhPassword="${OSSRH_PASSWORD}" ${TARGET} + ./gradlew publishAllPublicationsToGitHubRepository env: - SIGNING_PASSWORD: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} - SIGNING_KEY: ${{ secrets.OSSRH_GPG_SECRET_KEY }} - OSSRH_USER: ${{ secrets.OSSRH_USERNAME }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_TOKEN }} - TARGET: ${{ matrix.publish_target }} + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_SECRET_KEY }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish-maven: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 + with: + distribution: "temurin" + java-version: 25 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 + - name: Publish to Maven Central + run: | + ./gradlew publishAggregationToCentralPortal + env: + ORG_GRADLE_PROJECT_signingKey: ${{ secrets.OSSRH_GPG_SECRET_KEY }} + ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVENCENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVENCENTRAL_PASSWORD }} + docker-build-push: name: Push Docker image runs-on: ${{ matrix.arch.runner }} @@ -61,33 +70,33 @@ jobs: - platform: linux-arm64 runner: ubuntu-24.04-arm steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: "temurin" - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + java-version: 25 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - name: Build the dependencies needed for the image run: ./gradlew :fabric-chaincode-docker:copyAllDeps - name: Get commit timestamp run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Login to Docker Hub - uses: docker/login-action@v3 + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: registry: docker.io username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Build image id: build - uses: docker/build-push-action@v6 + uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0 with: file: fabric-chaincode-docker/Dockerfile context: fabric-chaincode-docker @@ -100,7 +109,7 @@ jobs: digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: digest-${{ matrix.arch.platform }} path: ${{ runner.temp }}/digests/* @@ -121,20 +130,20 @@ jobs: - ghcr.io steps: - name: Download digests - uses: actions/download-artifact@v4 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: path: ${{ runner.temp }}/digests pattern: digest-* merge-multiple: true - name: Login to ${{ matrix.registry }} - uses: docker/login-action@v3 + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: registry: ${{ matrix.registry }} username: ${{ matrix.registry == 'docker.io' && secrets.DOCKERHUB_USERNAME || github.actor }} password: ${{ matrix.registry == 'docker.io' && secrets.DOCKERHUB_TOKEN || secrets.GITHUB_TOKEN }} - name: Docker metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: ${{ matrix.registry }}/${{ env.IMAGE_NAME }} tags: | @@ -142,7 +151,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}}.{{minor}}.{{patch}} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Create and push manifest list working-directory: ${{ runner.temp }}/digests run: | diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index b0754fd5d..c70655305 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -16,17 +16,19 @@ jobs: osv-scanner: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ inputs.ref }} - - uses: actions/setup-go@v5 # Needed for scanning of v2.5.5 and earlier + # Go needed for scanning of v2.5.5 and earlier + - uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0 with: go-version: stable cache: false - - uses: actions/setup-java@v4 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: temurin + # Releases v2.5.7 and earlier do not support Java 25 java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - name: Scan run: make scan diff --git a/.github/workflows/scheduled-scan.yml b/.github/workflows/scheduled-scan.yml index cfbe56870..191af837a 100644 --- a/.github/workflows/scheduled-scan.yml +++ b/.github/workflows/scheduled-scan.yml @@ -9,7 +9,7 @@ permissions: contents: read jobs: - latest-release-version: + release-version: name: Get latest release tag runs-on: ubuntu-latest outputs: @@ -18,9 +18,13 @@ jobs: - id: tag-name run: echo "value=$(curl --location --silent --fail "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/latest" | jq --raw-output '.tag_name')" >> "${GITHUB_OUTPUT}" - scan: - name: Scan ${{ needs.latest-release-version.outputs.tag_name }} - needs: latest-release-version + scan-release: + name: Scan ${{ needs.release-version.outputs.tag_name }} + needs: release-version uses: ./.github/workflows/scan.yml with: - ref: ${{ needs.latest-release-version.outputs.tag_name }} + ref: ${{ needs.release-version.outputs.tag_name }} + + scan-latest: + name: Scan latest + uses: ./.github/workflows/scan.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9d45c2a4e..9258ab648 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,31 +16,31 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ inputs.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: temurin - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + java-version: 25 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - name: Build and Unit test run: ./gradlew :fabric-chaincode-shim:build intergationtest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ inputs.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: temurin - java-version: 21 - - uses: actions/setup-node@v4 + java-version: 25 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "lts/*" - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - name: Populate chaincode with latest java-version run: | ./gradlew -I $GITHUB_WORKSPACE/fabric-chaincode-integration-test/chaincodebootstrap.gradle -PchaincodeRepoDir=$GITHUB_WORKSPACE/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/repository publishShimPublicationToFabricRepository @@ -66,13 +66,13 @@ jobs: docker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: ${{ inputs.ref }} - - uses: actions/setup-java@v4 + - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: distribution: temurin - java-version: 21 - - uses: gradle/actions/setup-gradle@v4 + java-version: 25 + - uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 - name: Build Docker image run: ./gradlew :fabric-chaincode-docker:buildImage diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index 57924e508..b8087a775 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -11,7 +11,8 @@ This table shows the summary of the compatibility of the Java chaincode librarie | v1.4 | 8 | 8 | amd64 | | v2.2 | 11 | 11 | amd64 | | v2.5.0 - v2.5.4 | 11 | 11 | amd64, arm64 | -| v2.5.5+ | 11 | 21 | amd64, arm64 | +| v2.5.5 - v2.5.7 | 11 | 21 | amd64, arm64 | +| v2.5.8+ | 11 | 25 | amd64, arm64 | The Java runtime provided by the chaincode Docker image determines the maximum Java version (and features) that smart contract code can exploit when using the default Java chaincode container. diff --git a/Makefile b/Makefile index 44118a94c..c64334c5f 100644 --- a/Makefile +++ b/Makefile @@ -16,9 +16,17 @@ endif .PHONY: scan scan: $(osv-scanner) + rm -f fabric-chaincode-shim/gradle.lockfile ./gradlew --quiet :fabric-chaincode-shim:dependencies --write-locks --configuration runtimeClasspath bin/osv-scanner scan --lockfile=fabric-chaincode-shim/gradle.lockfile +.PHONY: scan-all +scan-all: $(osv-scanner) + rm -f fabric-chaincode-shim/gradle.lockfile + ./gradlew --quiet :fabric-chaincode-shim:dependencies --write-locks + bin/osv-scanner scan --lockfile=fabric-chaincode-shim/gradle.lockfile + + .PHONY: install-osv-scanner install-osv-scanner: mkdir -p '$(bin_dir)' diff --git a/RELEASING.md b/RELEASING.md index 7550061e5..b4a5308e8 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -2,74 +2,32 @@ The following artifacts are created as a result of releasing Fabric Chaincode Java: -- docker images - - [fabric-javaenv](https://hub.docker.com/r/hyperledger/fabric-javaenv) -- Java libraries - - [fabric-chaincode-shim](https://search.maven.org/search?q=a:fabric-chaincode-shim) - -**Note:** A docker image with a matching V.R version is required before releasing a new version of Fabric. +- `fabric-javaenv` Docker images: + - [Docker Hub](https://hub.docker.com/r/hyperledger/fabric-javaenv) + - [GitHub Packages](https://github.com/orgs/hyperledger/packages/container/package/fabric-javaenv) +- `fabric-chaincode-shim` Java libraries: + - [Maven Central](https://central.sonatype.com/artifact/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim) + - [GitHub Packages](https://github.com/hyperledger/fabric-chaincode-java/packages/50049) ## Before releasing -It's useful to create an issue to keep track of each release, for example [Release v2.1.0](https://jira.hyperledger.org/browse/FABCJ-283). - The following tasks are required before releasing: -- Update version numbers in `build.gradle` files to the required version -- Update test, sample, and docs files to match the new version -- Update the [`COMPATIBILITY.md`](./COMPATIBILITY.md) - -See the [[FABCJ-289] release: 2.2.0 LTS](https://github.com/hyperledger/fabric-chaincode-java/pull/124) pull request for an example, although be careful to search for all versions in the codebase as they're easy to miss and things change! - -Ensure the last branch build passed since exactly this repository state will be released. +- Ensure the version number in `build.gradle` is the required release version. +- Check the last branch build passed since exactly this repository state will be released. ## Create release Creating a GitHub release on the [releases page](https://github.com/hyperledger/fabric-chaincode-java/releases) will trigger the build to publish the new release. -When drafting the release, create a new tag for the new version (with a `v` prefix), e.g. `v2.1.4` +When drafting the release, create a new tag for the new version (with a `v` prefix). For example: `v2.1.4` See previous releases for examples of the title and description. -## Publish Java libraries - -Log on to the [nexus repository manager](https://oss.sonatype.org/#welcome) to manually publish the JARs which were pushed by the release build. - -Find the results of the release build under _Build Promotion > Staging Repositories_ and perform the following steps: - -1. Close - - You should see a series of close activities (see note) - -2. Release using the automatically drop option - - You should see a series of release activities (see note) - -Note: you may need to refresh to update the activities view. - -When the release has completed and the _Staging Repositories_ list is empty, the Java chaincode libraries should appear in the maven repository. They can take some time to appear in the UI but they should exist in the repository sooner. - ## After releasing -- Update version numbers in `build.gradle` files to the next version -- Update test, sample, and docs files to match the new version - -See the [Bump version to 2.2.1](https://github.com/hyperledger/fabric-chaincode-java/pull/127) pull request for an example. It should include almost all the files changed to prepare for the release, except for the release notes and changelog which do not need updating. - -## Interim Build Publishing - -The nightly Azure Pipeline Builds will also publish the 'dev' drivers to Artifactory. These can be accessed via the repository at - -``` - maven { - url "https://hyperledger.jfrog.io/hyperledger/fabric-maven" - } -``` - -These 'dev' drivers are built from the main branch only, and have a version format including the date for example `2.3.1.dev.20210303`. They can be accessed in a build file like this - -``` -dependencies { - compile group: 'org.hyperledger.fabric-chaincode-java', name: 'fabric-chaincode-shim', version: '2.3.1.dev.+' - } -``` +- Update the version number in `build.gradle` to the next version. +- Update image version numbers in `fabric-chaincode-docker/build.gradle` to match the next version. +- Update the `fabric-chaincode-shim` dependency version in all `build.gradle` and `pom.xml` files within `fabric-chaincode-integration-test/src/contracts` to match the next version. +- Update the `fabric-chaincode-shim` dependency version in all `build.gradle`, `build.gradle.kts` and `pom.xml` files within `examples` to match the last _released_ version. +- Check that `COMPATIBILITY.md` is correct and update if required. diff --git a/build.gradle b/build.gradle index d0be9fd6c..c12b354ec 100644 --- a/build.gradle +++ b/build.gradle @@ -5,12 +5,13 @@ */ plugins { - id "com.github.ben-manes.versions" version "0.52.0" - id "com.diffplug.spotless" version "7.0.4" + id "com.github.ben-manes.versions" version "0.53.0" + id "com.diffplug.spotless" version "8.1.0" + id "com.gradleup.nmcp.aggregation" version "1.4.3" + id "com.gradleup.nmcp" version "1.4.3" apply false } -version = '2.5.6' - +version = '2.5.9' // If the nightly property is set, then this is the scheduled main // build - and we should publish this to artifactory @@ -23,6 +24,18 @@ if (properties.containsKey('NIGHTLY')) { ext.nightly = false } +nmcpAggregation { + centralPortal { + username = findProperty('mavenCentralUsername') + password = findProperty('mavenCentralPassword') + publishingType = "AUTOMATIC" + } +} + +dependencies { + nmcpAggregation(project(':fabric-chaincode-shim')) +} + allprojects { apply plugin: "com.diffplug.spotless" @@ -47,26 +60,20 @@ subprojects { group = 'org.hyperledger.fabric-chaincode-java' version = rootProject.version - java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - compileJava { - if (javaCompiler.get().metadata.languageVersion.canCompileOrRun(10)) { - options.release = 11 - } + options.release = 11 + options.compilerArgs += ['-Werror', '-Xlint:all'] } dependencies { - implementation 'commons-cli:commons-cli:1.9.0' + implementation 'commons-cli:commons-cli:1.11.0' implementation 'commons-logging:commons-logging:1.3.5' - testImplementation platform('org.junit:junit-bom:5.13.1') + testImplementation platform('org.junit:junit-bom:6.0.2') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation 'org.hamcrest:hamcrest-library:3.0' @@ -79,18 +86,14 @@ subprojects { spotless { java { removeUnusedImports() - palantirJavaFormat('2.67.0').formatJavadoc(true) + palantirJavaFormat().formatJavadoc(true) formatAnnotations() } } } -task printVersionName() { - println rootProject.version -} - // Get the date in the reverse format for sorting -def getDate() { +static def getDate() { def date = new Date() def formattedDate = date.format('yyyyMMdd') return formattedDate diff --git a/ci/azure-pipelines.yml b/ci/azure-pipelines.yml deleted file mode 100644 index 57986c2d4..000000000 --- a/ci/azure-pipelines.yml +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# -# fabric-chaincode-java azure pipeline configuration. -# -name: $(SourceBranchName)-$(Date:yyyyMMdd)$(Rev:.rrr) - -# Daily build for final quality -# cf https://crontab.guru/#0_23_*_*_* -schedules: - - cron: "0 10,12,14,16,23 * * *" - displayName: "Chaincode Java Nightly Driver" - branches: - include: - - main - -trigger: - branches: - include: - - "release-2.5" - tags: - include: - - "*" - -# These are custom defined variables, the pipeline one is currently used for the build scripts -# to know to produce tests results in XML format for Azure to consume, for developers -# this isn't set so command line output is given -# -# Chaincode_Java_Creds is the protected group of keys for publishing -# -variables: - - group: Chaincode_Java_Creds - - group: Github-PackageRegistry-Credentials - - group: JARSigningPublish - - name: component - value: fabric-chaincode-java - - name: pipeline - value: ci - - name: PUSH_VERSION - value: stable - - name: FABRIC_VERSION - value: 2.5-stable - -pool: - vmImage: "ubuntu-latest" - -# The stages and jobs, potential for rationalization and optimization -# Keeping it simple and explicit whilst we gain experience -# -stages: - - stage: Build_and_test - jobs: - - job: displayenv - steps: - - template: templates/build-data.yml - - job: main - steps: - - task: Gradle@2 - inputs: - workingDirectory: "" - gradleWrapperFile: "gradlew" - gradleOptions: "-Xmx3072m" - javaHomeOption: "JDKVersion" - jdkVersionOption: "1.8" - jdkArchitectureOption: "x64" - options: "-x javadoc -x :fabric-chaincode-integration-test:test" - publishJUnitResults: true - testResultsFiles: "$(System.DefaultWorkingDirectory)/**/TEST-*.xml" - tasks: "build" - - task: PublishBuildArtifacts@1 - condition: or(succeeded(), failed()) - inputs: - pathToPublish: fabric-chaincode-shim/build/reports/checkstyle/ - artifactName: checkstylereport - displayName: 'Checkstyle' - continueOnError: true - - task: PublishBuildArtifacts@1 - condition: or(succeeded(), failed()) - inputs: - pathToPublish: fabric-chaincode-shim/build/reports/jacoco/ - artifactName: coveragereport - displayName: 'JaCoCo Coverage' - continueOnError: true - - task: PublishTestResults@2 - inputs: - testResultsFormat: 'JUnit' - testResultsFiles: 'fabric-chaincode-shim/build/reports/dependency-check-junit.xml' - mergeTestResults: true - failTaskOnFailedTests: false - testRunTitle: OWASP Dependency Check - displayName: 'Publish OWASP Dependency Check JUnit results' - - task: CopyFiles@2 - inputs: - contents: | - fabric-chaincode-shim/build/reports/dependency-check-*.* - targetFolder: $(Build.ArtifactStagingDirectory)/dependency-check - displayName: 'Collect OWASP Dependency Check results' - - task: PublishBuildArtifacts@1 - inputs: - pathToPublish: $(Build.ArtifactStagingDirectory)/dependency-check - artifactName: 'Dependency Check Report' - displayName: 'Publish full OWASP Dependency Check result' - - task: PublishCodeCoverageResults@1 - inputs: - summaryFileLocation: "$(System.DefaultWorkingDirectory)/**/fabric-chaincode-shim/build/reports/jacoco/test/jacocoTestReport.xml" - # Copy the built artifacts to the staging directory, tgz, and the docker image - - script: | - set -ev - ./gradlew -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} publishShimJarPublicationToMavenLocal - tar -zcvf localmaven.tgz ${HOME}/.m2/repository/org/hyperledger - docker image save hyperledger/fabric-javaenv | gzip > $(Build.ArtifactStagingDirectory)/fabric-javaenv.tar.gz - displayName: 'Package tgz and docker image' - - task: PublishBuildArtifacts@1 - inputs: - pathToPublish: localmaven.tgz - artifactName: java-tgz - - task: PublishBuildArtifacts@1 - inputs: - pathToPublish: $(Build.ArtifactStagingDirectory)/fabric-javaenv.tar.gz - artifactName: javaenv-docker-image - - - job: javadoc - dependsOn: displayenv - variables: - ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}: - javadoc_release: main - ${{ if ne(variables['Build.SourceBranch'], 'refs/heads/main') }}: - javadoc_release: $[format('release-{0}',dependencies.displayenv.outputs['BuildData.MINOR_PACKAGE_VERSION'])] - steps: - - script: ./gradlew javadoc - displayName: 'Build JavaDoc' - - script: | - if [ -d docs ]; then - mkdir gh-pages - cp -r docs/* gh-pages - fi - displayName: 'Copy gh-pages doc' - condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') - - script: | - git fetch origin - git checkout -b gh-pages origin/gh-pages - mkdir -p $(javadoc_release)/api - rm -rf $(javadoc_release)/api/* - cp -r fabric-chaincode-shim/build/docs/javadoc/* $(javadoc_release)/api - - # if the gh-pages is present from the previous script, then copy across the files across. - if [ -d gh-pages ]; then - find . -maxdepth 1 ! \( -name [.]* -o -name 'gh-pages' -o -name 'main' -o -name 'release-*' \) -exec rm -rf {} \; - cp -r gh-pages/* . - rm -rf gh-pages - fi - displayName: 'Update gh-pages branch' - - script: | - git config --global user.email "hlfdev.azp@gmail.com" - git config --global user.name "Hyperledger Bot" - git add -A - git commit -m "Publishing GitHub Pages" - git push https://$(GITHUB-PAT)@github.com/hyperledger/fabric-chaincode-java.git gh-pages - displayName: 'Commit gh-pages changes' - condition: and(succeeded(),eq(variables['Build.Reason'], 'IndividualCI')) - - # As the next script is more complex and uses loops, run this discretely in a sh file - # Publishing step for git tags - - stage: Publish_tag - condition: and(succeeded('Build_and_test'), startsWith(variables['Build.SourceBranch'], 'refs/tags')) - jobs: - - job: docker_publish - steps: - - template: templates/build-data.yml - - task: DownloadPipelineArtifact@2 - inputs: - artifact: javaenv-docker-image - path: $(Build.SourcesDirectory)/build - - script: | - wget -qO "$PWD/manifest-tool" https://github.com/estesp/manifest-tool/releases/download/v1.0.0/manifest-tool-linux-amd64 - chmod +x ./manifest-tool - - docker image load --input build/fabric-javaenv.tar.gz - docker images - docker login ${DOCKER_REGISTRY_URL} --username=${DOCKER_REGISTRY_USERNAME} --password=${DOCKER_REGISTRY_PASSWORD} - echo "Logged in to docker registry" - # tag javaenv image to PACKAGE_VERSION - docker tag hyperledger/fabric-javaenv hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION) - # push javaenv to repository - docker push hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION) - ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION)" --target "hyperledger/fabric-javaenv:$(BuildData.PACKAGE_VERSION)" - ./manifest-tool push from-args --platforms linux/amd64 --template "hyperledger/fabric-javaenv:amd64-$(BuildData.PACKAGE_VERSION)" --target "hyperledger/fabric-javaenv:$(BuildData.MINOR_PACKAGE_VERSION)" - env: - DOCKER_REGISTRY_USERNAME: $(DockerHub-Username) - DOCKER_REGISTRY_PASSWORD: $(DockerHub-Password) - - job: jar_publish - steps: - - template: templates/build-data.yml - - task: DownloadSecureFile@1 - name: keyring - inputs: - secureFile: secring.gpg - - script: | - ./gradlew -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PossrhUsername=${OSSRH_USER} -PossrhPassword=${OSSRH_PASSWORD} publishAllPublicationsToReleaseRepository - ./gradlew -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PossrhUsername=${OSSRH_USER} -PossrhPassword=${OSSRH_PASSWORD} publishAllPublicationsToSnapshotRepository - env: - SIGNING_ID: $(JAR-Signing-Id) - SIGNING_PASSWORD: $(JAR-Signing-Password) - KEYRING_FILE: $(keyring.secureFilePath) - OSSRH_USER: $(OSSRH-User) - OSSRH_PASSWORD: $(OSSRH-Password) - - # will re-enable when we get a proper userid/password - # - stage: Publish_tag_nightly - # condition: and(succeeded('Build_and_test'), eq(variables['Build.Reason'], 'Schedule')) # only run on the scheduled builds - # jobs: - # - job: jar_publish - # steps: - # - template: templates/build-data.yml - # - task: DownloadSecureFile@1 - # name: keyring - # inputs: - # secureFile: secring.gpg - # - script: | - # ./gradlew -PNIGHTLY=true -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PartifactoryUsername=${ARTIFACTORY_USER} -PartifactoryhPassword=${ARTIFACTORY_PASSWORD} publishAllPublicationsToReleaseRepository - # ./gradlew -PNIGHTLY=true -Psigning.keyId=${SIGNING_ID} -Psigning.password=${SIGNING_PASSWORD} -Psigning.secretKeyRingFile=${KEYRING_FILE} -PartifactoryUsername=${ARTIFACTORY_USER} -PartifactoryhPassword=${ARTIFACTORY_PASSWORD} publishAllPublicationsToSnapshotRepository - # env: - # SIGNING_ID: $(JAR-Signing-Id) - # SIGNING_PASSWORD: $(JAR-Signing-Password) - # KEYRING_FILE: $(keyring.secureFilePath) - # ARTIFACTORY_USER: $(ARTIFACTORY-User) - # ARTIFACTORY_PASSWORD: $(ARTIFACTORY-Password) diff --git a/ci/publish_jar_nexus.sh b/ci/publish_jar_nexus.sh deleted file mode 100755 index 12ff7625d..000000000 --- a/ci/publish_jar_nexus.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# -# SPDX-License-Identifier: Apache-2.0 -# - -# Exit on first error, print all commands. -set -e -set -o pipefail -WORKSPACE="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" - -function abort { - echo "!! Exiting shell script" - echo "!!" "$1" - exit -1 -} - -for binary in shim; do -echo "Pushing fabric-chaincode-$binary.$PUSH_VERSION.jar to maven releases.." -cp $WORKSPACE/fabric-chaincode-$binary/build/libs/fabric-chaincode-$binary-$PUSH_VERSION.jar $WORKSPACE/fabric-chaincode-$binary/build/libs/fabric-chaincode-$binary.$PUSH_VERSION.jar -mvn org.apache.maven.plugins:maven-deploy-plugin:deploy-file \ - -DupdateReleaseInfo=true \ - -Dfile=$WORKSPACE/fabric-chaincode-$binary/build/libs/fabric-chaincode-$binary.$PUSH_VERSION.jar \ - -DpomFile=$WORKSPACE/fabric-chaincode-$binary/build/publications/"$binary"Jar/pom-default.xml \ - -DrepositoryId=hyperledger-releases \ - -Durl=https://nexus.hyperledger.org/content/repositories/releases/ \ - -DgroupId=org.hyperledger.fabric-chaincode-java \ - -Dversion=$PUSH_VERSION \ - -DartifactId=fabric-chaincode-$binary \ - -DgeneratePom=false \ - -DuniqueVersion=false \ - -Dpackaging=jar \ - -gs $GLOBAL_SETTINGS_FILE -s $SETTINGS_FILE -done \ No newline at end of file diff --git a/ci/templates/build-data.yml b/ci/templates/build-data.yml deleted file mode 100644 index ead7e0bcb..000000000 --- a/ci/templates/build-data.yml +++ /dev/null @@ -1,16 +0,0 @@ -steps: -- script: | - env | sort - java -version - # handle full version number - VERSION=$(./gradlew -q printVersionName | head -n 1 | cut -d'-' -f1) - VERSION=${VERSION// } - echo Current version in code is :${VERSION}: - echo "##vso[task.setvariable variable=PACKAGE_VERSION;isOutput=true]${VERSION}" - # handle minor version - MINOR_VERSION=$(echo $VERSION | sed 's/^\([0-9]\{1,\}\.[0-9]\{1,\}\)\..*/\1/') - MINOR_VERSION=${MINOR_VERSION// } - echo Current minor version in code is :${MINOR_VERSION}: - echo "##vso[task.setvariable variable=MINOR_PACKAGE_VERSION;isOutput=true]${MINOR_VERSION}" - name: BuildData - displayName: 'Build data' diff --git a/examples/fabric-contract-example-as-service/Dockerfile b/examples/fabric-contract-example-as-service/Dockerfile index 8e21e344a..519bfe157 100644 --- a/examples/fabric-contract-example-as-service/Dockerfile +++ b/examples/fabric-contract-example-as-service/Dockerfile @@ -4,7 +4,7 @@ # Example multi-stage dockerfile for Java Chaincode # the first stage -FROM gradle:8-jdk21 AS gradle_build +FROM gradle:9-jdk21 AS gradle_build # copy the build.gradle and src code to the container COPY src/ src/ @@ -15,7 +15,7 @@ RUN gradle build shadowJar # the second stage of our build just needs the compiled files -FROM eclipse-temurin:21-jre +FROM eclipse-temurin:25-jre # copy only the artifacts we need from the first stage and discard the rest COPY --from=gradle_build /home/gradle/build/libs/chaincode.jar /chaincode.jar diff --git a/examples/fabric-contract-example-as-service/build.gradle b/examples/fabric-contract-example-as-service/build.gradle index a8d365247..e81439ace 100644 --- a/examples/fabric-contract-example-as-service/build.gradle +++ b/examples/fabric-contract-example-as-service/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } @@ -13,11 +13,12 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5' - implementation 'org.json:json:20250517' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.1' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.8' + implementation 'org.json:json:20251224' + testImplementation platform('org.junit:junit-bom:6.0.2') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } @@ -25,6 +26,7 @@ shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts b/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts index 92917bedc..62da1a961 100644 --- a/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts +++ b/examples/fabric-contract-example-gradle-kotlin/build.gradle.kts @@ -5,8 +5,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id("com.github.johnrengelman.shadow") version "8.1.1" - id("org.jetbrains.kotlin.jvm") version "1.9.22" + id("com.gradleup.shadow") version "9.3.1" + id("org.jetbrains.kotlin.jvm") version "2.2.21" } @@ -14,12 +14,12 @@ plugins { version = "0.0.1" dependencies { - implementation("org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5") + implementation("org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.8") implementation("org.json:json:20250517") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") - testImplementation("org.junit.jupiter:junit-jupiter:5.13.1") - testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0") + testImplementation("org.junit.jupiter:junit-jupiter:6.0.1") + testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0") } repositories { @@ -34,6 +34,7 @@ tasks { archiveBaseName = "chaincode" archiveVersion = "" archiveClassifier = "" + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { attributes(mapOf("Main-Class" to "org.hyperledger.fabric.contract.ContractRouter")) diff --git a/examples/fabric-contract-example-gradle/build.gradle b/examples/fabric-contract-example-gradle/build.gradle index a4b822229..45dfd56bf 100644 --- a/examples/fabric-contract-example-gradle/build.gradle +++ b/examples/fabric-contract-example-gradle/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } @@ -13,17 +13,20 @@ repositories { } dependencies { - compile 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5' - compile 'org.json:json:20250517' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.1' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.8' + implementation 'org.json:json:20251224' + testImplementation platform('org.junit:junit-bom:6.0.2') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/examples/fabric-contract-example-maven/pom.xml b/examples/fabric-contract-example-maven/pom.xml index 41d2202fc..b7657d2aa 100644 --- a/examples/fabric-contract-example-maven/pom.xml +++ b/examples/fabric-contract-example-maven/pom.xml @@ -12,15 +12,11 @@ UTF-8 - 2.5.5 + 2.5.8 - 1.5.15 - 1.7.5 - - - 5.13.1 - 1.13.1 + 1.5.32 + 2.0.17 @@ -31,7 +27,19 @@ - + + + + org.junit + junit-bom + 6.0.3 + pom + import + + + + + @@ -69,56 +77,48 @@ org.junit.jupiter junit-jupiter-api - ${junit.jupiter.version} compile org.junit.jupiter junit-jupiter-params - ${junit.jupiter.version} test org.junit.jupiter junit-jupiter-engine - ${junit.jupiter.version} test - - - org.mockito - mockito-core - 5.18.0 - - - + + org.mockito + mockito-core + 5.23.0 + org.json json - 20231013 + 20251224 src - maven-surefire-plugin - 2.22.0 + 3.5.5 maven-compiler-plugin - 3.1 + 3.15.0 - ${java.version} - ${java.version} + ${java.version} org.apache.maven.plugins maven-shade-plugin - 3.1.0 + 3.6.2 package diff --git a/examples/ledger-api/build.gradle b/examples/ledger-api/build.gradle index 8f94a9b25..ca4025763 100644 --- a/examples/ledger-api/build.gradle +++ b/examples/ledger-api/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } @@ -13,17 +13,20 @@ repositories { } dependencies { - compile 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.5' - compile 'org.json:json:20250517' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.1' - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.mockito:mockito-core:5.18.0' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.8' + implementation 'org.json:json:20251224' + testImplementation platform('org.junit:junit-bom:6.0.2') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.assertj:assertj-core:3.27.7' + testImplementation 'org.mockito:mockito-core:5.21.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-docker/Dockerfile b/fabric-chaincode-docker/Dockerfile index eeaf43033..db4d4bd59 100644 --- a/fabric-chaincode-docker/Dockerfile +++ b/fabric-chaincode-docker/Dockerfile @@ -1,34 +1,34 @@ -ARG JAVA_IMAGE=eclipse-temurin:21-jdk +ARG JAVA_IMAGE=eclipse-temurin:25-jdk FROM ${JAVA_IMAGE} AS builder -ENV DEBIAN_FRONTEND=noninteractive -# Build tools RUN apt-get update \ - && apt-get -y install zip unzip \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* + && apt-get install -y curl zip unzip RUN curl -s "https://get.sdkman.io" | bash SHELL ["/bin/bash", "-c"] -RUN source /root/.sdkman/bin/sdkman-init.sh \ - && sdk install gradle 8.14.2 \ - && sdk install maven 3.9.10 +RUN . /root/.sdkman/bin/sdkman-init.sh \ + && sdk install gradle 9.3.0 \ + && sdk install maven 3.9.12 FROM ${JAVA_IMAGE} AS dependencies -COPY --from=builder /root/.sdkman/candidates/gradle/current /usr/bin/gradle -COPY --from=builder /root/.sdkman/candidates/maven/current /usr/bin/maven +COPY --from=builder /root/.sdkman/candidates/gradle/current /opt/gradle +COPY --from=builder /root/.sdkman/candidates/maven/current /opt/maven SHELL ["/bin/bash", "-c"] -ENV PATH="/usr/bin/maven/bin:/usr/bin/maven/:/usr/bin/gradle:/usr/bin/gradle/bin:${PATH}" +ENV PATH="/opt/maven/bin:/opt/gradle/bin:${PATH}" # Coping libs, scripts and sources -ADD build/distributions/ /root/ +COPY build/distributions/ /root/ #Creating folders structure -RUN mkdir -p /root/chaincode-java/chaincode/src /root/chaincode-java/chaincode/build/out +RUN mkdir -p \ + /root/chaincode-java/chaincode/src \ + /root/chaincode-java/chaincode/build/out \ + /root/chaincode-java/shim-src/fabric-chaincode-integration-test \ + /root/chaincode-java/shim-src/fabric-chaincode-docker #Making scripts runnable RUN chmod +x /root/chaincode-java/start /root/chaincode-java/build.sh @@ -48,10 +48,10 @@ RUN gradle \ WORKDIR /root/chaincode-java # Run the Gradle and Maven commands to generate the wrapper variants # of each tool -#Gradle doesn't run without settings.gradle file, so create one +# Gradle doesn't run without settings.gradle file, so create one RUN touch settings.gradle \ && gradle wrapper \ - && ./gradlew --version \ + && ./gradlew wrapper \ && mvn -N wrapper:wrapper # Creating final javaenv image which will include all required @@ -59,7 +59,7 @@ RUN touch settings.gradle \ FROM ${JAVA_IMAGE} RUN apt-get update \ - && apt-get -y install zip unzip \ + && apt-get install -y zip unzip \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && mkdir -p /chaincode/input \ diff --git a/fabric-chaincode-docker/build.gradle b/fabric-chaincode-docker/build.gradle index b5dbbeb5c..843ae2ced 100644 --- a/fabric-chaincode-docker/build.gradle +++ b/fabric-chaincode-docker/build.gradle @@ -5,7 +5,7 @@ */ plugins { - id 'com.bmuschko.docker-remote-api' version '9.4.0' + id 'com.bmuschko.docker-remote-api' version '10.0.0' } repositories { @@ -59,5 +59,5 @@ tasks.register('copyAllDeps', Copy) { tasks.register('buildImage', DockerBuildImage) { dependsOn copyAllDeps inputDir = project.file('Dockerfile').parentFile - images = ['hyperledger/fabric-javaenv', 'hyperledger/fabric-javaenv:2.5', 'hyperledger/fabric-javaenv:amd64-2.5.6', 'hyperledger/fabric-javaenv:amd64-latest'] + images = ['hyperledger/fabric-javaenv', 'hyperledger/fabric-javaenv:2.5', 'hyperledger/fabric-javaenv:2.5.9'] } diff --git a/fabric-chaincode-integration-test/build.gradle b/fabric-chaincode-integration-test/build.gradle index 240c506e0..dc4ceeac6 100644 --- a/fabric-chaincode-integration-test/build.gradle +++ b/fabric-chaincode-integration-test/build.gradle @@ -1,7 +1,7 @@ dependencies { implementation project(':fabric-chaincode-docker') implementation project(':fabric-chaincode-shim') - implementation 'org.json:json:20250517' + implementation 'org.json:json:20251224' } diff --git a/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle b/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle index e7479c5cd..43c964fb8 100644 --- a/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle +++ b/fabric-chaincode-integration-test/src/contracts/bare-gradle/build.gradle @@ -1,18 +1,13 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } group 'org.hyperledger.fabric-chaincode-java' version '1.0-SNAPSHOT' -java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 -} - compileJava { - options.compilerArgs.addAll(['--release', '11']) + options.release = 11 } repositories { @@ -23,7 +18,7 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.6' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.9' implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' } @@ -31,6 +26,7 @@ shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml b/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml index fccbc9e0c..4fcc03ad3 100644 --- a/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml +++ b/fabric-chaincode-integration-test/src/contracts/bare-maven/pom.xml @@ -12,7 +12,7 @@ UTF-8 - 2.5.6 + 2.5.9 @@ -21,10 +21,6 @@ jitpack.io https://www.jitpack.io - - artifactory - https://hyperledger.jfrog.io/hyperledger/fabric-maven - localfabirc file://${project.basedir}/repository @@ -47,7 +43,7 @@ maven-compiler-plugin - 3.11.0 + 3.15.0 ${java.version} @@ -55,7 +51,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.0 + 3.6.2 package diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle index 97d990904..c5cc4328b 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/build.gradle @@ -1,18 +1,13 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } group 'org.hyperledger.fabric-chaincode-java' version '' -java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 -} - compileJava { - options.compilerArgs.addAll(['--release', '11']) + options.release = 11 } repositories { @@ -23,7 +18,7 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.6' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.9' implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' } @@ -31,6 +26,7 @@ shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar index d64cd4917..a4b76b953 100644 Binary files a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar and b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.jar differ diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties index e2847c820..d4081da47 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew index 1aa94a426..f5feea6d6 100755 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat index 7101f8e46..9b42019c7 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/gradlew.bat +++ b/fabric-chaincode-integration-test/src/contracts/fabric-ledger-api/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 ########################################################################## diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle index b59cca3cc..830b32c7f 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/build.gradle @@ -1,18 +1,13 @@ plugins { - id 'com.gradleup.shadow' version '8.3.6' + id 'com.gradleup.shadow' version '9.3.1' id 'java' } group 'org.hyperledger.fabric-chaincode-java' version '1.0-SNAPSHOT' -java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 -} - compileJava { - options.compilerArgs.addAll(['--release', '11']) + options.release = 11 } repositories { @@ -23,16 +18,17 @@ repositories { } dependencies { - implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.6' + implementation 'org.hyperledger.fabric-chaincode-java:fabric-chaincode-shim:2.5.9' implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' implementation 'commons-logging:commons-logging:1.3.5' - implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.code.gson:gson:2.13.2' } shadowJar { archiveBaseName = 'chaincode' archiveVersion = '' archiveClassifier = '' + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() manifest { diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar index d64cd4917..1b33c55ba 100644 Binary files a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar and b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.jar differ diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties index e2847c820..d4081da47 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew index 1aa94a426..23d15a936 100755 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,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. @@ -203,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * 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. @@ -211,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 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/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat index 7101f8e46..5eed7ee84 100644 --- a/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/gradlew.bat +++ b/fabric-chaincode-integration-test/src/contracts/fabric-shim-api/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 ########################################################################## @@ -68,11 +70,11 @@ 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 diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar index 7967f30dd..eebc3c18b 100644 Binary files a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar and b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.jar differ diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties index 9548abd8e..ec95f42f3 100644 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/.mvn/wrapper/maven-wrapper.properties @@ -1,20 +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 -# -# http://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. -wrapperVersion=3.3.2 +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.2/maven-wrapper-3.3.2.jar +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-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/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw index 5e9618cac..1ddd97b9e 100755 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.2 +# Apache Maven Wrapper startup batch script, version 3.3.4 # # Required ENV vars: # ------------------ @@ -201,6 +201,14 @@ 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. @@ -212,15 +220,13 @@ else log "Couldn't find $wrapperJarPath, downloading it ..." if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + 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.2/maven-wrapper-3.3.2.jar" + 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 - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') case "$key" in wrapperUrl) - wrapperUrl="$safeValue" + wrapperUrl=$(trim "${value-}") break ;; esac @@ -235,17 +241,17 @@ else log "Found wget ... using wget" [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + wget ${QUIET:+"$QUIET"} "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + 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 -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + curl ${QUIET:+"$QUIET"} -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + 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" @@ -276,7 +282,7 @@ fi wrapperSha256Sum="" while IFS="=" read -r key value; do case "$key" in wrapperSha256Sum) - wrapperSha256Sum=$value + wrapperSha256Sum=$(trim "${value-}") break ;; esac @@ -284,7 +290,7 @@ 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 + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c - >/dev/null 2>&1; then wrapperSha256Result=true fi elif command -v shasum >/dev/null; then diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd index 1204076a9..c453424c6 100644 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/mvnw.cmd @@ -18,7 +18,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@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 @@ -119,7 +119,7 @@ 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.2/maven-wrapper-3.3.2.jar" +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 @@ -133,7 +133,7 @@ if exist %WRAPPER_JAR% ( ) ) else ( if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + 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 ... diff --git a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml index 894443ea7..bf64b2736 100644 --- a/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml +++ b/fabric-chaincode-integration-test/src/contracts/wrapper-maven/pom.xml @@ -12,7 +12,7 @@ UTF-8 - 2.5.6 + 2.5.9 @@ -47,7 +47,7 @@ maven-compiler-plugin - 3.11.0 + 3.15.0 ${java.version} @@ -55,7 +55,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.0 + 3.6.2 package diff --git a/fabric-chaincode-shim/build.gradle b/fabric-chaincode-shim/build.gradle index 896f86c88..d5f39a14d 100644 --- a/fabric-chaincode-shim/build.gradle +++ b/fabric-chaincode-shim/build.gradle @@ -6,13 +6,14 @@ plugins { id 'maven-publish' - id 'jacoco' id 'signing' + id 'jacoco' id 'pmd' + id "com.gradleup.nmcp" } pmd { - toolVersion = '7.14.0' + toolVersion = '7.20.0' ruleSetFiles = files('../pmd-ruleset.xml') ruleSets = [] // explicitly set to empty to avoid using the default configuration ignoreFailures = false @@ -20,27 +21,30 @@ pmd { pmdTest.enabled = false -configurations { - runtimeClasspath { - resolutionStrategy.activateDependencyLocking() - } +dependencyLocking { + lockAllConfigurations() } -tasks.withType(org.gradle.api.tasks.testing.Test) { +tasks.withType(Test).configureEach { systemProperty 'CORE_CHAINCODE_LOGGING_LEVEL', 'DEBUG' } dependencies { - implementation platform('com.google.protobuf:protobuf-bom:4.31.1') - implementation platform('io.grpc:grpc-bom:1.73.0') - implementation platform('io.opentelemetry:opentelemetry-bom:1.51.0') + constraints { + pmd('org.apache.commons:commons-lang3:3.19.0') { + because('CVE-2025-48924') + } + } + implementation platform('com.google.protobuf:protobuf-bom:4.33.4') + implementation platform('io.grpc:grpc-bom:1.78.0') + implementation platform('io.opentelemetry:opentelemetry-bom:1.58.0') implementation 'org.hyperledger.fabric:fabric-protos:0.3.7' - implementation 'org.bouncycastle:bcpkix-jdk18on:1.81' - implementation 'org.bouncycastle:bcprov-jdk18on:1.81' - implementation 'io.github.classgraph:classgraph:4.8.179' + implementation 'org.bouncycastle:bcpkix-jdk18on:1.83' + implementation 'org.bouncycastle:bcprov-jdk18on:1.83' + implementation 'io.github.classgraph:classgraph:4.8.184' implementation 'com.github.erosb:everit-json-schema:1.14.6' - implementation 'org.json:json:20250517' + implementation 'org.json:json:20251224' implementation 'com.google.protobuf:protobuf-java-util' implementation 'io.grpc:grpc-netty-shaded' @@ -49,14 +53,14 @@ dependencies { testImplementation 'io.grpc:grpc-inprocess' implementation 'io.opentelemetry:opentelemetry-api' - implementation 'io.opentelemetry.proto:opentelemetry-proto:1.7.0-alpha' + implementation 'io.opentelemetry.proto:opentelemetry-proto:1.9.0-alpha' implementation 'io.opentelemetry:opentelemetry-sdk' implementation 'io.opentelemetry:opentelemetry-sdk-extension-autoconfigure' implementation 'io.opentelemetry:opentelemetry-sdk-trace' implementation 'io.opentelemetry:opentelemetry-exporter-otlp' implementation 'io.opentelemetry:opentelemetry-extension-trace-propagators' - implementation 'io.opentelemetry.semconv:opentelemetry-semconv:1.32.0' - implementation 'io.opentelemetry.instrumentation:opentelemetry-grpc-1.6:2.16.0-alpha' + implementation 'io.opentelemetry.semconv:opentelemetry-semconv:1.37.0' + implementation 'io.opentelemetry.instrumentation:opentelemetry-grpc-1.6:2.24.0-alpha' } sourceSets { @@ -74,10 +78,6 @@ sourceSets { } -jacoco { - toolVersion = "0.8.12" -} - jacocoTestReport { afterEvaluate { classDirectories.from = files(classDirectories.files.collect { @@ -137,7 +137,7 @@ jacocoTestCoverageVerification { test.finalizedBy(jacocoTestReport) test.finalizedBy(jacocoTestCoverageVerification) -task licenseCheck { +tasks.register('licenseCheck') { group = "license" description = "Checks the License part of each source file" @@ -146,34 +146,37 @@ task licenseCheck { def missing = new LinkedList() sourceSets.forEach { sourceSet -> - sourceSet.allSource.findAll { !it.path.contains("build") && !(it.path.contains("test") && it.path.contains("resources"))}.each { + sourceSet.allSource.findAll { + !it.path.contains("build") && + !(it.path.contains("test") && it.path.contains("resources")) + }.each { file -> - if (!file.name.contains("json")){ - BufferedReader r = new BufferedReader(new FileReader(file)) - def line, hasSPDX = false, hasTraditional = false - while ((line = r.readLine()) != null) { - if (line.contains("SPDX-License-Identifier")) { - hasSPDX = true - break - } - if (line.contains("http://www.apache.org/licenses/LICENSE-2.0")) { - hasTraditional = true - break + if (!file.name.contains("json")) { + BufferedReader r = new BufferedReader(new FileReader(file)) + def line, hasSPDX = false, hasTraditional = false + while ((line = r.readLine()) != null) { + if (line.contains("SPDX-License-Identifier")) { + hasSPDX = true + break + } + if (line.contains("http://www.apache.org/licenses/LICENSE-2.0")) { + hasTraditional = true + break + } } - } - if (!hasSPDX) { - if (hasTraditional) { - noSPDX.add(file) - } else { - missing.add(file) + if (!hasSPDX) { + if (hasTraditional) { + noSPDX.add(file) + } else { + missing.add(file) + } } } - } } } if (noSPDX.isEmpty()) { - println "All remaining files have Apache 2.0 headers" + println "All remaining files have Apache 2.0 headers." } else { println "We are standardizing with the SPDX style license headers." println "The following files contain the traditional license headers which are still valid:" @@ -212,21 +215,17 @@ javadoc { classpath = sourceSets.main.runtimeClasspath - javadoc.options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('Xwerror', '-quiet') options.overview = "src/main/java/org/hyperledger/fabric/overview.html" -} -if (JavaVersion.current().isJava8Compatible()) { - project.tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:all', '-quiet') - options.addStringOption('Xwerror', '-quiet') - } } +def final stagingDeployUrl = layout.buildDirectory.dir('staging-deploy') publishing { - publications { - shim(MavenPublication) { + publications { + shim(MavenPublication) { groupId = project.group artifactId = project.name version = project.version @@ -235,10 +234,12 @@ publishing { name = 'JavaChaincodeShim' packaging = 'jar' description = 'Hyperledger Fabric Java Chaincode Shim' - url = 'http://www.hyperledger.org/' + url = 'https://hyperledger.github.io/fabric-chaincode-java/' scm { - url = 'https://github.com/hyperledger/fabric-chaincode-java.git' + connection = 'scm:git:https://github.com/hyperledger/fabric-chaincode-java.git' + developerConnection = 'scm:git:ssh://github.com:hyperledger/fabric-chaincode-java.git' + url = 'https://github.com/hyperledger/fabric-chaincode-java' } licenses { license { @@ -248,45 +249,24 @@ publishing { } developers { - developer { - id = 'gennadylaventman' - name = 'Gennady Laventman' - email = 'gennady@il.ibm.com' - } - developer { - id = 'luiss' - name = 'Luis Sanchez' - email = 'luiss@me.com' - } - developer { - id = 'C0rWin' - name = 'Artem Barger' - email = 'bartem@il.ibm.com' - } developer { id = 'denyeart' name = 'David Enyeart' email = 'enyeart@us.ibm.com' } + developer { + id = 'bestbeforetoday' + name = 'Mark S. Lewis' + email = 'Mark.S.Lewis@outlook.com' + } } } - } - - } - - repositories { - maven { - name = "release" - url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - credentials { - username = project.findProperty('ossrhUsername') - password = project.findProperty('ossrhPassword') - } - } + } + repositories { maven { - name = "GitHubPackages" + name = "GitHub" url = "https://maven.pkg.github.com/hyperledger/fabric-chaincode-java" credentials { username = System.getenv("GITHUB_ACTOR") @@ -297,25 +277,24 @@ publishing { } signing { - println "Signing" - if (project.findProperty('signing.key')) { - def signingKey = project.findProperty('signing.key') - def signingPassword = project.findProperty('signing.password') - useInMemoryPgpKeys(signingKey, signingPassword) - - sign publishing.publications.shim - println "... signed" - } else { - println "... no keys to use " + def signingKey = findProperty('signingKey') + def signingPassword = findProperty('signingPassword') + useInMemoryPgpKeys(signingKey, signingPassword) + + required = { + gradle.taskGraph.hasTask(":${project.name}:publishShimPublicationToNmcpRepository") + || gradle.taskGraph.hasTask(":${project.name}:publishShimPublicationToGitHubRepository") } + + sign publishing.publications.shim } // Need to specify the sourcesJar task BEFORE the java{withSourcesJar()} so that it picks up the duplicatesStratergy // otherwise this fails with a duplicates error. // (see https://github.com/gradle/gradle/issues/17236) -task sourcesJar(type: Jar) { - duplicatesStrategy = 'include' +tasks.register('sourcesJar', Jar) { + duplicatesStrategy = DuplicatesStrategy.INCLUDE archiveClassifier = 'sources' from sourceSets.main.allSource } @@ -332,16 +311,16 @@ build.dependsOn licenseCheck import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent -tasks.withType(Test) { +tasks.withType(Test).configureEach { environment "CORE_PEER_LOCALMSPID", "mymsp" testLogging { // set options for log level LIFECYCLE events TestLogEvent.FAILED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.STANDARD_OUT + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.STANDARD_OUT exceptionFormat = TestExceptionFormat.FULL showExceptions = true showCauses = true @@ -350,22 +329,23 @@ tasks.withType(Test) { // set options for log level DEBUG and INFO debug { events TestLogEvent.STARTED, - TestLogEvent.FAILED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED, - TestLogEvent.STANDARD_ERROR, - TestLogEvent.STANDARD_OUT + TestLogEvent.FAILED, + TestLogEvent.PASSED, + TestLogEvent.SKIPPED, + TestLogEvent.STANDARD_ERROR, + TestLogEvent.STANDARD_OUT exceptionFormat = TestExceptionFormat.FULL } info.events = debug.events info.exceptionFormat = debug.exceptionFormat - afterSuite { desc, result -> + afterSuite {desc, result -> if (!desc.parent) { // will match the outermost suite def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)" def startItem = '| ', endItem = ' |' def repeatLength = startItem.length() + output.length() + endItem.length() - println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength)) + println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + + ('-' * repeatLength)) } } } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java index 35720635b..4e8a6e4a3 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/Logger.java @@ -14,11 +14,15 @@ /** Logger class to use throughout the Contract Implementation. */ public class Logger extends java.util.logging.Logger { + /** + * Subclasses must ensure that a parent logger is set appropriately, for example: + * + *

{@code logger.setParent(java.util.logging.Logger.getLogger("org.hyperledger.fabric"))} + * + * @param name A name for the logger. + */ protected Logger(final String name) { super(name, null); - - // ensure that the parent logger is set - super.setParent(java.util.logging.Logger.getLogger("org.hyperledger.fabric")); } /** @@ -26,7 +30,9 @@ protected Logger(final String name) { * @return Logger */ public static Logger getLogger(final String name) { - return new Logger(name); + Logger result = new Logger(name); + result.setParent(java.util.logging.Logger.getLogger("org.hyperledger.fabric")); + return result; } /** @param msgSupplier */ diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java index d7b6f9e5d..f8a4232cb 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/ContractRouter.java @@ -102,7 +102,7 @@ void startRouting() { } } - @SuppressWarnings("PMD.AvoidCatchingThrowable") + @SuppressWarnings("PMD.AvoidCatchingGenericException") private Response processRequest(final ChaincodeStub stub) { LOGGER.info(() -> "Got invoke routing request"); try { diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java index ac2e33b99..c6dd1b927 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/execution/JSONTransactionSerializer.java @@ -26,7 +26,12 @@ /** Used as the default serialisation for transmission from SDK to Contract. */ @Serializer() -@SuppressWarnings({"PMD.GodClass", "PMD.AvoidLiteralsInIfCondition", "PMD.AvoidDuplicateLiterals"}) +@SuppressWarnings({ + "PMD.GodClass", + "PMD.AvoidLiteralsInIfCondition", + "PMD.AvoidDuplicateLiterals", + "PMD.AvoidDeeplyNestedIfStmts" +}) public class JSONTransactionSerializer implements SerializerInterface { private static final Logger LOGGER = Logger.getLogger(JSONTransactionSerializer.class.getName()); private final TypeRegistry typeRegistry = TypeRegistry.getRegistry(); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java index 99a41e03d..ecd406e88 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/contract/routing/impl/SerializerRegistryImpl.java @@ -8,6 +8,7 @@ import io.github.classgraph.ClassGraph; import io.github.classgraph.ClassInfo; import io.github.classgraph.ScanResult; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -41,15 +42,20 @@ public SerializerInterface getSerializer(final String name, final Serializer.TAR return contents.get(key); } - private SerializerInterface add( - final String name, final Serializer.TARGET target, final Class clazz) + private void add(final String name, final Serializer.TARGET target, final Class clazz) throws InstantiationException, IllegalAccessException { LOGGER.debug(() -> "Adding new Class " + clazz.getCanonicalName() + " for " + target); final String key = name + ":" + target; - final SerializerInterface newObj = clazz.newInstance(); - this.contents.put(key, newObj); - - return newObj; + try { + final SerializerInterface newObj = + (SerializerInterface) clazz.getDeclaredConstructor().newInstance(); + this.contents.put(key, newObj); + } catch (InvocationTargetException | NoSuchMethodException e) { + InstantiationException wrapper = new InstantiationException( + "Exception constructing " + clazz.getCanonicalName() + ": " + e.getMessage()); + wrapper.addSuppressed(e); + throw wrapper; + } } /** @@ -67,10 +73,10 @@ public void findAndSetContents() throws InstantiationException, IllegalAccessExc final Set seenClass = new HashSet<>(); try (ScanResult scanResult = classGraph.scan()) { - for (final ClassInfo classInfo : - scanResult.getClassesWithAnnotation(this.ANNOTATION_CLASS.getCanonicalName())) { + for (final ClassInfo classInfo : scanResult.getClassesWithAnnotation(ANNOTATION_CLASS.getCanonicalName())) { LOGGER.debug(() -> "Found class with contract annotation: " + classInfo.getName()); - final Class cls = (Class) classInfo.loadClass(); + + final Class cls = classInfo.loadClass(); LOGGER.debug("Loaded class"); final String className = cls.getCanonicalName(); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java index 5d204ba20..347c516e3 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/ledger/impl/LedgerImpl.java @@ -16,7 +16,6 @@ public final class LedgerImpl implements Ledger { * * @param ctx Context transactional context to use */ - @SuppressWarnings("PMD.UnusedFormalParameter") public LedgerImpl(final Context ctx) { // Empty stub } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java index 8197be59e..865c93813 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ChaincodeServerProperties.java @@ -41,7 +41,7 @@ public ChaincodeServerProperties() { * @param permitKeepAliveWithoutCalls whether clients are allowed to send keep-alive HTTP/2 PINGs even if there are * no outstanding RPCs on the connection. */ - @SuppressWarnings({"PMD.UnusedFormalParameter", "PMD.NullAssignment"}) + @SuppressWarnings({"PMD.NullAssignment"}) public ChaincodeServerProperties( final int portChaincodeServer, final int maxInboundMetadataSize, diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java index 56cae1a03..0cc6b08e7 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ext/sbe/impl/StateBasedEndorsementImpl.java @@ -52,7 +52,7 @@ public byte[] policy() { @Override public void addOrgs(final RoleType role, final String... organizations) { MSPRoleType mspRole; - if (RoleType.RoleTypeMember.equals(role)) { + if (RoleType.RoleTypeMember == role) { mspRole = MSPRoleType.MEMBER; } else { mspRole = MSPRoleType.PEER; @@ -78,7 +78,7 @@ public List listOrgs() { private void setMSPIDsFromSP(final SignaturePolicyEnvelope spe) { spe.getIdentitiesList().stream() - .filter(identity -> Classification.ROLE.equals(identity.getPrincipalClassification())) + .filter(identity -> Classification.ROLE == identity.getPrincipalClassification()) .forEach(this::addOrg); } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java index 1f502b366..38865e2de 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/ChaincodeInvocationTask.java @@ -96,7 +96,7 @@ public ChaincodeMessage call() { // Call chaincode's invoke // Note in Fabric v2, there won't be any INIT - if (this.type.equals(Type.INIT)) { + if (this.type == Type.INIT) { result = chaincode.init(stub); } else { result = chaincode.invoke(stub); diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java index 893502040..fdddfb759 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/impl/QueryResultsIteratorImpl.java @@ -107,7 +107,7 @@ public T next() { } @Override - public void close() throws Exception { + public void close() { final ByteString requestPayload = QueryStateClose.newBuilder() .setId(currentQueryResponse.getId()) diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java index e31dfcb68..f37b6cab4 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIterator.java @@ -12,4 +12,7 @@ * * @param the type of elements returned by the iterator */ -public interface QueryResultsIterator extends Iterable, AutoCloseable {} +public interface QueryResultsIterator extends Iterable, AutoCloseable { + @Override + void close(); +} diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java index b5c45cfa4..9bed89aa4 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/shim/ledger/QueryResultsIteratorWithMetadata.java @@ -18,4 +18,7 @@ public interface QueryResultsIteratorWithMetadata extends Iterable, AutoCloseable { /** @return Query Metadata */ QueryResponseMetadata getMetadata(); + + @Override + void close(); } diff --git a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java index 4801ebe33..a834af040 100644 --- a/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java +++ b/fabric-chaincode-shim/src/main/java/org/hyperledger/fabric/traces/impl/OpenTelemetryTracesProvider.java @@ -67,6 +67,6 @@ public Span createSpan(final ChaincodeStub stub) { @Override public ClientInterceptor createInterceptor() { - return grpcTracer.newClientInterceptor(); + return grpcTracer.createClientInterceptor(); } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b953..61285a659 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff23a68d7..19a6bdeb8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d6..adff685a0 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * 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 9b42019c7..e509b2dd8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @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%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/scripts/changelog.sh b/scripts/changelog.sh deleted file mode 100755 index b74634c42..000000000 --- a/scripts/changelog.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh -# -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# -set -ev - -PREVIOUS_TAG=$1 -NEW_VERSION=$2 - -: ${PREVIOUS_TAG:?} -: ${NEW_VERSION:?} - -echo "## ${NEW_VERSION}" >> CHANGELOG.new -echo "$(date)" >> CHANGELOG.new -echo "" >> CHANGELOG.new -git log ${PREVIOUS_TAG}..HEAD --oneline | grep -v Merge | sed -e "s/\[\{0,1\}\(FAB[^0-9]*-[0-9]*\)\]\{0,1\}/\[\1\](https:\/\/jira.hyperledger.org\/browse\/\1\)/" -e "s/\([0-9|a-z]*\)/* \[\1\](https:\/\/github.com\/hyperledger\/fabric-chaincode-java\/commit\/\1)/" >> CHANGELOG.new -echo "" >> CHANGELOG.new -cat CHANGELOG.md >> CHANGELOG.new -mv -f CHANGELOG.new CHANGELOG.md - diff --git a/scripts/gittag.sh b/scripts/gittag.sh deleted file mode 100755 index c41fd8062..000000000 --- a/scripts/gittag.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# -# SPDX-License-Identifier: Apache-2.0 -# - -# Exit on first error, print all commands. -set -e -set -o pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" - -# release name -RELEASE=release-1.4 - -function abort { - echo "!! Exiting shell script" - echo "!!" "$1" - exit -1 -} - -# Run printVersionName task in the root directory, grab the first line and remove anything after the version number -VERSION=$(cd ../ && ./gradlew -q printVersionName | head -n 1 | cut -d'-' -f1) - -echo New version string will be v${VERSION} - -# do the release notes for this new version exist? -if [[ -f "${DIR}/release_notes/v${VERSION}.txt" ]]; then - echo "Release notes exist, hope they make sense!" -else - abort "No releases notes under the file ${DIR}/release_notes/v${NEW_VERSION}.txt exist"; -fi - -git checkout "${RELEASE}" -git pull -git tag -a "v${VERSION}" `git log -n 1 --pretty=oneline | head -c7` -F release_notes/"v${VERSION}".txt -git push origin v${VERSION} HEAD:refs/heads/${RELEASE} \ No newline at end of file diff --git a/scripts/multiarch.sh b/scripts/multiarch.sh deleted file mode 100755 index 5795a46fd..000000000 --- a/scripts/multiarch.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -# -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# - -usage() { - echo "Usage: $0 " - echo " and credentials for the repository" - echo "ENV:" - echo " NS=$NS" - echo " VERSION=$VERSION" - echo " TWO_DIGIT_VERSION=$TWO_DIGIT_VERSION" - exit 1 -} - -missing() { - echo "Error: some image(s) missing from registry" - echo "ENV:" - echo " NS=$NS" - echo " VERSION=$VERSION" - echo " TWO_DIGIT_VERSION=$TWO_DIGIT_VERSION" - exit 1 -} - -failed() { - echo "Error: multiarch manifest push failed" - echo "ENV:" - echo " NS=$NS" - echo " VERSION=$VERSION" - echo " TWO_DIGIT_VERSION=$TWO_DIGIT_VERSION" - exit 1 -} - -USER=${1:-nobody} -PASSWORD=${2:-nohow} -NS=${NS:-hyperledger} -VERSION=${BASE_VERSION:-1.3.0} -TWO_DIGIT_VERSION=${TWO_DIGIT_VERSION:-1.3} - -if [ "$#" -ne 2 ]; then - usage -fi - -# verify that manifest-tool is installed and found on PATH -which manifest-tool -if [ "$?" -ne 0 ]; then - echo "manifest-tool not installed or not found on PATH" - exit 1 -fi - -IMAGES="fabric-javaenv" - -# check that all images have been published -for image in ${IMAGES}; do - docker pull ${NS}/${image}:amd64-${VERSION} || missing -done - -# push the multiarch manifest and tag with just $VERSION and 'latest' -for image in ${IMAGES}; do - manifest-tool --username ${USER} --password ${PASSWORD} push from-args\ - --platforms linux/amd64 --template "${NS}/${image}:ARCH-${VERSION}"\ - --target "${NS}/${image}:${VERSION}" -# manifest-tool --username ${USER} --password ${PASSWORD} push from-args\ -# --platforms linux/amd64 --template "${NS}/${image}:ARCH-${VERSION}"\ -# --target "${NS}/${image}:latest" - manifest-tool --username ${USER} --password ${PASSWORD} push from-args\ - --platforms linux/amd64 --template "${NS}/${image}:ARCH-${VERSION}"\ - --target "${NS}/${image}:${TWO_DIGIT_VERSION}" -done - -# test that manifest is working as expected -for image in ${IMAGES}; do - docker pull ${NS}/${image}:${VERSION} || failed - docker pull ${NS}/${image}:${TWO_DIGIT_VERSION} || failed -# docker pull ${NS}/${image}:latest || failed -done - -echo "Successfully pushed multiarch manifest" -exit 0 diff --git a/scripts/verify-commit.sh b/scripts/verify-commit.sh deleted file mode 100755 index 0fb1dcd8d..000000000 --- a/scripts/verify-commit.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -ue - -# -# SPDX-License-Identifier: Apache-2.0 -############################################################################## -# Copyright (c) 2018 IBM Corporation, The Linux Foundation and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License 2.0 -# which accompanies this distribution, and is available at -# https://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# This script makes several basic commit message validations. -# This is with the purpose of keeping up with the aesthetics of our code. -# Verify if the commit message contains JIRA URLs. -# its-jira pluggin attempts to process jira links and breaks. - -set +ue # Temporarily ignore any errors - -set -o pipefail -echo "----> verify-commit.sh" - -if git rev-list --format=%B --max-count=1 HEAD | grep -io 'http[s]*://jira\..*' > /dev/null ; then - echo 'Error: Remove JIRA URLs from commit message' - echo 'Add jira references as: Issue: -, instead of URLs' - exit 1 -fi - -# Check for trailing white-space (tab or spaces) in any files that were changed -#commit_files=$(git diff-tree --name-only -r HEAD~2..HEAD) -commit_files=$(find ./fabric-chaincode-shim/src -name *.java) - -found_trailing=false -for filename in $commit_files; do - if [[ $(file -b $filename) == "ASCII text"* ]]; then - if egrep -q "\s$" $filename; then - found_trailing=true - echo "Error: Trailing white spaces found in file: $filename" - fi - fi -done - -#if $found_trailing; then -# echo "#### filename:line-num:line ####" -# egrep -n "\s$" $commit_files -# exit 1 -#fi \ No newline at end of file