From 51f06c7d0d90d38a73880f0761e50dc244f2a6ab Mon Sep 17 00:00:00 2001 From: Peter Palaga Date: Mon, 29 Jun 2020 10:12:06 +0200 Subject: [PATCH] Fix #33 Maven mojo change ignored --- .../org/apache/maven/cli/DaemonMavenCli.java | 1899 +++++++++-------- 1 file changed, 961 insertions(+), 938 deletions(-) diff --git a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java index 9939d27d3..96142a30b 100644 --- a/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java +++ b/daemon/src/main/java/org/apache/maven/cli/DaemonMavenCli.java @@ -23,7 +23,11 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; +import java.net.URISyntaxException; +import java.net.URL; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -82,9 +86,10 @@ import org.codehaus.plexus.DefaultContainerConfiguration; import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.PlexusContainerException; import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.classworlds.realm.ClassRealm; +import org.codehaus.plexus.classworlds.realm.NoSuchRealmException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.logging.LoggerManager; import org.codehaus.plexus.util.StringUtils; @@ -122,57 +127,37 @@ public class DaemonMavenCli public static final String STYLE_COLOR_PROPERTY = "style.color"; - private final LoggerManager plexusLoggerManager; - private final ILoggerFactory slf4jLoggerFactory; private final Logger slf4jLogger; private final ClassWorld classWorld; - private DefaultPlexusContainer container; - - private EventSpyDispatcher eventSpyDispatcher; - - private ModelProcessor modelProcessor; - - private Maven maven; - - private MavenExecutionRequestPopulator executionRequestPopulator; - - private ToolchainsBuilder toolchainsBuilder; - - private DefaultSecDispatcher dispatcher; - - private Map configurationProcessors; - public DaemonMavenCli() throws Exception { slf4jLoggerFactory = LoggerFactory.getILoggerFactory(); slf4jLogger = slf4jLoggerFactory.getLogger( this.getClass().getName() ); - plexusLoggerManager = new Slf4jLoggerManager(); ClassLoader cl = Thread.currentThread().getContextClassLoader(); classWorld = new ClassWorld("plexus.core", cl); - container(); } // TODO need to externalize CliRequest public int doMain(CliRequest cliRequest) throws Exception { Properties props = (Properties) System.getProperties().clone(); - try { - initialize(cliRequest); - cli(cliRequest); - properties(cliRequest); - logging(cliRequest); - configure(cliRequest); - version( cliRequest ); - toolchains(cliRequest); - populateRequest( cliRequest ); - encryption( cliRequest ); - repository( cliRequest ); - return execute( cliRequest); + try (DaemonExecution de = new DaemonExecution(classWorld, slf4jLoggerFactory, slf4jLogger, cliRequest.getMultiModuleProjectDirectory().toPath())) { + de.initialize(cliRequest); + de.cli(cliRequest); + de.properties(cliRequest); + de.logging(cliRequest); + de.configure(cliRequest); + de.version( cliRequest ); + de.toolchains(cliRequest); + de.populateRequest( cliRequest ); + de.encryption( cliRequest ); + de.repository( cliRequest ); + return de.execute( cliRequest); } catch ( ExitException e ) { @@ -181,1156 +166,1194 @@ public int doMain(CliRequest cliRequest) throws Exception finally { System.setProperties(props); - eventSpyDispatcher.close(); } } - void initialize( CliRequest cliRequest ) - throws ExitException + + + // ---------------------------------------------------------------------- + // System properties handling + // ---------------------------------------------------------------------- + + static class ExitException + extends Exception { - cliRequest.classWorld = classWorld; + static final long serialVersionUID = 1L; + int exitCode; - if ( cliRequest.workingDirectory == null ) + ExitException( int exitCode ) { - cliRequest.workingDirectory = System.getProperty( "user.dir" ); + this.exitCode = exitCode; } + } - if ( cliRequest.multiModuleProjectDirectory == null ) - { - System.err.format( - "-D%s system property is not set.", MULTIMODULE_PROJECT_DIRECTORY ); - throw new ExitException( 1 ); - } - System.setProperty( "maven.multiModuleProjectDirectory", cliRequest.multiModuleProjectDirectory.toString() ); + /** + * Contains objects disposable per mvnd execution and their dependents. + */ + static class DaemonExecution implements AutoCloseable { + private static final Pattern LAST_ANSI_SEQUENCE = Pattern.compile( "(\u001B\\[[;\\d]*[ -/]*[@-~])[^\u001B]*$" ); + private static final String ANSI_RESET = "\u001B\u005Bm"; + private final ClassWorld classWorld; + private final DefaultPlexusContainer container; + private final EventSpyDispatcher eventSpyDispatcher; + private final Maven maven; + private final LoggerManager plexusLoggerManager; + private final MavenExecutionRequestPopulator executionRequestPopulator; + private final ToolchainsBuilder toolchainsBuilder; + private final DefaultSecDispatcher dispatcher; + private final ModelProcessor modelProcessor; + private final Map configurationProcessors; + private final Logger slf4jLogger; + private final Path baseDir; + public DaemonExecution(ClassWorld classWorld, ILoggerFactory slf4jLoggerFactory, Logger slf4jLogger, Path baseDir) throws PlexusContainerException, ComponentLookupException { + this.classWorld = classWorld; + this.plexusLoggerManager = new Slf4jLoggerManager(); + this.baseDir = baseDir; + this.slf4jLogger = slf4jLogger; + ClassRealm coreRealm = classWorld.getClassRealm( "plexus.core" ); + if ( coreRealm == null ) + { + coreRealm = classWorld.getRealms().iterator().next(); + } - // - // Make sure the Maven home directory is an absolute path to save us from confusion with say drive-relative - // Windows paths. - // - String mavenHome = System.getProperty( "maven.home" ); +// List extClassPath = parseExtClasspath( cliRequest ); - if ( mavenHome != null ) - { - System.setProperty( "maven.home", new File( mavenHome ).getAbsolutePath() ); - } - } + CoreExtensionEntry coreEntry = CoreExtensionEntry.discoverFrom( coreRealm ); + List extensions = Collections.emptyList(); +// loadCoreExtensions( cliRequest, coreRealm, coreEntry.getExportedArtifacts() ); - void cli( CliRequest cliRequest ) - throws Exception - { - CLIManager cliManager = new CLIManager(); + ClassRealm containerRealm = coreRealm; - List args = new ArrayList<>(); - CommandLine mavenConfig = null; - try - { - File configFile = new File( cliRequest.multiModuleProjectDirectory, MVN_MAVEN_CONFIG ); + ContainerConfiguration cc = new DefaultContainerConfiguration().setClassWorld( classWorld ) + .setRealm( containerRealm ).setClassPathScanning( PlexusConstants.SCANNING_INDEX ).setAutoWiring( true ) + .setJSR250Lifecycle( true ).setName( "maven" ); + + Set exportedArtifacts = new HashSet<>( coreEntry.getExportedArtifacts() ); + Set exportedPackages = new HashSet<>( coreEntry.getExportedPackages() ); +// for ( CoreExtensionEntry extension : extensions ) +// { +// exportedArtifacts.addAll( extension.getExportedArtifacts() ); +// exportedPackages.addAll( extension.getExportedPackages() ); +// } - if ( configFile.isFile() ) + final CoreExports exports = new CoreExports( containerRealm, exportedArtifacts, exportedPackages ); + + container = new DefaultPlexusContainer( cc, new AbstractModule() { - for ( String arg : new String( Files.readAllBytes( configFile.toPath() ) ).split( "\\s+" ) ) + @Override + protected void configure() { - if ( !arg.isEmpty() ) - { - args.add( arg ); - } + bind( ILoggerFactory.class ).toInstance( slf4jLoggerFactory ); + bind( CoreExports.class ).toInstance( exports ); } + } ); - mavenConfig = cliManager.parse( args.toArray( new String[0] ) ); - List unrecongized = mavenConfig.getArgList(); - if ( !unrecongized.isEmpty() ) - { - throw new ParseException( "Unrecognized maven.config entries: " + unrecongized ); - } - } - } - catch ( ParseException e ) - { - System.err.println( "Unable to parse maven.config: " + e.getMessage() ); - cliManager.displayHelp( System.out ); - throw e; - } + // NOTE: To avoid inconsistencies, we'll use the TCCL exclusively for lookups + container.setLookupRealm( null ); + Thread.currentThread().setContextClassLoader( container.getContainerRealm() ); - try - { - if ( mavenConfig == null ) - { - cliRequest.commandLine = cliManager.parse( cliRequest.args ); - } - else + container.setLoggerManager( plexusLoggerManager ); + + for ( CoreExtensionEntry extension : extensions ) { - cliRequest.commandLine = cliMerge( cliManager.parse( cliRequest.args ), mavenConfig ); + container.discoverComponents( extension.getClassRealm(), new SessionScopeModule( container ), + new MojoExecutionScopeModule( container ) ); } - } - catch ( ParseException e ) - { - System.err.println( "Unable to parse command line options: " + e.getMessage() ); - cliManager.displayHelp( System.out ); - throw e; - } - if ( cliRequest.commandLine.hasOption( CLIManager.HELP ) ) - { - cliManager.displayHelp( System.out ); - throw new ExitException( 0 ); - } +// container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); - } + eventSpyDispatcher = container.lookup( EventSpyDispatcher.class ); - private CommandLine cliMerge( CommandLine mavenArgs, CommandLine mavenConfig ) - { - CommandLine.Builder commandLineBuilder = new CommandLine.Builder(); + maven = container.lookup( Maven.class ); - // the args are easy, cli first then config file - for ( String arg : mavenArgs.getArgs() ) - { - commandLineBuilder.addArg( arg ); - } - for ( String arg : mavenConfig.getArgs() ) - { - commandLineBuilder.addArg( arg ); - } + executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class ); - // now add all options, except for -D with cli first then config file - List