From 70289ea81465aa5c4410127833fe906b5f71c3c9 Mon Sep 17 00:00:00 2001 From: Romain Manni-Bucau Date: Thu, 4 Aug 2022 11:15:36 +0200 Subject: [PATCH] Enable to customize classworlds.conf --- .../maven/wrapper/BootstrapMainStarter.java | 37 +++++++++++++++++-- .../apache/maven/wrapper/WrapperExecutor.java | 2 +- .../maven/wrapper/WrapperExecutorTest.java | 8 +++- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/maven-wrapper/src/main/java/org/apache/maven/wrapper/BootstrapMainStarter.java b/maven-wrapper/src/main/java/org/apache/maven/wrapper/BootstrapMainStarter.java index 71f4186d..f64ca7f2 100644 --- a/maven-wrapper/src/main/java/org/apache/maven/wrapper/BootstrapMainStarter.java +++ b/maven-wrapper/src/main/java/org/apache/maven/wrapper/BootstrapMainStarter.java @@ -21,6 +21,7 @@ import java.io.FileNotFoundException; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; @@ -29,6 +30,7 @@ import java.nio.file.Path; import java.util.Iterator; import java.util.Locale; +import java.util.Properties; /** * Maven starter, from a provided Maven home directory. @@ -37,22 +39,51 @@ */ public class BootstrapMainStarter { - public void start( String[] args, Path mavenHome ) + public void start( String[] args, Path mavenHome, Properties properties ) throws Exception { final Path mavenJar = findLauncherJar( mavenHome ); URLClassLoader contextClassLoader = new URLClassLoader( new URL[] { mavenJar.toUri().toURL() }, - ClassLoader.getSystemClassLoader().getParent() ); + ClassLoader.getSystemClassLoader().getParent() ); + + // can be useful to leak the classloader with some daemon mojo but generally a wrong idea so off by default + if ( Boolean.parseBoolean( properties.getProperty( getClass().getName() + ".leakClassloader" ) ) ) + { + doStart( args, mavenHome, properties, contextClassLoader ); + return; + } + + try ( final URLClassLoader ref = contextClassLoader ) + { + doStart( args, mavenHome, properties, contextClassLoader ); + } + } + + private void doStart( final String[] args, final Path mavenHome, + final Properties properties, + final URLClassLoader contextClassLoader ) + throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException + { Thread.currentThread().setContextClassLoader( contextClassLoader ); Class mainClass = contextClassLoader.loadClass( "org.codehaus.plexus.classworlds.launcher.Launcher" ); System.setProperty( "maven.home", mavenHome.toAbsolutePath().toString() ); - System.setProperty( "classworlds.conf", mavenHome.resolve( "bin/m2.conf" ).toAbsolutePath().toString() ); + System.setProperty( "classworlds.conf", getClassworldsConf( properties, mavenHome ) ); Method mainMethod = mainClass.getMethod( "main", String[].class ); mainMethod.invoke( null, new Object[] { args } ); } + private String getClassworldsConf( Properties properties, Path mavenHome ) + { + final String override = properties.getProperty( "classworlds.conf" ); + if ( override != null ) + { + return override; + } + return mavenHome.resolve( "bin/m2.conf" ).toAbsolutePath().toString(); + } + private Path findLauncherJar( Path mavenHome ) throws IOException { diff --git a/maven-wrapper/src/main/java/org/apache/maven/wrapper/WrapperExecutor.java b/maven-wrapper/src/main/java/org/apache/maven/wrapper/WrapperExecutor.java index f69d7cc2..f606fbaa 100644 --- a/maven-wrapper/src/main/java/org/apache/maven/wrapper/WrapperExecutor.java +++ b/maven-wrapper/src/main/java/org/apache/maven/wrapper/WrapperExecutor.java @@ -177,7 +177,7 @@ public void execute( String[] args, Installer install, BootstrapMainStarter boot throws Exception { Path mavenHome = install.createDist( config ); - bootstrapMainStarter.start( args, mavenHome ); + bootstrapMainStarter.start( args, mavenHome, properties ); } private String getProperty( String propertyName ) diff --git a/maven-wrapper/src/test/java/org/apache/maven/wrapper/WrapperExecutorTest.java b/maven-wrapper/src/test/java/org/apache/maven/wrapper/WrapperExecutorTest.java index fb91f2d0..9e874d6d 100644 --- a/maven-wrapper/src/test/java/org/apache/maven/wrapper/WrapperExecutorTest.java +++ b/maven-wrapper/src/test/java/org/apache/maven/wrapper/WrapperExecutorTest.java @@ -138,9 +138,13 @@ public void executeInstallAndLaunch() { WrapperExecutor wrapper = WrapperExecutor.forProjectDirectory( propertiesFile ); - wrapper.execute( new String[] { "arg" }, install, start ); + final String[] args = { "arg" }; + wrapper.execute( args, install, start ); verify( install ).createDist( Mockito.any( WrapperConfiguration.class ) ); - verify( start ).start( new String[] { "arg" }, mockInstallDir ); + verify( start ).start( + Mockito.eq( args ), + Mockito.eq( mockInstallDir ), + Mockito.any( Properties.class ) ); } @Test( )