You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2023/01/24 09:52:01 UTC
[maven-mvnd] branch master updated: Try native image then fallback to pure java version (#717)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-mvnd.git
The following commit(s) were added to refs/heads/master by this push:
new 6f28a189 Try native image then fallback to pure java version (#717)
6f28a189 is described below
commit 6f28a189b6448d64693098fa0eb20e5ff2e66940
Author: James Z.M. Gao <ga...@gmail.com>
AuthorDate: Tue Jan 24 17:51:56 2023 +0800
Try native image then fallback to pure java version (#717)
* Add script mvnd-auto to auto select native or pure java mvnd
* Move fallback logic into main entry script
1. rename native binary to 'mvnd-native-<os>-<arch>'
2. add environment switch MVND_ENTRY_FALLBACK, default 'true' enables
the fallback logic, set to 'false' to force execute the native mvnd.
3. rename mvnd.sh to mvnd
* change entry name on windows
* Add script mvnd-persist-native for moving the native image to the default entry path
* improve platform detect
* fix error on dash
* rollback default entry to the native image
* use MVND_CLIENT switch to control the selection of mvnd client
* improve comment docs as suggestion
---
client/pom.xml | 2 +-
dist/src/main/distro/bin/mvnd.cmd | 28 +++++++++++++++++++++++
dist/src/main/distro/bin/mvnd.sh | 39 +++++++++++++++++++++++++++++++--
dist/src/main/provisio/maven-distro.xml | 1 +
4 files changed, 67 insertions(+), 3 deletions(-)
diff --git a/client/pom.xml b/client/pom.xml
index f9808d06..8fb167f9 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -225,7 +225,7 @@
<executions>
<execution>
<goals>
- <goal>build</goal>
+ <goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
diff --git a/dist/src/main/distro/bin/mvnd.cmd b/dist/src/main/distro/bin/mvnd.cmd
index a14caedf..50fbeea1 100644
--- a/dist/src/main/distro/bin/mvnd.cmd
+++ b/dist/src/main/distro/bin/mvnd.cmd
@@ -25,6 +25,12 @@
@REM MAVEN_BATCH_PAUSE (Optional) set to 'on' to wait for a key stroke before ending.
@REM MAVEN_OPTS (Optional) Java runtime options used when Maven is executed.
@REM MAVEN_SKIP_RC (Optional) Flag to disable loading of mavenrc files.
+@REM MVND_CLIENT (Optional) Control how to select mvnd client to communicate with the daemon:
+@REM 'auto' (default) - prefer the native client mvnd.exe if it suits the current
+@REM OS and processor architecture; otherwise use the pure
+@REM Java client.
+@REM 'native' - use the native client mvnd.exe
+@REM 'jvm' - use the pure Java client
@REM -----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@@ -43,6 +49,28 @@ if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
set ERROR_CODE=0
+set "MVND_CMD=%~dp0\mvnd.exe"
+if "%MVND_CLIENT%"=="native" goto runNative
+if "%MVND_CLIENT%"=="" goto checkNative
+if not "%MVND_CLIENT%"=="auto" goto runJvm
+
+:checkNative
+@REM try execute native image
+if "%PROCESSOR_ARCHITEW6432%"=="" (
+ if not exist "%~dp0\platform-windows-%PROCESSOR_ARCHITECTURE%" goto runJvm
+) else (
+ if not exist "%~dp0\platform-windows-%PROCESSOR_ARCHITEW6432%" goto runJvm
+)
+if not exist "%MVND_CMD%" goto runJvm
+
+:runNative
+"%MVND_CMD%" %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:runJvm
+@REM fallback to pure java version
+
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%"=="" goto OkJHome
for %%i in (java.exe) do set "JAVACMD=%%~$PATH:i"
diff --git a/dist/src/main/distro/bin/mvnd.sh b/dist/src/main/distro/bin/mvnd.sh
index 029ac1a5..72eafe54 100755
--- a/dist/src/main/distro/bin/mvnd.sh
+++ b/dist/src/main/distro/bin/mvnd.sh
@@ -25,6 +25,11 @@
# JAVA_HOME Must point at your Java Development Kit installation.
# MAVEN_OPTS (Optional) Java runtime options used when Maven is executed.
# MAVEN_SKIP_RC (Optional) Flag to disable loading of mavenrc files.
+# MVND_CLIENT (Optional) Control how to select mvnd client to communicate with the daemon:
+# 'auto' (default) - prefer the native client mvnd if it suits the current OS and
+# processor architecture; otherwise use the pure Java client.
+# 'native' - use the native client mvnd
+# 'jvm' - use the pure Java client
# -----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
@@ -43,8 +48,8 @@ fi
cygwin=false;
mingw=false;
case "`uname`" in
- CYGWIN*) cygwin=true;;
- MINGW*) mingw=true;;
+ CYGWIN*) cygwin=true native_ext=.exe ;;
+ MINGW*) mingw=true native_ext=.exe ;;
esac
## resolve links - $0 may be a link to Maven's home
@@ -89,6 +94,36 @@ if $mingw ; then
# TODO classpath?
fi
+if [ "${MVND_CLIENT:=auto}" = native ]; then
+ # force execute native image
+ exec "$MVND_HOME/bin/mvnd${native_ext:-}" "$@"
+elif [ "$MVND_CLIENT" = auto ]; then
+ # try native image
+ case "$(uname -a)" in
+ (CYGWIN*|MINGW*) os=windows arch="${PROCESSOR_ARCHITEW6432:-"${PROCESSOR_ARCHITECTURE:-"$(uname -m)"}"}" ;;
+ (Darwin*x86_64) os=darwin arch=amd64 ;;
+ (Darwin*arm64) os=darwin arch=aarch64 ;;
+ (Linux*) os=linux arch=$(uname -m) ;;
+ (*) os=$(uname) arch=$(uname -m) ;;
+ esac
+ [ "${arch-}" != x86_64 ] || arch=amd64
+ [ "${arch-}" != AMD64 ] || arch=amd64
+ [ "${arch-}" != arm64 ] || arch=aarch64
+
+ MVND_CMD="$MVND_HOME/bin/mvnd${native_ext:-}"
+ if [ -e "$MVND_HOME/bin/platform-$os-$arch" ] && [ -x "$MVND_CMD" ]; then
+ is_native=true
+ if [ "$os" = linux ]; then
+ case "$(ldd "$MVND_CMD" 2>&1)" in
+ (''|*"not found"*) is_native=false ;;
+ esac
+ fi
+ ! $is_native || exec "$MVND_CMD" "$@"
+ fi
+fi
+
+# fallback to pure java version
+
if [ -z "$JAVA_HOME" ] ; then
JAVACMD="`\\unset -f command; \\command -v java`"
else
diff --git a/dist/src/main/provisio/maven-distro.xml b/dist/src/main/provisio/maven-distro.xml
index 8f0605d5..0675148a 100644
--- a/dist/src/main/provisio/maven-distro.xml
+++ b/dist/src/main/provisio/maven-distro.xml
@@ -79,6 +79,7 @@
<include>mvnd</include>
<include>mvnd.exe</include>
</directory>
+ <file touch="platform-${os.detected.name}-${os.detected.arch}"/>
</fileSet>
<archive name="maven-mvnd-${project.version}-${os.detected.name}-${os.detected.arch}.zip"