From 9a80a47cfa2ef48c6cf29f7e637118b3892ecb06 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 5 Dec 2020 20:56:12 +0100 Subject: [PATCH] [#653] Upgrade to GraalVM 20.3.0 --- .circleci/config.yml | 30 ++++---- .github/workflows/build.yml | 72 +++++++++---------- Dockerfile | 8 +-- appveyor.yml | 4 +- doc/build.md | 2 +- doc/dev.md | 2 +- project.clj | 2 +- .../CutOffSunAwtWwwContentAudioAiff.java | 26 +++++++ script/bump_graal_version.clj | 4 +- script/compile | 13 +++- script/compile.bat | 9 ++- 11 files changed, 108 insertions(+), 64 deletions(-) create mode 100644 resources/CutOffSunAwtWwwContentAudioAiff.java diff --git a/.circleci/config.yml b/.circleci/config.yml index afce89f7..b38179ea 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -70,7 +70,7 @@ jobs: working_directory: ~/repo environment: LEIN_ROOT: "true" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-20.2.0 + GRAALVM_HOME: /home/circleci/graalvm-ce-java11-20.3.0 BABASHKA_PLATFORM: linux # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" @@ -104,9 +104,9 @@ jobs: name: Download GraalVM command: | cd ~ - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-linux-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-20.3.0.tar.gz fi - run: name: Build binary @@ -126,7 +126,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-20.2.0 + - ~/graalvm-ce-java11-20.3.0 key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release @@ -141,7 +141,7 @@ jobs: working_directory: ~/repo environment: LEIN_ROOT: "true" - GRAALVM_HOME: /home/circleci/graalvm-ce-java11-20.2.0 + GRAALVM_HOME: /home/circleci/graalvm-ce-java11-20.3.0 BABASHKA_PLATFORM: linux-static # used in release script BABASHKA_TEST_ENV: native BABASHKA_STATIC: true @@ -176,9 +176,9 @@ jobs: name: Download GraalVM command: | cd ~ - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-linux-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-20.3.0.tar.gz fi - run: name: Build binary @@ -198,7 +198,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-20.2.0 + - ~/graalvm-ce-java11-20.3.0 key: linux-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release @@ -212,7 +212,7 @@ jobs: xcode: "12.0.0" environment: MACOSX_DEPLOYMENT_TARGET: 10.13 # 10.12 is EOL - GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-20.2.0/Contents/Home + GRAALVM_HOME: /Users/distiller/graalvm-ce-java11-20.3.0/Contents/Home BABASHKA_PLATFORM: macos # used in release script BABASHKA_TEST_ENV: native BABASHKA_XMX: "-J-Xmx6500m" @@ -240,9 +240,9 @@ jobs: command: | cd ~ ls -la - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-darwin-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-darwin-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-darwin-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-darwin-amd64-20.3.0.tar.gz fi - run: name: Build binary @@ -264,7 +264,7 @@ jobs: - save_cache: paths: - ~/.m2 - - ~/graalvm-ce-java11-20.2.0 + - ~/graalvm-ce-java11-20.3.0 key: mac-{{ checksum "project.clj" }}-{{ checksum ".circleci/config.yml" }} - store_artifacts: path: /tmp/release diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1ce38b10..06f18d30 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,17 +44,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-20.2.0 - key: ${{ runner.os }}-graalvm-20.2.0 + path: ~/graalvm-ce-java11-20.3.0 + key: ${{ runner.os }}-graalvm-20.3.0 restore-keys: | - ${{ runner.os }}-graalvm-20.2.0 + ${{ runner.os }}-graalvm-20.3.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-linux-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-20.3.0.tar.gz fi - name: Fetch deps @@ -64,18 +64,18 @@ jobs: - name: Run tests run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" script/test - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" sudo script/install-clojure script/run_lib_tests - name: Build uberjar run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" script/uberjar - name: Babashka version @@ -132,17 +132,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-20.2.0 - key: ${{ runner.os }}-graalvm-20.2.0 + path: ~/graalvm-ce-java11-20.3.0 + key: ${{ runner.os }}-graalvm-20.3.0 restore-keys: | - ${{ runner.os }}-graalvm-20.2.0 + ${{ runner.os }}-graalvm-20.3.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-linux-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-20.3.0.tar.gz fi - name: Babashka version @@ -155,13 +155,13 @@ jobs: run: | export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" cp babashka-${{ steps.babashka-version.outputs.version }}-reflection.json reflection.json script/compile - name: Test binary run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" BABASHKA_TEST_ENV=native script/test - name: Install clojure @@ -170,7 +170,7 @@ jobs: - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" BABASHKA_TEST_ENV=native script/run_lib_tests - uses: actions/upload-artifact@v1 @@ -212,17 +212,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-20.2.0 - key: ${{ runner.os }}-graalvm-20.2.0 + path: ~/graalvm-ce-java11-20.3.0 + key: ${{ runner.os }}-graalvm-20.3.0 restore-keys: | - ${{ runner.os }}-graalvm-20.2.0 + ${{ runner.os }}-graalvm-20.3.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-linux-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-linux-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-linux-amd64-20.3.0.tar.gz fi - name: Babashka version @@ -235,7 +235,7 @@ jobs: run: | export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" export BABASHKA_STATIC=true cp babashka-${{ steps.babashka-version.outputs.version }}-reflection.json reflection.json script/compile @@ -243,7 +243,7 @@ jobs: - name: Test binary run: | ./bb '(+ 1 2 3)' - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" BABASHKA_TEST_ENV=native script/test - name: Install clojure @@ -252,7 +252,7 @@ jobs: - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0" BABASHKA_TEST_ENV=native script/run_lib_tests - uses: actions/upload-artifact@v1 @@ -285,17 +285,17 @@ jobs: uses: actions/cache@v1 id: cache-graalvm with: - path: ~/graalvm-ce-java11-20.2.0 - key: ${{ runner.os }}-graalvm-20.2.0 + path: ~/graalvm-ce-java11-20.3.0 + key: ${{ runner.os }}-graalvm-20.3.0 restore-keys: | - ${{ runner.os }}-graalvm-20.2.0 + ${{ runner.os }}-graalvm-20.3.0 - name: Download GraalVM run: | cd ~ - if ! [ -d graalvm-ce-java11-20.2.0 ]; then - curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-darwin-amd64-20.2.0.tar.gz - tar xzf graalvm-ce-java11-darwin-amd64-20.2.0.tar.gz + if ! [ -d graalvm-ce-java11-20.3.0 ]; then + curl -O -sL https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-darwin-amd64-20.3.0.tar.gz + tar xzf graalvm-ce-java11-darwin-amd64-20.3.0.tar.gz fi - name: Babashka version @@ -308,19 +308,19 @@ jobs: run: | export BABASHKA_JAR=babashka-${{ steps.babashka-version.outputs.version }}-standalone.jar export BABASHKA_XMX="-J-Xmx6g" - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0/Contents/Home" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0/Contents/Home" cp babashka-${{ steps.babashka-version.outputs.version }}-reflection.json reflection.json script/compile - name: Test binary run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0/Contents/Home" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0/Contents/Home" sudo script/install-leiningen BABASHKA_TEST_ENV=native script/test - name: Test libraries run: | - export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.2.0/Contents/Home" + export GRAALVM_HOME="$HOME/graalvm-ce-java11-20.3.0/Contents/Home" sudo script/install-clojure BABASHKA_TEST_ENV=native script/run_lib_tests diff --git a/Dockerfile b/Dockerfile index 2f32b629..67bec53b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,13 +3,13 @@ FROM clojure:lein-2.9.1 AS BASE RUN apt update RUN apt install --no-install-recommends -yy curl unzip build-essential zlib1g-dev WORKDIR "/opt" -RUN curl -sLO https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-linux-amd64-20.2.0.tar.gz -RUN tar -xzf graalvm-ce-java11-linux-amd64-20.2.0.tar.gz +RUN curl -sLO https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz +RUN tar -xzf graalvm-ce-java11-linux-amd64-20.3.0.tar.gz ARG BABASHKA_XMX="-J-Xmx3g" -ENV GRAALVM_HOME="/opt/graalvm-ce-java11-20.2.0" -ENV JAVA_HOME="/opt/graalvm-ce-java11-20.2.0/bin" +ENV GRAALVM_HOME="/opt/graalvm-ce-java11-20.3.0" +ENV JAVA_HOME="/opt/graalvm-ce-java11-20.3.0/bin" ENV PATH="$JAVA_HOME:$PATH" ENV BABASHKA_XMX=$BABASHKA_XMX diff --git a/appveyor.yml b/appveyor.yml index d628701f..18c29b40 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,7 +7,7 @@ image: Visual Studio 2017 clone_folder: C:\projects\babashka environment: - GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-20.2.0 + GRAALVM_HOME: C:\projects\babashka\graalvm\graalvm-ce-java11-20.3.0 BABASHKA_XMX: "-J-Xmx5g" cache: @@ -44,7 +44,7 @@ build_script: - cmd: >- call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" - powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java11-windows-amd64-20.2.0.zip', 'graalvm.zip') }" + powershell -Command "if (Test-Path('graalvm')) { return } else { (New-Object Net.WebClient).DownloadFile('https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-windows-amd64-20.3.0.zip', 'graalvm.zip') }" powershell -Command "if (Test-Path('graalvm')) { return } else { Expand-Archive graalvm.zip graalvm }" diff --git a/doc/build.md b/doc/build.md index 94e15b6c..41509f5a 100644 --- a/doc/build.md +++ b/doc/build.md @@ -3,7 +3,7 @@ ## Prerequisites - Install [lein](https://leiningen.org/) for producing uberjars -- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-20.2.0*. +- Download [GraalVM](https://www.graalvm.org/downloads/). Currently we use *java11-20.3.0*. - For Windows, installing Visual Studio 2019 with the "Desktop development with C++" workload is recommended. - Set `$GRAALVM_HOME` to the GraalVM distribution directory. On macOS this can look like: diff --git a/doc/dev.md b/doc/dev.md index 43d084dc..126da73e 100644 --- a/doc/dev.md +++ b/doc/dev.md @@ -1,6 +1,6 @@ # Developing Babashka -You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-20.2.0. +You need [lein](https://leiningen.org/) for running JVM tests and/or producing uberjars. For building binaries you need GraalVM. Currently we use java11-20.3.0. ## Clone repository diff --git a/project.clj b/project.clj index 7b008edc..c2554e04 100644 --- a/project.clj +++ b/project.clj @@ -66,7 +66,7 @@ "-Dclojure.spec.skip-macros=true"] :main babashka.main :aot :all} - :native-image {:dependencies [[borkdude/clj-reflector-graal-java11-fix "0.0.1-graalvm-20.2.0"]]} + :native-image {:dependencies [[borkdude/clj-reflector-graal-java11-fix "0.0.1-graalvm-20.3.0"]]} :reflection {:main babashka.impl.classes/generate-reflection-file}} :aliases {"bb" ["with-profile" "test" "run" "-m" "babashka.main"]} :deploy-repositories [["clojars" {:url "https://clojars.org/repo" diff --git a/resources/CutOffSunAwtWwwContentAudioAiff.java b/resources/CutOffSunAwtWwwContentAudioAiff.java new file mode 100644 index 00000000..6068bbf2 --- /dev/null +++ b/resources/CutOffSunAwtWwwContentAudioAiff.java @@ -0,0 +1,26 @@ +import org.graalvm.nativeimage.Platform; +import org.graalvm.nativeimage.Platforms; +import com.oracle.svm.core.annotate.TargetClass; +import com.oracle.svm.core.annotate.Delete; + +public final class CutOffSunAwtWwwContentAudioAiff { +} + +// @Platforms(Platform.DARWIN.class) +// @TargetClass(className = "sun.net.spi.DefaultProxySelector") +// @Delete +// final class Target_sun_net_spi_DefaultProxySelector { +// } + +// @Platforms(Platform.DARWIN.class) + +// This cuts of access to the javax.sound package via java.net.HttpUrlConnection: +// sun.awt.www.content.audio.aiff.getContent -> +// java.net.ContentHandler.getContent -> +// java.net.URLConnection.getContent() + +@Platforms(Platform.DARWIN.class) +@TargetClass(className = "sun.awt.www.content.audio.aiff") +@Delete +final class Target_sun_awt_www_content_audio_aiff { +} diff --git a/script/bump_graal_version.clj b/script/bump_graal_version.clj index 493a73a3..e349b9e8 100755 --- a/script/bump_graal_version.clj +++ b/script/bump_graal_version.clj @@ -51,9 +51,9 @@ ;; OR ;; ;; We could have them as environment variables -(def current-graal-version "20.1.0") +(def current-graal-version "20.2.0") (def current-java-version "java11") -(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0"]) +(def valid-graal-bumps ["19.3.2" "20.1.0" "20.2.0" "20.3.0"]) (def valid-java-bumps ["java8" "java11"]) (def cl-options diff --git a/script/compile b/script/compile index 3e6bebfe..68237c6c 100755 --- a/script/compile +++ b/script/compile @@ -26,6 +26,7 @@ export PATH=$GRAALVM_HOME/bin:$PATH SVM_JAR=$(find -L "$GRAALVM_HOME" | grep svm.jar) "$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffCoreServicesDependencies.java +"$GRAALVM_HOME/bin/javac" -cp "$SVM_JAR" resources/CutOffSunAwtWwwContentAudioAiff.java if [ -z "$BABASHKA_JAR" ]; then lein with-profiles +reflection,+native-image "do" run @@ -43,8 +44,8 @@ args=( "-jar" "$BABASHKA_JAR" "-H:IncludeResources=BABASHKA_VERSION" "-H:IncludeResources=SCI_VERSION" "-H:ReflectionConfigurationFiles=reflection.json" - "--initialize-at-run-time=java.lang.Math\$RandomNumberGeneratorHolder" "--initialize-at-build-time" + # "-H:+PrintAnalysisCallTree" "-H:Log=registerResource:" "-H:EnableURLProtocols=http,https,jar" "--enable-all-security-services" @@ -54,6 +55,16 @@ args=( "-jar" "$BABASHKA_JAR" "--no-server" "--report-unsupported-elements-at-runtime" "--initialize-at-run-time=org.postgresql.sspi.SSPIClient" + "--native-image-info" + "--verbose" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileReader" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.MixerProvider" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.FormatConversionProvider" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileWriter" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiDeviceProvider" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader" + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter" "$BABASHKA_XMX" ) BABASHKA_STATIC=${BABASHKA_STATIC:-} diff --git a/script/compile.bat b/script/compile.bat index 61117291..8818b694 100644 --- a/script/compile.bat +++ b/script/compile.bat @@ -32,7 +32,6 @@ call %GRAALVM_HOME%\bin\native-image.cmd ^ "-H:IncludeResources=BABASHKA_VERSION" ^ "-H:IncludeResources=SCI_VERSION" ^ "-H:ReflectionConfigurationFiles=reflection.json" ^ - "--initialize-at-run-time=java.lang.Math$RandomNumberGeneratorHolder" ^ "--initialize-at-build-time" ^ "--initialize-at-run-time=org.postgresql.sspi.SSPIClient" ^ "-H:EnableURLProtocols=http,https,jar" ^ @@ -41,6 +40,14 @@ call %GRAALVM_HOME%\bin\native-image.cmd ^ "-H:Log=registerResource:" ^ "--no-fallback" ^ "--verbose" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileReader" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileReader" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.MixerProvider" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.FormatConversionProvider" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.sampled.spi.AudioFileWriter" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiDeviceProvider" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.SoundbankReader" ^ + "-H:ServiceLoaderFeatureExcludeServices=javax.sound.midi.spi.MidiFileWriter" ^ "%BABASHKA_XMX%" if %errorlevel% neq 0 exit /b %errorlevel%