From 8d2ae6da4dcd62f9c2e614caff5c8e592310dc75 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 24 Jan 2023 10:50:40 +0100 Subject: [PATCH] Attempt at moving mvn as first class citizen in mvnd distribution, #392 (#769) # Conflicts: # dist/src/main/provisio/maven-distro.xml --- .../mvnd/client/DaemonConnector.java | 10 +-- .../mvnd/client/DaemonParameters.java | 7 +- .../mvndaemon/mvnd/common/MavenDaemon.java | 4 +- dist/src/main/distro/{mvn => }/bin/mvn | 2 +- dist/src/main/distro/{mvn => }/bin/mvn.cmd | 2 +- .../distro/{mvn/bin/m2.conf => bin/mvn.conf} | 0 dist/src/main/distro/{mvn => }/bin/mvnDebug | 0 .../main/distro/{mvn => }/bin/mvnDebug.cmd | 0 dist/src/main/distro/bin/mvnd.cmd | 4 +- .../main/distro/bin/{m2.conf => mvnd.conf} | 5 +- dist/src/main/distro/bin/mvnd.sh | 4 +- .../conf/{ => logging}/logback-client.xml | 0 .../{logback.xml => logging/logback-mvnd.xml} | 0 .../distro/{mvn => }/conf/logging/logback.xml | 0 dist/src/main/provisio/maven-distro.xml | 82 ++++++++----------- .../java/org/mvndaemon/mvnd/it/DistroIT.java | 56 ++++++------- .../mvndaemon/mvnd/it/MavenConfNativeIT.java | 2 +- pom.xml | 5 ++ 18 files changed, 87 insertions(+), 96 deletions(-) rename dist/src/main/distro/{mvn => }/bin/mvn (99%) rename dist/src/main/distro/{mvn => }/bin/mvn.cmd (95%) rename dist/src/main/distro/{mvn/bin/m2.conf => bin/mvn.conf} (100%) rename dist/src/main/distro/{mvn => }/bin/mvnDebug (100%) rename dist/src/main/distro/{mvn => }/bin/mvnDebug.cmd (100%) rename dist/src/main/distro/bin/{m2.conf => mvnd.conf} (88%) rename dist/src/main/distro/conf/{ => logging}/logback-client.xml (100%) rename dist/src/main/distro/conf/{logback.xml => logging/logback-mvnd.xml} (100%) rename dist/src/main/distro/{mvn => }/conf/logging/logback.xml (100%) diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java index b9dfb7e1..53cbacc4 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonConnector.java @@ -339,7 +339,7 @@ public class DaemonConnector { final Path mvndHome = parameters.mvndHome(); final Path workingDir = parameters.userDir(); String command = ""; - try (DirectoryStream jarPaths = Files.newDirectoryStream(mvndHome.resolve("mvn/lib/ext"))) { + try (DirectoryStream jarPaths = Files.newDirectoryStream(mvndHome.resolve("lib"))) { List args = new ArrayList<>(); // executable final String java = Os.current().isUnixLike() ? "bin/java" : "bin\\java.exe"; @@ -358,10 +358,10 @@ public class DaemonConnector { } } if (mvndCommonPath == null) { - throw new IllegalStateException("Could not find mvnd-common jar in mvn/lib/ext/"); + throw new IllegalStateException("Could not find mvnd-common jar in lib/"); } if (mvndAgentPath == null) { - throw new IllegalStateException("Could not find mvnd-agent jar in mvn/lib/ext/"); + throw new IllegalStateException("Could not find mvnd-agent jar in lib/"); } args.add("-classpath"); args.add(mvndCommonPath + File.pathSeparator + mvndAgentPath); @@ -419,8 +419,8 @@ public class DaemonConnector { } Environment.MVND_HOME.addSystemProperty(args, mvndHome.toString()); - args.add("-Dmaven.home=" + mvndHome.resolve("mvn")); - args.add("-Dmaven.conf=" + mvndHome.resolve("mvn/conf")); + args.add("-Dmaven.home=" + mvndHome); + args.add("-Dmaven.conf=" + mvndHome.resolve("conf")); Environment.MVND_JAVA_HOME.addSystemProperty( args, parameters.javaHome().toString()); diff --git a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java index e6c6a4ec..7dfa00be 100644 --- a/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java +++ b/client/src/main/java/org/mvndaemon/mvnd/client/DaemonParameters.java @@ -122,8 +122,8 @@ public class DaemonParameters { if (Environment.isNative() && cmd.isPresent()) { final Path mvndH = Paths.get(cmd.get()).getParent().getParent(); if (mvndH != null) { - final Path mvndDaemonLib = mvndH.resolve("mvn/lib/ext/mvnd-daemon-" - + BuildProperties.getInstance().getVersion() + ".jar"); + final Path mvndDaemonLib = mvndH.resolve( + "lib/mvnd-daemon-" + BuildProperties.getInstance().getVersion() + ".jar"); if (Files.exists(mvndDaemonLib)) { return mvndH.toString(); } @@ -238,7 +238,8 @@ public class DaemonParameters { public Path logbackConfigurationPath() { return property(Environment.MVND_LOGBACK) - .orDefault(() -> mvndHome().resolve("conf/logback.xml").toString()) + .orDefault(() -> + mvndHome().resolve("conf/logging/logback-mvnd.xml").toString()) .orFail() .asPath(); } diff --git a/common/src/main/java/org/mvndaemon/mvnd/common/MavenDaemon.java b/common/src/main/java/org/mvndaemon/mvnd/common/MavenDaemon.java index cf4bb133..0ebbfee5 100644 --- a/common/src/main/java/org/mvndaemon/mvnd/common/MavenDaemon.java +++ b/common/src/main/java/org/mvndaemon/mvnd/common/MavenDaemon.java @@ -31,7 +31,7 @@ public class MavenDaemon { final Path mvndHome = Environment.MVND_HOME.asPath(); URL[] classpath = Stream.concat( /* jars */ - Stream.of("mvn/lib/ext", "mvn/lib", "mvn/boot") + Stream.of("lib/ext", "lib", "boot") .map(mvndHome::resolve) .flatMap((Path p) -> { try { @@ -46,7 +46,7 @@ public class MavenDaemon { }) .filter(Files::isRegularFile), /* resources */ - Stream.of(mvndHome.resolve("mvn/conf"), mvndHome.resolve("mvn/conf/logging"))) + Stream.of(mvndHome.resolve("conf"), mvndHome.resolve("conf/logging"))) .map(Path::normalize) .map(Path::toUri) .map(uri -> { diff --git a/dist/src/main/distro/mvn/bin/mvn b/dist/src/main/distro/bin/mvn similarity index 99% rename from dist/src/main/distro/mvn/bin/mvn rename to dist/src/main/distro/bin/mvn index 97363a1e..50395f00 100755 --- a/dist/src/main/distro/mvn/bin/mvn +++ b/dist/src/main/distro/bin/mvn @@ -192,7 +192,7 @@ exec "$JAVACMD" \ $MAVEN_DEBUG_OPTS \ -classpath "${CLASSWORLDS_JAR}" \ "-Dlogback.configurationFile=${MAVEN_HOME}/conf/logging/logback.xml" \ - "-Dclassworlds.conf=${MAVEN_HOME}/bin/m2.conf" \ + "-Dclassworlds.conf=${MAVEN_HOME}/bin/mvn.conf" \ "-Dmaven.home=${MAVEN_HOME}" \ "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${CLASSWORLDS_LAUNCHER} "$@" diff --git a/dist/src/main/distro/mvn/bin/mvn.cmd b/dist/src/main/distro/bin/mvn.cmd similarity index 95% rename from dist/src/main/distro/mvn/bin/mvn.cmd rename to dist/src/main/distro/bin/mvn.cmd index 17cb1cb7..1a75f297 100644 --- a/dist/src/main/distro/mvn/bin/mvn.cmd +++ b/dist/src/main/distro/bin/mvn.cmd @@ -173,7 +173,7 @@ set CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher %MAVEN_DEBUG_OPTS% ^ -classpath %CLASSWORLDS_JAR% ^ "-Dlogback.configurationFile=%MAVEN_HOME%\conf\logging\logback.xml" ^ - "-Dclassworlds.conf=%MAVEN_HOME%\bin\m2.conf" ^ + "-Dclassworlds.conf=%MAVEN_HOME%\bin\mvn.conf" ^ "-Dmaven.home=%MAVEN_HOME%" ^ "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS% diff --git a/dist/src/main/distro/mvn/bin/m2.conf b/dist/src/main/distro/bin/mvn.conf similarity index 100% rename from dist/src/main/distro/mvn/bin/m2.conf rename to dist/src/main/distro/bin/mvn.conf diff --git a/dist/src/main/distro/mvn/bin/mvnDebug b/dist/src/main/distro/bin/mvnDebug similarity index 100% rename from dist/src/main/distro/mvn/bin/mvnDebug rename to dist/src/main/distro/bin/mvnDebug diff --git a/dist/src/main/distro/mvn/bin/mvnDebug.cmd b/dist/src/main/distro/bin/mvnDebug.cmd similarity index 100% rename from dist/src/main/distro/mvn/bin/mvnDebug.cmd rename to dist/src/main/distro/bin/mvnDebug.cmd diff --git a/dist/src/main/distro/bin/mvnd.cmd b/dist/src/main/distro/bin/mvnd.cmd index 62d29d49..a14caedf 100644 --- a/dist/src/main/distro/bin/mvnd.cmd +++ b/dist/src/main/distro/bin/mvnd.cmd @@ -161,7 +161,7 @@ for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do s :endReadAdditionalConfig -for %%i in ("%MVND_HOME%"\mvn\boot\plexus-classworlds-*) do set CLASSWORLDS_JAR="%%i" +for %%i in ("%MVND_HOME%"\boot\plexus-classworlds-*) do set CLASSWORLDS_JAR="%%i" set CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher "%JAVACMD%" ^ @@ -169,7 +169,7 @@ set CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher %MAVEN_OPTS% ^ %MAVEN_DEBUG_OPTS% ^ -classpath %CLASSWORLDS_JAR% ^ - "-Dclassworlds.conf=%MVND_HOME%\bin\m2.conf" + "-Dclassworlds.conf=%MVND_HOME%\bin\mvnd.conf" "-Dmvnd.home=%MVND_HOME%" ^ "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ %CLASSWORLDS_LAUNCHER% %MAVEN_CMD_LINE_ARGS% diff --git a/dist/src/main/distro/bin/m2.conf b/dist/src/main/distro/bin/mvnd.conf similarity index 88% rename from dist/src/main/distro/bin/m2.conf rename to dist/src/main/distro/bin/mvnd.conf index 1f7aa818..3df58b2b 100644 --- a/dist/src/main/distro/bin/m2.conf +++ b/dist/src/main/distro/bin/mvnd.conf @@ -16,9 +16,10 @@ # under the License. main is org.mvndaemon.mvnd.client.DefaultClient from plexus.core -set maven.home default ${mvnd.home}/mvn +set maven.home default ${mvnd.home} set maven.conf default ${maven.home}/conf -set logback.configurationFile default ${mvnd.home}/conf/logback-client.xml + +set logback.configurationFile default ${maven.conf}/logging/logback-client.xml set logback.configurationFile.fallback default ${maven.conf}/logging/logback.xml [plexus.core] diff --git a/dist/src/main/distro/bin/mvnd.sh b/dist/src/main/distro/bin/mvnd.sh index df821112..029ac1a5 100755 --- a/dist/src/main/distro/bin/mvnd.sh +++ b/dist/src/main/distro/bin/mvnd.sh @@ -101,7 +101,7 @@ if [ ! -x "$JAVACMD" ] ; then exit 1 fi -CLASSWORLDS_JAR=`echo "${MVND_HOME}"/mvn/boot/plexus-classworlds-*.jar` +CLASSWORLDS_JAR=`echo "${MVND_HOME}"/boot/plexus-classworlds-*.jar` CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher # For Cygwin, switch paths to Windows format before running java @@ -184,7 +184,7 @@ exec "$JAVACMD" \ $MAVEN_OPTS \ $MAVEN_DEBUG_OPTS \ -classpath "${CLASSWORLDS_JAR}" \ - "-Dclassworlds.conf=${MVND_HOME}/bin/m2.conf" \ + "-Dclassworlds.conf=${MVND_HOME}/bin/mvnd.conf" \ "-Dmvnd.home=${MVND_HOME}" \ "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${CLASSWORLDS_LAUNCHER} "$@" diff --git a/dist/src/main/distro/conf/logback-client.xml b/dist/src/main/distro/conf/logging/logback-client.xml similarity index 100% rename from dist/src/main/distro/conf/logback-client.xml rename to dist/src/main/distro/conf/logging/logback-client.xml diff --git a/dist/src/main/distro/conf/logback.xml b/dist/src/main/distro/conf/logging/logback-mvnd.xml similarity index 100% rename from dist/src/main/distro/conf/logback.xml rename to dist/src/main/distro/conf/logging/logback-mvnd.xml diff --git a/dist/src/main/distro/mvn/conf/logging/logback.xml b/dist/src/main/distro/conf/logging/logback.xml similarity index 100% rename from dist/src/main/distro/mvn/conf/logging/logback.xml rename to dist/src/main/distro/conf/logging/logback.xml diff --git a/dist/src/main/provisio/maven-distro.xml b/dist/src/main/provisio/maven-distro.xml index 56c8b68d..e39e9d61 100644 --- a/dist/src/main/provisio/maven-distro.xml +++ b/dist/src/main/provisio/maven-distro.xml @@ -17,65 +17,53 @@ --> - + + excludes="conf/logging/*,lib/maven-slf4j-provider*" /> - - - - - - - - + + + + + + + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integration-tests/src/test/java/org/mvndaemon/mvnd/it/DistroIT.java b/integration-tests/src/test/java/org/mvndaemon/mvnd/it/DistroIT.java index 1044673d..5691c848 100644 --- a/integration-tests/src/test/java/org/mvndaemon/mvnd/it/DistroIT.java +++ b/integration-tests/src/test/java/org/mvndaemon/mvnd/it/DistroIT.java @@ -21,10 +21,8 @@ package org.mvndaemon.mvnd.it; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.List; -import java.util.Set; -import java.util.TreeSet; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -33,6 +31,8 @@ import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class DistroIT { /** @@ -40,20 +40,16 @@ public class DistroIT { */ @Test void noDuplicateJars() { - final Path mavenHome = Paths.get(System.getProperty("mvnd.home")); - Set mavenLibs = - streamJars(mavenHome, "mvn/lib", "mvn/boot").collect(Collectors.toCollection(TreeSet::new)); - Assertions.assertFalse(mavenLibs.isEmpty()); - final List mvndJars = streamJars(mavenHome, "mvn/lib/ext").collect(Collectors.toList()); - Assertions.assertFalse(mvndJars.isEmpty()); - - final List dups = mvndJars.stream() - .filter(avc -> mavenLibs.stream().anyMatch(mvnAvc -> mvnAvc.sameArtifactId(avc))) + String property = System.getProperty("mvnd.home"); + assertNotNull(property, "mvnd.home must be defined"); + final Path mavenHome = Paths.get(property); + List avcs = listJars(mavenHome); + Map> avcsByArtifactId = avcs.stream().collect(Collectors.groupingBy(Avc::getArtifactId)); + List> duplicateJars = avcsByArtifactId.values().stream() + .filter(list -> list.size() > 1) .collect(Collectors.toList()); - final String msg = mavenHome.resolve("mvn/lib/ext") + " contains duplicates available in " - + mavenHome.resolve("mvn/lib") + " or " + mavenHome.resolve("mvn/boot"); - Assertions.assertEquals(new ArrayList(), dups, msg); + Assertions.assertTrue(duplicateJars.isEmpty(), mavenHome + " contains duplicates jars" + duplicateJars); } @Test @@ -69,21 +65,17 @@ public class DistroIT { Assertions.assertEquals(classifier, avc.classifier, "classifier in " + jarName); } - private static Stream streamJars(Path mavenHome, String... dirs) { - return Stream.of(dirs) - .map(mavenHome::resolve) - .flatMap((Path p) -> { - try { - return Files.list(p); - } catch (java.io.IOException e) { - throw new RuntimeException("Could not list " + p, e); - } - }) - .filter(p -> p.getFileName().toString().endsWith(".jar")) - .filter(Files::isRegularFile) - .map(Path::getFileName) - .map(Path::toString) - .map(Avc::of); + private static List listJars(Path mavenHome) { + try (Stream stream = Files.walk(mavenHome)) { + return stream.filter(p -> p.getFileName().toString().endsWith(".jar")) + .filter(Files::isRegularFile) + .map(Path::getFileName) + .map(Path::toString) + .map(Avc::of) + .collect(Collectors.toList()); + } catch (java.io.IOException e) { + throw new RuntimeException("Could not list " + mavenHome, e); + } } static class Avc implements Comparable { @@ -113,6 +105,10 @@ public class DistroIT { this.jarName = jarName; } + public String getArtifactId() { + return artifactId; + } + @Override public String toString() { return jarName; diff --git a/integration-tests/src/test/java/org/mvndaemon/mvnd/it/MavenConfNativeIT.java b/integration-tests/src/test/java/org/mvndaemon/mvnd/it/MavenConfNativeIT.java index f562b233..9e291e60 100644 --- a/integration-tests/src/test/java/org/mvndaemon/mvnd/it/MavenConfNativeIT.java +++ b/integration-tests/src/test/java/org/mvndaemon/mvnd/it/MavenConfNativeIT.java @@ -52,7 +52,7 @@ public class MavenConfNativeIT { "-DforceStdout", "--raw-streams") .assertSuccess(); - String conf = parameters.mvndHome().resolve("mvn/conf").toString(); + String conf = parameters.mvndHome().resolve("conf").toString(); assertTrue( o.getMessages().stream().anyMatch(m -> m.toString().contains(conf)), "Output should contain " + conf); } diff --git a/pom.xml b/pom.xml index b23a5f76..1db39f99 100644 --- a/pom.xml +++ b/pom.xml @@ -120,6 +120,11 @@ logback-classic ${logback.version} + + ch.qos.logback + logback-core + ${logback.version} + org.slf4j slf4j-api