You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rm...@apache.org on 2022/08/04 09:15:44 UTC

[maven-wrapper] branch enable-to-customize-classworlds.conf created (now 70289ea)

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a change to branch enable-to-customize-classworlds.conf
in repository https://gitbox.apache.org/repos/asf/maven-wrapper.git


      at 70289ea  Enable to customize classworlds.conf

This branch includes the following new commits:

     new 70289ea  Enable to customize classworlds.conf

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-wrapper] 01/01: Enable to customize classworlds.conf

Posted by rm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch enable-to-customize-classworlds.conf
in repository https://gitbox.apache.org/repos/asf/maven-wrapper.git

commit 70289ea81465aa5c4410127833fe906b5f71c3c9
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Thu Aug 4 11:15:36 2022 +0200

    Enable to customize classworlds.conf
---
 .../apache/maven/wrapper/BootstrapMainStarter.java | 37 ++++++++++++++++++++--
 .../org/apache/maven/wrapper/WrapperExecutor.java  |  2 +-
 .../apache/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 71f4186..f64ca7f 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 @@ package org.apache.maven.wrapper;
 
 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.Files;
 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 @@ import java.util.Locale;
  */
 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 f69d7cc..f606fba 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 class WrapperExecutor
         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 fb91f2d..9e874d6 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 class WrapperExecutorTest
   {
     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( )