diff --git a/.github/workflows/java-publish-maven.yml b/.github/workflows/java-publish-maven.yml
index d8ca560ab7..2f773efba3 100644
--- a/.github/workflows/java-publish-maven.yml
+++ b/.github/workflows/java-publish-maven.yml
@@ -279,6 +279,77 @@ jobs:
if-no-files-found: error
retention-days: 1
+ build-linuxmusl-arm64-classifier:
+ name: Build Linux musl ARM64 native classifier
+ needs: resolve-source
+ runs-on: ubuntu-24.04-arm
+ permissions:
+ contents: read
+ defaults:
+ run:
+ shell: bash
+ working-directory: ./java
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ ref: ${{ needs.resolve-source.outputs.validated_source }}
+ fetch-depth: 1
+ persist-credentials: false
+
+ - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 22
+ package-manager-cache: false
+
+ - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
+ with:
+ java-version: "25"
+ distribution: "microsoft"
+ cache: "maven"
+
+ - name: Build and validate linuxmusl-arm64 classifier
+ run: |
+ set -euo pipefail
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.validated_source }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved release source."
+ exit 1
+ fi
+ VERSION="${{ needs.resolve-source.outputs.release_version }}"
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ "eclipse-temurin:25-jdk-alpine" \
+ sh -c "apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-arm64 &&
+ mvn -B -pl copilot-native package -DskipTests -Dcopilot.native.libc=musl -Drevision=$VERSION &&
+ chown -R \$HOST_UID:\$HOST_GID copilot-native/target"
+ JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION-linuxmusl-arm64.jar"
+ PRIMARY_JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION.jar"
+ test -f "$JAR"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-arm64 "$JAR" "$(basename "$JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs placeholder "$PRIMARY_JAR"
+ MANIFEST="copilot-native/target/linuxmusl-arm64-$VERSION.sha256"
+ HASH=$(sha256sum "$JAR" | cut -d ' ' -f 1)
+ printf '%s %s' "$HASH" "$(basename "$JAR")" > "$MANIFEST"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: java-native-linuxmusl-arm64-release-${{ github.run_id }}-${{ github.run_attempt }}
+ path: |
+ java/copilot-native/target/copilot-sdk-java-runtime-${{ needs.resolve-source.outputs.release_version }}-linuxmusl-arm64.jar
+ java/copilot-native/target/linuxmusl-arm64-${{ needs.resolve-source.outputs.release_version }}.sha256
+ if-no-files-found: error
+ retention-days: 1
+
build-windows-x64-classifier:
name: Build Windows x64 native classifier
needs: resolve-source
@@ -518,6 +589,7 @@ jobs:
resolve-source,
build-linux-arm64-classifier,
build-linuxmusl-x64-classifier,
+ build-linuxmusl-arm64-classifier,
build-windows-x64-classifier,
build-windows-arm64-classifier,
build-darwin-classifier,
@@ -565,6 +637,11 @@ jobs:
name: java-native-linuxmusl-x64-release-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/java-native-linuxmusl-x64
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: java-native-linuxmusl-arm64-release-${{ github.run_id }}-${{ github.run_attempt }}
+ path: ${{ runner.temp }}/java-native-linuxmusl-arm64
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: java-native-win32-x64-release-${{ github.run_id }}-${{ github.run_attempt }}
@@ -648,6 +725,27 @@ jobs:
echo "linuxmusl_x64_jar=$JAR" >> "$GITHUB_OUTPUT"
echo "linuxmusl_x64_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+ - name: Verify immutable source and Linux musl ARM64 classifier
+ id: linuxmusl-arm64-artifact
+ run: |
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.validated_source }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved release source."
+ exit 1
+ fi
+ VERSION="${{ needs.resolve-source.outputs.release_version }}"
+ ARTIFACT_DIRECTORY="${{ runner.temp }}/java-native-linuxmusl-arm64"
+ JAR="$ARTIFACT_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-arm64.jar"
+ MANIFEST="$ARTIFACT_DIRECTORY/linuxmusl-arm64-$VERSION.sha256"
+ test -f "$JAR"
+ test -f "$MANIFEST"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ classifier linuxmusl-arm64 "$JAR" "$(basename "$JAR")" "$GITHUB_WORKSPACE"
+ echo "linuxmusl_arm64_jar=$JAR" >> "$GITHUB_OUTPUT"
+ echo "linuxmusl_arm64_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+
- name: Verify immutable source and Darwin classifier
id: darwin-artifact
run: |
@@ -718,6 +816,7 @@ jobs:
mvn -B deploy -DskipTests -DskipITs -Prelease -Drevision="$VERSION" -Dcopilot.native.libc=glibc \
"-Dcopilot.native.external.linux.arm64.classifier.path=${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}" \
"-Dcopilot.native.external.linuxmusl.x64.classifier.path=${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}" \
+ "-Dcopilot.native.external.linuxmusl.arm64.classifier.path=${{ steps.linuxmusl-arm64-artifact.outputs.linuxmusl_arm64_jar }}" \
"-Dcopilot.native.external.win32.classifier.path=${{ steps.windows-artifact.outputs.windows_jar }}" \
"-Dcopilot.native.external.win32.arm64.classifier.path=${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}" \
"-Dcopilot.native.external.darwin.classifier.path=${{ steps.darwin-artifact.outputs.darwin_jar }}" \
@@ -757,6 +856,7 @@ jobs:
echo "| \`linux-x64\` | \`ubuntu-latest\` | \`$(basename "$LINUX_JAR")\` | \`$LINUX_SHA\` | Published |"
echo "| \`linux-arm64\` | \`ubuntu-24.04-arm\` | \`$(basename "${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}")\` | \`${{ steps.linux-arm64-artifact.outputs.linux_arm64_sha }}\` | Published |"
echo "| \`linuxmusl-x64\` | \`Alpine x64\` | \`$(basename "${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}")\` | \`${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_sha }}\` | Published |"
+ echo "| \`linuxmusl-arm64\` | \`Alpine ARM64\` | \`$(basename "${{ steps.linuxmusl-arm64-artifact.outputs.linuxmusl_arm64_jar }}")\` | \`${{ steps.linuxmusl-arm64-artifact.outputs.linuxmusl_arm64_sha }}\` | Published |"
echo "| \`win32-x64\` | \`windows-latest\` | \`$(basename "${{ steps.windows-artifact.outputs.windows_jar }}")\` | \`${{ steps.windows-artifact.outputs.windows_sha }}\` | Published |"
echo "| \`win32-arm64\` | \`windows-11-arm\` | \`$(basename "${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}")\` | \`${{ steps.windows-arm64-artifact.outputs.windows_arm64_sha }}\` | Published |"
echo "| \`darwin-x64\` | \`macos-15-intel\` | \`$(basename "${{ steps.darwin-x64-artifact.outputs.darwin_x64_jar }}")\` | \`${{ steps.darwin-x64-artifact.outputs.darwin_x64_sha }}\` | Published |"
diff --git a/.github/workflows/java-publish-snapshot.yml b/.github/workflows/java-publish-snapshot.yml
index ce5b8c5f4e..77d5287964 100644
--- a/.github/workflows/java-publish-snapshot.yml
+++ b/.github/workflows/java-publish-snapshot.yml
@@ -171,6 +171,80 @@ jobs:
if-no-files-found: error
retention-days: 1
+ build-linuxmusl-arm64-classifier:
+ name: Build Linux musl ARM64 snapshot classifier
+ needs: resolve-source
+ runs-on: ubuntu-24.04-arm
+ permissions:
+ contents: read
+ outputs:
+ version: ${{ steps.build.outputs.version }}
+ defaults:
+ run:
+ shell: bash
+ working-directory: ./java
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ ref: ${{ github.sha }}
+ fetch-depth: 1
+ persist-credentials: false
+
+ - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 22
+
+ - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
+ with:
+ java-version: "25"
+ distribution: "microsoft"
+ cache: "maven"
+
+ - name: Build and validate linuxmusl-arm64 classifier
+ id: build
+ run: |
+ set -euo pipefail
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.source_sha }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved snapshot source."
+ exit 1
+ fi
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ "eclipse-temurin:25-jdk-alpine" \
+ sh -c "apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-arm64 &&
+ mvn -B -pl copilot-native package -DskipTests -Dcopilot.native.libc=musl &&
+ chown -R \$HOST_UID:\$HOST_GID copilot-native/target"
+ JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION-linuxmusl-arm64.jar"
+ PRIMARY_JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION.jar"
+ test -f "$JAR"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-arm64 "$JAR" "$(basename "$JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs placeholder "$PRIMARY_JAR"
+ MANIFEST="copilot-native/target/linuxmusl-arm64-$VERSION.sha256"
+ HASH=$(sha256sum "$JAR" | cut -d ' ' -f 1)
+ printf '%s %s' "$HASH" "$(basename "$JAR")" > "$MANIFEST"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: java-native-linuxmusl-arm64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
+ path: |
+ java/copilot-native/target/copilot-sdk-java-runtime-${{ steps.build.outputs.version }}-linuxmusl-arm64.jar
+ java/copilot-native/target/linuxmusl-arm64-${{ steps.build.outputs.version }}.sha256
+ if-no-files-found: error
+ retention-days: 1
+
build-windows-x64-classifier:
name: Build Windows x64 snapshot classifier
needs: resolve-source
@@ -426,6 +500,7 @@ jobs:
resolve-source,
build-linux-arm64-classifier,
build-linuxmusl-x64-classifier,
+ build-linuxmusl-arm64-classifier,
build-windows-x64-classifier,
build-windows-arm64-classifier,
build-darwin-classifier,
@@ -468,6 +543,11 @@ jobs:
name: java-native-linuxmusl-x64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
path: ${{ runner.temp }}/java-native-linuxmusl-x64
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: java-native-linuxmusl-arm64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
+ path: ${{ runner.temp }}/java-native-linuxmusl-arm64
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: java-native-win32-x64-snapshot-${{ github.run_id }}-${{ github.run_attempt }}
@@ -569,6 +649,31 @@ jobs:
echo "linuxmusl_x64_jar=$JAR" >> "$GITHUB_OUTPUT"
echo "linuxmusl_x64_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+ - name: Verify version, source, and Linux musl ARM64 classifier
+ id: linuxmusl-arm64-artifact
+ run: |
+ SOURCE_COMMIT=$(git rev-parse HEAD)
+ if [ "$SOURCE_COMMIT" != "${{ needs.resolve-source.outputs.source_sha }}" ]; then
+ echo "::error::Checked out $SOURCE_COMMIT instead of the resolved snapshot source."
+ exit 1
+ fi
+ VERSION="${{ steps.linux-arm64-artifact.outputs.version }}"
+ if [ "$VERSION" != "${{ needs.build-linuxmusl-arm64-classifier.outputs.version }}" ]; then
+ echo "::error::Linux musl ARM64 classifier version does not match deploy version."
+ exit 1
+ fi
+ ARTIFACT_DIRECTORY="${{ runner.temp }}/java-native-linuxmusl-arm64"
+ JAR="$ARTIFACT_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-arm64.jar"
+ MANIFEST="$ARTIFACT_DIRECTORY/linuxmusl-arm64-$VERSION.sha256"
+ test -f "$JAR"
+ test -f "$MANIFEST"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ node "$GITHUB_WORKSPACE/java/copilot-native/scripts/validate-native-artifact.mjs" \
+ classifier linuxmusl-arm64 "$JAR" "$(basename "$JAR")" "$GITHUB_WORKSPACE"
+ echo "linuxmusl_arm64_jar=$JAR" >> "$GITHUB_OUTPUT"
+ echo "linuxmusl_arm64_sha=$(cut -d ' ' -f 1 "$MANIFEST")" >> "$GITHUB_OUTPUT"
+
- name: Verify version, source, and Darwin classifier
id: darwin-artifact
run: |
@@ -650,6 +755,7 @@ jobs:
mvn -B deploy -DskipTests -DskipITs -Dcopilot.native.libc=glibc \
"-Dcopilot.native.external.linux.arm64.classifier.path=${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}" \
"-Dcopilot.native.external.linuxmusl.x64.classifier.path=${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}" \
+ "-Dcopilot.native.external.linuxmusl.arm64.classifier.path=${{ steps.linuxmusl-arm64-artifact.outputs.linuxmusl_arm64_jar }}" \
"-Dcopilot.native.external.win32.classifier.path=${{ steps.windows-artifact.outputs.windows_jar }}" \
"-Dcopilot.native.external.win32.arm64.classifier.path=${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}" \
"-Dcopilot.native.external.darwin.classifier.path=${{ steps.darwin-artifact.outputs.darwin_jar }}" \
@@ -689,6 +795,7 @@ jobs:
echo "| \`linux-x64\` | \`ubuntu-latest\` | \`$(basename "$LINUX_JAR")\` | \`$LINUX_SHA\` | Published |"
echo "| \`linux-arm64\` | \`ubuntu-24.04-arm\` | \`$(basename "${{ steps.linux-arm64-artifact.outputs.linux_arm64_jar }}")\` | \`${{ steps.linux-arm64-artifact.outputs.linux_arm64_sha }}\` | Published |"
echo "| \`linuxmusl-x64\` | \`Alpine x64\` | \`$(basename "${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_jar }}")\` | \`${{ steps.linuxmusl-x64-artifact.outputs.linuxmusl_x64_sha }}\` | Published |"
+ echo "| \`linuxmusl-arm64\` | \`Alpine ARM64\` | \`$(basename "${{ steps.linuxmusl-arm64-artifact.outputs.linuxmusl_arm64_jar }}")\` | \`${{ steps.linuxmusl-arm64-artifact.outputs.linuxmusl_arm64_sha }}\` | Published |"
echo "| \`win32-x64\` | \`windows-latest\` | \`$(basename "${{ steps.windows-artifact.outputs.windows_jar }}")\` | \`${{ steps.windows-artifact.outputs.windows_sha }}\` | Published |"
echo "| \`win32-arm64\` | \`windows-11-arm\` | \`$(basename "${{ steps.windows-arm64-artifact.outputs.windows_arm64_jar }}")\` | \`${{ steps.windows-arm64-artifact.outputs.windows_arm64_sha }}\` | Published |"
echo "| \`darwin-x64\` | \`macos-15-intel\` | \`$(basename "${{ steps.darwin-x64-artifact.outputs.darwin_x64_jar }}")\` | \`${{ steps.darwin-x64-artifact.outputs.darwin_x64_sha }}\` | Published |"
diff --git a/.github/workflows/java-sdk-tests.yml b/.github/workflows/java-sdk-tests.yml
index b491717be6..700e6966c2 100644
--- a/.github/workflows/java-sdk-tests.yml
+++ b/.github/workflows/java-sdk-tests.yml
@@ -29,6 +29,9 @@ jobs:
- os: ubuntu-latest
classifier: linuxmusl-x64
alpine-image: eclipse-temurin:25-jdk-alpine
+ - os: ubuntu-24.04-arm
+ classifier: linuxmusl-arm64
+ alpine-image: eclipse-temurin:25-jdk-alpine
- os: windows-latest
classifier: win32-x64
- os: windows-11-arm
@@ -83,7 +86,7 @@ jobs:
sh -c 'apk add --no-cache git java-cacerts maven nodejs npm &&
export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
git config --global --add safe.directory /workspace &&
- node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64 &&
+ node copilot-native/scripts/validate-native-host.mjs ${{ matrix.classifier }} &&
mvn clean verify -Pinprocess -Dcopilot.native.libc=musl &&
chown -R "$HOST_UID:$HOST_GID" copilot-native/target sdk/target'
@@ -233,6 +236,76 @@ jobs:
overwrite: true
retention-days: 1
+ java-native-publication-linuxmusl-arm64:
+ name: "Java Native Publication Input (linuxmusl-arm64)"
+ if: github.event.repository.fork == false
+ runs-on: ubuntu-24.04-arm
+ permissions:
+ contents: read
+ outputs:
+ source_sha: ${{ steps.build.outputs.source_sha }}
+ version: ${{ steps.build.outputs.version }}
+ defaults:
+ run:
+ shell: bash
+ working-directory: ./java
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+
+ - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 22
+
+ - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
+ with:
+ java-version: "25"
+ distribution: "microsoft"
+ cache: "maven"
+
+ - name: Build and validate linuxmusl-arm64 classifier
+ id: build
+ run: |
+ set -euo pipefail
+ VERSION="$JAVA_PUBLICATION_REVISION"
+ docker run --rm \
+ --volume "$GITHUB_WORKSPACE:/workspace" \
+ --volume "$HOME/.m2:/root/.m2" \
+ --workdir /workspace/java \
+ --env HOST_GID="$(id -g)" \
+ --env HOST_UID="$(id -u)" \
+ "eclipse-temurin:25-jdk-alpine" \
+ sh -c "apk add --no-cache git java-cacerts maven nodejs npm &&
+ export JAVA_TOOL_OPTIONS=-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts &&
+ git config --global --add safe.directory /workspace &&
+ node copilot-native/scripts/validate-native-host.mjs linuxmusl-arm64 &&
+ mvn -B -pl copilot-native package -DskipTests -Dcopilot.native.libc=musl -Drevision=$VERSION &&
+ chown -R \$HOST_UID:\$HOST_GID copilot-native/target"
+ JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION-linuxmusl-arm64.jar"
+ PRIMARY_JAR="copilot-native/target/copilot-sdk-java-runtime-$VERSION.jar"
+ test -f "$JAR"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-arm64 "$JAR" "$(basename "$JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs placeholder "$PRIMARY_JAR"
+ MANIFEST="copilot-native/target/linuxmusl-arm64-$VERSION.sha256"
+ HASH=$(sha256sum "$JAR" | cut -d ' ' -f 1)
+ printf '%s %s' "$HASH" "$(basename "$JAR")" > "$MANIFEST"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$JAR" "$MANIFEST" "$(basename "$JAR")"
+ echo "source_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
+
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: java-native-publication-linuxmusl-arm64-${{ github.run_id }}
+ path: |
+ java/copilot-native/target/copilot-sdk-java-runtime-${{ steps.build.outputs.version }}-linuxmusl-arm64.jar
+ java/copilot-native/target/linuxmusl-arm64-${{ steps.build.outputs.version }}.sha256
+ if-no-files-found: error
+ overwrite: true
+ retention-days: 1
+
java-native-publication-windows-x64:
name: "Java Native Publication Input (win32-x64)"
if: github.event.repository.fork == false
@@ -473,6 +546,7 @@ jobs:
[
java-native-publication-linux-arm64,
java-native-publication-linuxmusl-x64,
+ java-native-publication-linuxmusl-arm64,
java-native-publication-windows-x64,
java-native-publication-windows-arm64,
java-native-publication-darwin-arm64,
@@ -509,6 +583,11 @@ jobs:
name: java-native-publication-linuxmusl-x64-${{ github.run_id }}
path: ${{ github.workspace }}/java/native-publication-input/linuxmusl-x64
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
+ with:
+ name: java-native-publication-linuxmusl-arm64-${{ github.run_id }}
+ path: ${{ github.workspace }}/java/native-publication-input/linuxmusl-arm64
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: java-native-publication-win32-x64-${{ github.run_id }}
@@ -534,6 +613,7 @@ jobs:
set -euo pipefail
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-linux-arm64.outputs.source_sha }}"
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-linuxmusl-x64.outputs.source_sha }}"
+ test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-linuxmusl-arm64.outputs.source_sha }}"
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-windows-x64.outputs.source_sha }}"
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-windows-arm64.outputs.source_sha }}"
test "$(git rev-parse HEAD)" = "${{ needs.java-native-publication-darwin-arm64.outputs.source_sha }}"
@@ -542,11 +622,13 @@ jobs:
test "$VERSION" = "$JAVA_PUBLICATION_REVISION"
test "$VERSION" = "${{ needs.java-native-publication-linux-arm64.outputs.version }}"
test "$VERSION" = "${{ needs.java-native-publication-linuxmusl-x64.outputs.version }}"
+ test "$VERSION" = "${{ needs.java-native-publication-linuxmusl-arm64.outputs.version }}"
test "$VERSION" = "${{ needs.java-native-publication-windows-arm64.outputs.version }}"
test "$VERSION" = "${{ needs.java-native-publication-darwin-arm64.outputs.version }}"
test "$VERSION" = "${{ needs.java-native-publication-darwin-x64.outputs.version }}"
LINUX_ARM64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/linux-arm64"
LINUXMUSL_X64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/linuxmusl-x64"
+ LINUXMUSL_ARM64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/linuxmusl-arm64"
WINDOWS_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/windows"
WINDOWS_ARM64_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/windows-arm64"
DARWIN_DIRECTORY="$GITHUB_WORKSPACE/java/native-publication-input/darwin"
@@ -555,6 +637,8 @@ jobs:
LINUX_ARM64_MANIFEST="$LINUX_ARM64_DIRECTORY/linux-arm64-$VERSION.sha256"
LINUXMUSL_X64_JAR="$LINUXMUSL_X64_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-x64.jar"
LINUXMUSL_X64_MANIFEST="$LINUXMUSL_X64_DIRECTORY/linuxmusl-x64-$VERSION.sha256"
+ LINUXMUSL_ARM64_JAR="$LINUXMUSL_ARM64_DIRECTORY/copilot-sdk-java-runtime-$VERSION-linuxmusl-arm64.jar"
+ LINUXMUSL_ARM64_MANIFEST="$LINUXMUSL_ARM64_DIRECTORY/linuxmusl-arm64-$VERSION.sha256"
WINDOWS_JAR="$WINDOWS_DIRECTORY/copilot-sdk-java-runtime-$VERSION-win32-x64.jar"
WINDOWS_MANIFEST="$WINDOWS_DIRECTORY/win32-x64-$VERSION.sha256"
WINDOWS_ARM64_JAR="$WINDOWS_ARM64_DIRECTORY/copilot-sdk-java-runtime-$VERSION-win32-arm64.jar"
@@ -571,6 +655,10 @@ jobs:
checksum "$LINUXMUSL_X64_JAR" "$LINUXMUSL_X64_MANIFEST" "$(basename "$LINUXMUSL_X64_JAR")"
node copilot-native/scripts/validate-native-artifact.mjs \
classifier linuxmusl-x64 "$LINUXMUSL_X64_JAR" "$(basename "$LINUXMUSL_X64_JAR")" ..
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ checksum "$LINUXMUSL_ARM64_JAR" "$LINUXMUSL_ARM64_MANIFEST" "$(basename "$LINUXMUSL_ARM64_JAR")"
+ node copilot-native/scripts/validate-native-artifact.mjs \
+ classifier linuxmusl-arm64 "$LINUXMUSL_ARM64_JAR" "$(basename "$LINUXMUSL_ARM64_JAR")" ..
node copilot-native/scripts/validate-native-artifact.mjs \
checksum "$WINDOWS_JAR" "$WINDOWS_MANIFEST" "$(basename "$WINDOWS_JAR")"
node copilot-native/scripts/validate-native-artifact.mjs \
@@ -600,6 +688,7 @@ jobs:
-Dcopilot.native.libc=glibc \
"-Dcopilot.native.external.linux.arm64.classifier.path=$LINUX_ARM64_JAR" \
"-Dcopilot.native.external.linuxmusl.x64.classifier.path=$LINUXMUSL_X64_JAR" \
+ "-Dcopilot.native.external.linuxmusl.arm64.classifier.path=$LINUXMUSL_ARM64_JAR" \
"-Dcopilot.native.external.win32.classifier.path=$WINDOWS_JAR" \
"-Dcopilot.native.external.win32.arm64.classifier.path=$WINDOWS_ARM64_JAR" \
"-Dcopilot.native.external.darwin.classifier.path=$DARWIN_JAR" \
diff --git a/java/README.md b/java/README.md
index d9b783afa1..89c4f4e3de 100644
--- a/java/README.md
+++ b/java/README.md
@@ -74,7 +74,7 @@ implementation 'com.github:copilot-sdk-java:1.0.15-preview.1-SNAPSHOT'
## In-process mode (experimental)
-The SDK supports running the Copilot runtime **in-process** as a native library instead of spawning a separate CLI process. This eliminates process management overhead and simplifies deployment. In-process mode is currently experimental and supported on **linux-x64** (glibc), **linux-arm64** (glibc), **linuxmusl-x64**, **win32-x64**, **win32-arm64**, **darwin-x64**, and **darwin-arm64**.
+The SDK supports running the Copilot runtime **in-process** as a native library instead of spawning a separate CLI process. This eliminates process management overhead and simplifies deployment. In-process mode is currently experimental and supported on **linux-x64** (glibc), **linux-arm64** (glibc), **linuxmusl-x64**, **linuxmusl-arm64**, **win32-x64**, **win32-arm64**, **darwin-x64**, and **darwin-arm64**.
Because in-process mode is experimental, see the [Using experimental APIs](#using-experimental-apis) section for how to opt in.
@@ -97,7 +97,7 @@ Add both the SDK and the platform-specific native runtime to your project:
${copilot.version}
linux-x64
-
+
net.java.dev.jna
@@ -649,7 +649,7 @@ CI enforces both checks. Spotless runs explicitly in CI; `mvn verify` alone does
Run native-runtime Maven commands from the `java` directory. Native packaging requires Node.js in addition to JDK 25 and Maven because `copilot-native/scripts/fetch-native.mjs` retrieves the pinned runtime package from the corresponding GitHub release.
-On a native Linux glibc host, Maven activates `native-linux-x64` or `native-linux-arm64` for the matching architecture when `copilot.native.libc=glibc` is set. On a Linux musl x64 host, Maven activates `native-linuxmusl-x64` when `copilot.native.libc=musl` is set. On Windows x64, Windows ARM64, Intel macOS, and Apple Silicon macOS, Maven activates `native-win32-x64`, `native-win32-arm64`, `native-darwin-x64`, or `native-darwin-arm64` automatically. The matching profile validates the host, runs the native script tests, fetches the pinned platform package from the corresponding `github/copilot-cli` release during `generate-resources`, packages the classifier JAR during `package`, and verifies its native contents.
+On a native Linux glibc host, Maven activates `native-linux-x64` or `native-linux-arm64` for the matching architecture when `copilot.native.libc=glibc` is set. On a Linux musl host, Maven activates `native-linuxmusl-x64` or `native-linuxmusl-arm64` for the matching architecture when `copilot.native.libc=musl` is set. On Windows x64, Windows ARM64, Intel macOS, and Apple Silicon macOS, Maven activates `native-win32-x64`, `native-win32-arm64`, `native-darwin-x64`, or `native-darwin-arm64` automatically. The matching profile validates the host, runs the native script tests, fetches the pinned platform package from the corresponding `github/copilot-cli` release during `generate-resources`, packages the classifier JAR during `package`, and verifies its native contents.
Before opting in, validate that Node.js reports glibc for the build host:
@@ -684,14 +684,14 @@ node copilot-native/scripts/validate-native-host.mjs linux-arm64
mvn -Pinprocess clean verify -Dcopilot.native.libc=glibc
```
-The same command validates in-process mode on Linux musl x64:
+The same command validates in-process mode on Linux musl x64 or ARM64:
```bash
-node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64
+node copilot-native/scripts/validate-native-host.mjs linuxmusl-x64 # Use linuxmusl-arm64 on ARM64
mvn -Pinprocess clean verify -Dcopilot.native.libc=musl
```
-On Linux musl ARM64 and other unsupported hosts, do not set `copilot.native.libc`. A normal build produces only the OS-neutral primary, sources, and Javadoc JARs; it does not run native script tests, download or stage native files, or produce a platform classifier JAR.
+On unsupported hosts, do not set `copilot.native.libc`. A normal build produces only the OS-neutral primary, sources, and Javadoc JARs; it does not run native script tests, download or stage native files, or produce a platform classifier JAR.
To build only the OS-neutral artifacts on any host, or override the glibc opt-in, disable native download and packaging:
diff --git a/java/copilot-native/pom.xml b/java/copilot-native/pom.xml
index 2c750e4e47..41af2dd6cb 100644
--- a/java/copilot-native/pom.xml
+++ b/java/copilot-native/pom.xml
@@ -467,6 +467,64 @@
+
+ native-linuxmusl-arm64
+
+
+ Linux
+ aarch64
+
+
+ copilot.native.libc
+ musl
+
+
+
+ linuxmusl-arm64
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ validate-native-host
+ validate
+
+
+ fetch-native
+ generate-resources
+
+
+ test-fetch-native
+ test
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ jar-native
+ package
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ verify-native-jars
+ package
+
+
+
+
+
+
native-win32-x64
@@ -809,6 +867,68 @@
+
+
+ attach-external-linuxmusl-arm64-classifier
+
+
+ copilot.native.external.linuxmusl.arm64.classifier.path
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ validate-external-linuxmusl-arm64-classifier
+ validate
+
+ exec
+
+
+ node
+
+ ${project.basedir}/scripts/validate-native-artifact.mjs
+ classifier
+ linuxmusl-arm64
+ ${copilot.native.external.linuxmusl.arm64.classifier.path}
+ ${project.build.finalName}-linuxmusl-arm64.jar
+ ${copilot.sdk.root}
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ attach-external-linuxmusl-arm64-classifier
+ package
+
+ attach-artifact
+
+
+
+
+ ${copilot.native.external.linuxmusl.arm64.classifier.path}
+ jar
+ linuxmusl-arm64
+
+
+
+
+
+
+
+
+