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 2022/12/14 16:41:08 UTC

[maven-mvnd] branch master updated: Use muti-release jar to fallback mvnd-client to original maven (#722)

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 f8d047bd Use muti-release jar to fallback mvnd-client to original maven (#722)
f8d047bd is described below

commit f8d047bdae5f1d630635a5db30de3df80f03c924
Author: James Z.M. Gao <ga...@360.cn>
AuthorDate: Thu Dec 15 00:41:02 2022 +0800

    Use muti-release jar to fallback mvnd-client to original maven (#722)
    
    * Use muti-release jar to fallback mvnd-client to original maven
    
    The mvnd-client is built to a muti-release jar. The default version of
        DefaultClient is compiled against the same target version as the
       embedded maven (4.x, so JDK 1.8) which only invoke the MavenCli.main().
    The java-11 version is the full qualified mvnd-client.
    
    * update cmd scripts
    
    * embedded maven now works under JDK 1.8
    
    Build SimpleAppender for JDK 1.8 since it is the log appender only
       for the embedded maven
    
    Co-authored-by: Guillaume Nodet <gn...@gmail.com>
---
 client/pom.xml                                     |  49 ++++++++--
 .../org/mvndaemon/mvnd/client/DefaultClient.java   |  37 ++++++++
 .../org/mvndaemon/mvnd/client/DefaultClient.java   |   2 +
 common/pom.xml                                     |   4 +-
 daemon/pom.xml                                     |  23 +++++
 .../mvnd/logging/internal/SimpleAppender.java      |   0
 .../syncontext/DaemonNamedLockFactorySelector.java |  45 ----------
 dist/src/main/distro/bin/m2.conf                   |  27 ++++++
 dist/src/main/distro/bin/mvnd.cmd                  | 100 +++++++++++++++++++--
 dist/src/main/distro/bin/mvnd.sh                   |  48 +++++++---
 dist/src/main/distro/mvn/bin/mvn                   |   2 -
 dist/src/main/distro/mvn/bin/mvn.cmd               |   2 -
 pom.xml                                            |  22 +++++
 13 files changed, 282 insertions(+), 79 deletions(-)

diff --git a/client/pom.xml b/client/pom.xml
index 3b082ecf..e2c3dd91 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -31,8 +31,7 @@
   <name>Maven Daemon - Client</name>
 
   <properties>
-    <maven.compiler.target>11</maven.compiler.target>
-    <maven.compiler.source>11</maven.compiler.source>
+    <maven.compiler.release>11</maven.compiler.release>
     <graalvm-native-static-opt/>
     <graalvm-native-glibc-opt/>
   </properties>
@@ -88,6 +87,7 @@
             <configuration>
               <rules>
                 <enforceBytecodeVersion>
+                  <maxJdkVersion>${maven.compiler.release}</maxJdkVersion>
                   <excludes>
                     <exclude>org.graalvm.nativeimage:svm</exclude>
                   </excludes>
@@ -115,11 +115,48 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-compile</id>
+            <goals>
+              <goal>compile</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>fallback-main</id>
+            <goals>
+              <goal>compile</goal>
+            </goals>
+            <configuration>
+              <release>${maven-dist.required.jdk}</release>
+              <compileSourceRoots>
+                <root>${project.basedir}/src/main/java-fallback</root>
+              </compileSourceRoots>
+            </configuration>
+          </execution>
+          <execution>
+            <id>mvnd-main</id>
+            <goals>
+              <goal>compile</goal>
+            </goals>
+            <configuration>
+              <multiReleaseOutput>true</multiReleaseOutput>
+              <compileSourceRoots>
+                <root>${project.basedir}/src/main/java-mvnd</root>
+              </compileSourceRoots>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
         <configuration>
-          <compilerArgs>
-            <arg>--add-exports=java.base/sun.nio.ch=ALL-UNNAMED</arg>
-            <arg>--add-exports=java.base/jdk.internal.module=ALL-UNNAMED</arg>
-          </compilerArgs>
+          <archive>
+            <manifestEntries>
+              <Multi-Release>true</Multi-Release>
+            </manifestEntries>
+          </archive>
         </configuration>
       </plugin>
       <plugin>
diff --git a/client/src/main/java-fallback/org/mvndaemon/mvnd/client/DefaultClient.java b/client/src/main/java-fallback/org/mvndaemon/mvnd/client/DefaultClient.java
new file mode 100644
index 00000000..f50419aa
--- /dev/null
+++ b/client/src/main/java-fallback/org/mvndaemon/mvnd/client/DefaultClient.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2019 the original author or authors.
+ *
+ * Licensed 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.
+ */
+package org.mvndaemon.mvnd.client;
+
+import org.apache.maven.cli.MavenCli;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class DefaultClient {
+    public static void main(String[] argv) throws Exception {
+        final String logbackConfFallback = System.getProperty("logback.configurationFile.fallback");
+        if (null != logbackConfFallback && !"".equals(logbackConfFallback)) {
+            System.setProperty("logback.configurationFile", logbackConfFallback);
+            System.clearProperty("logback.configurationFile.fallback");
+        }
+
+        final Logger LOGGER = LoggerFactory.getLogger(DefaultClient.class);
+	LOGGER.warn("Found old JDK, fallback to the embedded maven!");
+	LOGGER.warn("Use JDK 11+ to run maven-mvnd client!");
+
+        MavenCli.main(argv);
+    }
+}
diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java b/client/src/main/java-mvnd/org/mvndaemon/mvnd/client/DefaultClient.java
similarity index 99%
rename from client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java
rename to client/src/main/java-mvnd/org/mvndaemon/mvnd/client/DefaultClient.java
index 9c4774da..417f17b4 100644
--- a/client/src/main/java/org/mvndaemon/mvnd/client/DefaultClient.java
+++ b/client/src/main/java-mvnd/org/mvndaemon/mvnd/client/DefaultClient.java
@@ -68,6 +68,8 @@ public class DefaultClient implements Client {
     private final DaemonParameters parameters;
 
     public static void main(String[] argv) throws Exception {
+        System.clearProperty("logback.configurationFile.fallback");
+
         final List<String> args = new ArrayList<>(Arrays.asList(argv));
 
         // Log file
diff --git a/common/pom.xml b/common/pom.xml
index 06cd555e..0e56e6f6 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -88,7 +88,7 @@
             <artifactId>maven-compiler-plugin</artifactId>
             <executions>
               <execution>
-                <id>default</id>
+                <id>default-compile</id>
                 <goals>
                   <goal>compile</goal>
                 </goals>
@@ -143,7 +143,7 @@
             <artifactId>maven-compiler-plugin</artifactId>
             <executions>
               <execution>
-                <id>default</id>
+                <id>default-compile</id>
                 <goals>
                   <goal>compile</goal>
                 </goals>
diff --git a/daemon/pom.xml b/daemon/pom.xml
index b35e712c..d0b804de 100644
--- a/daemon/pom.xml
+++ b/daemon/pom.xml
@@ -99,6 +99,29 @@
       </resource>
     </resources>
     <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-compile</id>
+            <goals>
+              <goal>compile</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>fallback</id>
+            <goals>
+              <goal>compile</goal>
+            </goals>
+            <configuration>
+              <release>${maven-dist.required.jdk}</release>
+              <compileSourceRoots>
+                <root>${project.basedir}/src/main/java-fallback</root>
+              </compileSourceRoots>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
diff --git a/daemon/src/main/java/org/mvndaemon/mvnd/logging/internal/SimpleAppender.java b/daemon/src/main/java-fallback/org/mvndaemon/mvnd/logging/internal/SimpleAppender.java
similarity index 100%
rename from daemon/src/main/java/org/mvndaemon/mvnd/logging/internal/SimpleAppender.java
rename to daemon/src/main/java-fallback/org/mvndaemon/mvnd/logging/internal/SimpleAppender.java
diff --git a/daemon/src/main/java/org/mvndaemon/mvnd/syncontext/DaemonNamedLockFactorySelector.java b/daemon/src/main/java/org/mvndaemon/mvnd/syncontext/DaemonNamedLockFactorySelector.java
deleted file mode 100644
index c6f73bac..00000000
--- a/daemon/src/main/java/org/mvndaemon/mvnd/syncontext/DaemonNamedLockFactorySelector.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.
- */
-package org.mvndaemon.mvnd.syncontext;
-
-import java.util.Map;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-import org.eclipse.aether.internal.impl.synccontext.named.FileGAVNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactorySelectorSupport;
-import org.eclipse.aether.named.NamedLockFactory;
-import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
-import org.eclipse.sisu.Priority;
-
-/**
- * Mvnd selector implementation: it differs from
- * {@link org.eclipse.aether.internal.impl.synccontext.named.SimpleNamedLockFactorySelector} only by default values.
- */
-@Singleton
-@Named
-@Priority(10)
-public final class DaemonNamedLockFactorySelector extends NamedLockFactorySelectorSupport {
-    @Inject
-    public DaemonNamedLockFactorySelector(
-            final Map<String, NamedLockFactory> factories, final Map<String, NameMapper> nameMappers) {
-        super(factories, FileLockNamedLockFactory.NAME, nameMappers, FileGAVNameMapper.NAME);
-    }
-}
diff --git a/dist/src/main/distro/bin/m2.conf b/dist/src/main/distro/bin/m2.conf
new file mode 100644
index 00000000..1f7aa818
--- /dev/null
+++ b/dist/src/main/distro/bin/m2.conf
@@ -0,0 +1,27 @@
+# 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.
+main is org.mvndaemon.mvnd.client.DefaultClient from plexus.core
+
+set maven.home default ${mvnd.home}/mvn
+set maven.conf default ${maven.home}/conf
+set logback.configurationFile default ${mvnd.home}/conf/logback-client.xml
+set logback.configurationFile.fallback default ${maven.conf}/logging/logback.xml
+
+[plexus.core]
+load ${maven.conf}/logging
+load ${maven.home}/lib/ext/*.jar
+load ${maven.home}/lib/*.jar
diff --git a/dist/src/main/distro/bin/mvnd.cmd b/dist/src/main/distro/bin/mvnd.cmd
index 060d08e7..62d29d49 100644
--- a/dist/src/main/distro/bin/mvnd.cmd
+++ b/dist/src/main/distro/bin/mvnd.cmd
@@ -73,22 +73,106 @@ goto error
 
 set MAVEN_CMD_LINE_ARGS=%*
 
+@REM Find the project basedir, i.e., the directory that contains the directory ".mvn".
+@REM Fallback to current working directory if not found.
+
+set "EXEC_DIR=%CD%"
+set "WDIR=%EXEC_DIR%"
+
+@REM Look for the --file switch and start the search for the .mvn directory from the specified
+@REM POM location, if supplied.
+
+set FILE_ARG=
+:arg_loop
+if "%~1" == "-f" (
+  set "FILE_ARG=%~2"
+  shift
+  goto process_file_arg
+)
+if "%~1" == "--file" (
+  set "FILE_ARG=%~2"
+  shift
+  goto process_file_arg
+)
+@REM If none of the above, skip the argument
+shift
+if not "%~1" == "" (
+  goto arg_loop
+) else (
+  goto findBaseDir
+)
+
+:process_file_arg
+if "%FILE_ARG%" == "" (
+  goto findBaseDir
+)
+if not exist "%FILE_ARG%" (
+  echo POM file "%FILE_ARG%" specified the -f/--file command-line argument does not exist >&2
+  goto error
+)
+if exist "%FILE_ARG%\*" (
+  set "POM_DIR=%FILE_ARG%"
+) else (
+  call :get_directory_from_file "%FILE_ARG%"
+)
+if not exist "%POM_DIR%" (
+  echo Directory "%POM_DIR%" extracted from the -f/--file command-line argument "%FILE_ARG%" does not exist >&2
+  goto error
+)
+set "WDIR=%POM_DIR%"
+goto findBaseDir
+
+:get_directory_from_file
+set "POM_DIR=%~dp1"
+:stripPomDir
+if not "_%POM_DIR:~-1%"=="_\" goto pomDirStripped
+set "POM_DIR=%POM_DIR:~0,-1%"
+goto stripPomDir
+:pomDirStripped
+exit /b
+
+:findBaseDir
+cd /d "%WDIR%"
+:findBaseDirLoop
+if exist "%WDIR%\.mvn" goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set "WDIR=%CD%"
+goto findBaseDirLoop
+
+:baseDirFound
+set "MAVEN_PROJECTBASEDIR=%WDIR%"
+cd /d "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+if "_%EXEC_DIR:~-1%"=="_\" set "EXEC_DIR=%EXEC_DIR:~0,-1%"
+set "MAVEN_PROJECTBASEDIR=%EXEC_DIR%"
+cd /d "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+set "jvmConfig=\.mvn\jvm.config"
+if not exist "%MAVEN_PROJECTBASEDIR%%jvmConfig%" goto endReadAdditionalConfig
+
 @setlocal EnableExtensions EnableDelayedExpansion
-for %%i in ("%MVND_HOME%"\mvn\boot\*.jar "%MVND_HOME%"\mvn\lib\ext\*.jar "%MVND_HOME%"\mvn\lib\*.jar) do set DAEMON_JAR=!DAEMON_JAR!;%%i
-@endlocal & set DAEMON_JAR="%DAEMON_JAR%"
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
 
-set DAEMON_LAUNCHER=org.mvndaemon.mvnd.client.DefaultClient
+for %%i in ("%MVND_HOME%"\mvn\boot\plexus-classworlds-*) do set CLASSWORLDS_JAR="%%i"
+set CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
 
 "%JAVACMD%" ^
   %JVM_CONFIG_MAVEN_PROPS% ^
   %MAVEN_OPTS% ^
   %MAVEN_DEBUG_OPTS% ^
-  -classpath %DAEMON_JAR% ^
-  "-Dlogback.configurationFile=%MVND_HOME%\conf\logback-client.xml" ^
+  -classpath %CLASSWORLDS_JAR% ^
+  "-Dclassworlds.conf=%MVND_HOME%\bin\m2.conf"
   "-Dmvnd.home=%MVND_HOME%" ^
-  "-Dmaven.home=%MVND_HOME%\mvn" ^
-  "-Dlibrary.jansi.path=%MVND_HOME%\mvn\lib\jansi-native" ^
-  %DAEMON_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
+  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
+  %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
 if ERRORLEVEL 1 goto error
 goto end
 
diff --git a/dist/src/main/distro/bin/mvnd.sh b/dist/src/main/distro/bin/mvnd.sh
index 89352082..df821112 100755
--- a/dist/src/main/distro/bin/mvnd.sh
+++ b/dist/src/main/distro/bin/mvnd.sh
@@ -101,9 +101,8 @@ if [ ! -x "$JAVACMD" ] ; then
   exit 1
 fi
 
-DAEMON_JAR=`echo "${MVND_HOME}"/mvn/boot/*.jar "${MVND_HOME}"/mvn/lib/ext/*.jar "${MVND_HOME}"/mvn/lib/*.jar`
-DAEMON_JAR=$(echo $DAEMON_JAR | sed -e 's/ /:/g')
-DAEMON_LAUNCHER=org.mvndaemon.mvnd.client.DefaultClient
+CLASSWORLDS_JAR=`echo "${MVND_HOME}"/mvn/boot/plexus-classworlds-*.jar`
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
 
 # For Cygwin, switch paths to Windows format before running java
 if $cygwin ; then
@@ -113,10 +112,27 @@ if $cygwin ; then
     JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
   [ -n "$CLASSPATH" ] &&
     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
-  [ -n "$DAEMON_JAR" ] &&
-    DAEMON_JAR=`cygpath --path --windows "$DAEMON_JAR"`
+  [ -n "$CLASSWORLDS_JAR" ] &&
+    CLASSWORLDS_JAR=`cygpath --path --windows "$CLASSWORLDS_JAR"`
 fi
 
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+(
+  basedir=`find_file_argument_basedir "$@"`
+  wdir="${basedir}"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    wdir=`cd "$wdir/.."; pwd`
+  done
+  echo "${basedir}"
+)
+}
+
 find_file_argument_basedir() {
 (
   basedir=`pwd`
@@ -154,17 +170,21 @@ concat_lines() {
   fi
 }
 
-# Provide a "standardized" way to retrieve the CLI args that will
-# work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
-export MAVEN_CMD_LINE_ARGS
+MAVEN_PROJECTBASEDIR=`find_maven_basedir "$@"`
+MAVEN_OPTS="`concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config"` $MAVEN_OPTS"
+
+# For Cygwin, switch project base directory path to Windows format before
+# executing Maven otherwise this will cause Maven not to consider it.
+if $cygwin ; then
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+  MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
 
 exec "$JAVACMD" \
   $MAVEN_OPTS \
   $MAVEN_DEBUG_OPTS \
-  -classpath "${DAEMON_JAR}" \
-  "-Dlogback.configurationFile=${MVND_HOME}/conf/logback-client.xml" \
+  -classpath "${CLASSWORLDS_JAR}" \
+  "-Dclassworlds.conf=${MVND_HOME}/bin/m2.conf" \
   "-Dmvnd.home=${MVND_HOME}" \
-  "-Dmaven.home=${MVND_HOME}/mvn" \
-  "-Dlibrary.jansi.path=${MVND_HOME}/mvn/lib/jansi-native" \
-  ${DAEMON_LAUNCHER} "$@"
+  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${CLASSWORLDS_LAUNCHER} "$@"
diff --git a/dist/src/main/distro/mvn/bin/mvn b/dist/src/main/distro/mvn/bin/mvn
index f23e7bb7..97363a1e 100755
--- a/dist/src/main/distro/mvn/bin/mvn
+++ b/dist/src/main/distro/mvn/bin/mvn
@@ -193,8 +193,6 @@ exec "$JAVACMD" \
   -classpath "${CLASSWORLDS_JAR}" \
   "-Dlogback.configurationFile=${MAVEN_HOME}/conf/logging/logback.xml" \
   "-Dclassworlds.conf=${MAVEN_HOME}/bin/m2.conf" \
-  "-Dmvnd.home=${MAVEN_HOME}" \
   "-Dmaven.home=${MAVEN_HOME}" \
-  "-Dlibrary.jansi.path=${MAVEN_HOME}/lib/jansi-native" \
   "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
   ${CLASSWORLDS_LAUNCHER} "$@"
diff --git a/dist/src/main/distro/mvn/bin/mvn.cmd b/dist/src/main/distro/mvn/bin/mvn.cmd
index b08e9461..17cb1cb7 100644
--- a/dist/src/main/distro/mvn/bin/mvn.cmd
+++ b/dist/src/main/distro/mvn/bin/mvn.cmd
@@ -174,9 +174,7 @@ set CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
   -classpath %CLASSWORLDS_JAR% ^
   "-Dlogback.configurationFile=%MAVEN_HOME%\conf\logging\logback.xml" ^
   "-Dclassworlds.conf=%MAVEN_HOME%\bin\m2.conf" ^
-  "-Dmvnd.home=%MAVEN_HOME%" ^
   "-Dmaven.home=%MAVEN_HOME%" ^
-  "-Dlibrary.jansi.path=%MAVEN_HOME%\lib\jansi-native" ^
   "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
   %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
 if ERRORLEVEL 1 goto error
diff --git a/pom.xml b/pom.xml
index 955aabbd..8e4e0123 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,6 +66,7 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <maven.compiler.target>1.8</maven.compiler.target>
     <maven.compiler.source>1.8</maven.compiler.source>
+    <maven-dist.required.jdk>8</maven-dist.required.jdk>
     <project.build.outputTimestamp>2022-11-19T15:16:03Z</project.build.outputTimestamp>
     <trimStackTrace>false</trimStackTrace>
     <project.github.repository>apache/maven-mvnd</project.github.repository>
@@ -476,6 +477,27 @@
       <id>source-distribution</id>
       <build>
         <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-enforcer-plugin</artifactId>
+            <inherited>false</inherited>
+            <executions>
+              <execution>
+                <id>build-with-jdk11+</id>
+                <goals>
+                  <goal>enforce</goal>
+                </goals>
+                <phase>validate</phase>
+                <configuration>
+                  <rules>
+                    <requireJavaVersion>
+                      <version>[11,)</version>
+                    </requireJavaVersion>
+                  </rules>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-assembly-plugin</artifactId>