From 8456294977b40660ce37db853de344f0d26ee46d Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 7 Jan 2022 09:51:21 +0100 Subject: [PATCH] [MNG-6326] Make the build fail if core extensions can not be loaded (#648) --- .../java/org/apache/maven/cli/MavenCli.java | 86 ++++++++----------- .../BootstrapCoreExtensionManager.java | 37 +++++--- .../ExtensionResolutionException.java | 47 ++++++++++ .../src/main/mdo/core-extensions.mdo | 26 ++++++ 4 files changed, 134 insertions(+), 62 deletions(-) create mode 100644 maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index fbcb05f9137..ed695ebbf20 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -705,6 +705,7 @@ protected void configure() private List loadCoreExtensions( CliRequest cliRequest, ClassRealm containerRealm, Set providedArtifacts ) + throws Exception { if ( cliRequest.multiModuleProjectDirectory == null ) { @@ -717,75 +718,62 @@ private List loadCoreExtensions( CliRequest cliRequest, Clas return Collections.emptyList(); } - try + List extensions = readCoreExtensionsDescriptor( extensionsFile ); + if ( extensions.isEmpty() ) { - List extensions = readCoreExtensionsDescriptor( extensionsFile ); - if ( extensions.isEmpty() ) - { - return Collections.emptyList(); - } + return Collections.emptyList(); + } - ContainerConfiguration cc = new DefaultContainerConfiguration() // - .setClassWorld( cliRequest.classWorld ) // - .setRealm( containerRealm ) // - .setClassPathScanning( PlexusConstants.SCANNING_INDEX ) // - .setAutoWiring( true ) // - .setJSR250Lifecycle( true ) // - .setName( "maven" ); + ContainerConfiguration cc = new DefaultContainerConfiguration() // + .setClassWorld( cliRequest.classWorld ) // + .setRealm( containerRealm ) // + .setClassPathScanning( PlexusConstants.SCANNING_INDEX ) // + .setAutoWiring( true ) // + .setJSR250Lifecycle( true ) // + .setName( "maven" ); - DefaultPlexusContainer container = new DefaultPlexusContainer( cc, new AbstractModule() + DefaultPlexusContainer container = new DefaultPlexusContainer( cc, new AbstractModule() + { + @Override + protected void configure() { - @Override - protected void configure() - { - bind( ILoggerFactory.class ).toInstance( slf4jLoggerFactory ); - } - } ); + bind( ILoggerFactory.class ).toInstance( slf4jLoggerFactory ); + } + } ); - try - { - container.setLookupRealm( null ); + try + { + container.setLookupRealm( null ); - container.setLoggerManager( plexusLoggerManager ); + container.setLoggerManager( plexusLoggerManager ); - container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); + container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); - Thread.currentThread().setContextClassLoader( container.getContainerRealm() ); + Thread.currentThread().setContextClassLoader( container.getContainerRealm() ); - executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class ); + executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class ); - configurationProcessors = container.lookupMap( ConfigurationProcessor.class ); + configurationProcessors = container.lookupMap( ConfigurationProcessor.class ); - configure( cliRequest ); + configure( cliRequest ); - MavenExecutionRequest request = DefaultMavenExecutionRequest.copy( cliRequest.request ); + MavenExecutionRequest request = DefaultMavenExecutionRequest.copy( cliRequest.request ); - request = populateRequest( cliRequest, request ); + request = populateRequest( cliRequest, request ); - request = executionRequestPopulator.populateDefaults( request ); + request = executionRequestPopulator.populateDefaults( request ); - BootstrapCoreExtensionManager resolver = container.lookup( BootstrapCoreExtensionManager.class ); + BootstrapCoreExtensionManager resolver = container.lookup( BootstrapCoreExtensionManager.class ); - return Collections.unmodifiableList( resolver.loadCoreExtensions( request, providedArtifacts, - extensions ) ); + return Collections.unmodifiableList( resolver.loadCoreExtensions( request, providedArtifacts, + extensions ) ); - } - finally - { - executionRequestPopulator = null; - container.dispose(); - } - } - catch ( RuntimeException e ) - { - // runtime exceptions are most likely bugs in maven, let them bubble up to the user - throw e; } - catch ( Exception e ) + finally { - slf4jLogger.warn( "Failed to read extensions descriptor {}: {}", extensionsFile, e.getMessage() ); + executionRequestPopulator = null; + container.dispose(); } - return Collections.emptyList(); } private List readCoreExtensionsDescriptor( File extensionsFile ) diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java index 9fada05db83..a47326977d0 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java @@ -128,19 +128,30 @@ private CoreExtensionEntry createExtension( CoreExtension extension, List resolveExtension( CoreExtension extension, RepositorySystemSession repoSession, List repositories, DependencyFilter dependencyFilter ) - throws PluginResolutionException + throws ExtensionResolutionException { - Plugin plugin = new Plugin(); - plugin.setGroupId( extension.getGroupId() ); - plugin.setArtifactId( extension.getArtifactId() ); - plugin.setVersion( extension.getVersion() ); - - DependencyNode root = - pluginDependenciesResolver.resolveCoreExtension( plugin, dependencyFilter, repositories, repoSession ); - PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); - root.accept( nlg ); - List artifacts = nlg.getArtifacts( false ); - - return artifacts; + try + { + // TODO: enhance the PluginDependenciesResolver to provide a + // TODO: resolveCoreExtension method which uses a CoreExtension + // TODO: object instead of a Plugin as this makes no sense + Plugin plugin = new Plugin(); + plugin.setGroupId( extension.getGroupId() ); + plugin.setArtifactId( extension.getArtifactId() ); + plugin.setVersion( extension.getVersion() ); + + DependencyNode root = pluginDependenciesResolver + .resolveCoreExtension( plugin, dependencyFilter, repositories, repoSession ); + PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); + root.accept( nlg ); + List artifacts = nlg.getArtifacts( false ); + + return artifacts; + } + catch ( PluginResolutionException e ) + { + throw new ExtensionResolutionException( extension, e.getCause() ); + } } + } diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java new file mode 100644 index 00000000000..4f8cff9cb34 --- /dev/null +++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java @@ -0,0 +1,47 @@ +package org.apache.maven.cli.internal; + +/* + * 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. + */ + +import org.apache.maven.cli.internal.extension.model.CoreExtension; + +/** + * Exception occurring trying to resolve a plugin. + * + * @author Brett Porter + */ +public class ExtensionResolutionException + extends Exception +{ + + private final CoreExtension extension; + + public ExtensionResolutionException( CoreExtension extension, Throwable cause ) + { + super( "Extension " + extension.getId() + " or one of its dependencies could not be resolved: " + + cause.getMessage(), cause ); + this.extension = extension; + } + + public CoreExtension getExtension() + { + return extension; + } + +} diff --git a/maven-embedder/src/main/mdo/core-extensions.mdo b/maven-embedder/src/main/mdo/core-extensions.mdo index e523d5abf32..8a74aabb585 100644 --- a/maven-embedder/src/main/mdo/core-extensions.mdo +++ b/maven-embedder/src/main/mdo/core-extensions.mdo @@ -83,6 +83,32 @@ String + + + 1.0.0+ + + ::}, never {@code null}. + */ + public String getId() + { + StringBuilder id = new StringBuilder( 128 ); + + id.append( ( getGroupId() == null ) ? "[unknown-group-id]" : getGroupId() ); + id.append( ":" ); + id.append( ( getArtifactId() == null ) ? "[unknown-artifact-id]" : getArtifactId() ); + id.append( ":" ); + id.append( ( getVersion() == null ) ? "[unknown-version]" : getVersion() ); + + return id.toString(); + } + ]]> + + +