1515package org .eclipse .m2e .core .internal .embedder ;
1616
1717import java .io .File ;
18- import java .io .FileInputStream ;
19- import java .io .InputStream ;
2018import java .net .MalformedURLException ;
2119import java .util .Collection ;
22- import java .util .Collections ;
2320import java .util .HashMap ;
2421import java .util .HashSet ;
2522import java .util .List ;
5653import org .codehaus .plexus .component .repository .exception .ComponentLookupException ;
5754import org .codehaus .plexus .logging .LoggerManager ;
5855
59- import org .apache .maven .cli .internal .BootstrapCoreExtensionManager ;
6056import org .apache .maven .cli .internal .ExtensionResolutionException ;
61- import org .apache .maven .cli .internal .extension .model .CoreExtension ;
62- import org .apache .maven .cli .internal .extension .model .io .xpp3 .CoreExtensionsXpp3Reader ;
6357import org .apache .maven .execution .MavenExecutionRequest ;
6458import org .apache .maven .execution .MavenExecutionRequestPopulator ;
65- import org .apache .maven .execution .scope .internal .MojoExecutionScopeModule ;
6659import org .apache .maven .extension .internal .CoreExports ;
6760import org .apache .maven .extension .internal .CoreExtensionEntry ;
68- import org .apache .maven .session .scope .internal .SessionScopeModule ;
6961
7062import org .eclipse .m2e .core .embedder .IComponentLookup ;
7163import org .eclipse .m2e .core .embedder .IMavenConfiguration ;
7264import org .eclipse .m2e .core .internal .Messages ;
7365import org .eclipse .m2e .internal .maven .compat .ExtensionResolutionExceptionFacade ;
66+ import org .eclipse .m2e .internal .maven .compat .PlexusContainerFacade ;
7467
7568
7669/**
8275public class PlexusContainerManager {
8376 private static final ILog LOG = Platform .getLog (PlexusContainerManager .class );
8477
85- private static final String CONTAINER_CONFIGURATION_NAME = "maven" ;
86-
8778 private static final String MAVEN_EXTENSION_REALM_PREFIX = "maven.ext." ;
8879
8980 private static final String PLEXUS_CORE_REALM = "plexus.core" ;
@@ -180,8 +171,7 @@ public IMavenPlexusContainer aquire(File basedir) throws Exception {
180171 containerMap .put (canonicalDirectory , plexusContainer );
181172 } catch (ExtensionResolutionException e ) {
182173 //TODO how can we create an error marker on the extension file?
183- File file = new File (directory , IMavenPlexusContainer .EXTENSIONS_FILENAME );
184- new ExtensionResolutionExceptionFacade (e ).throwForFile (file );
174+ ExtensionResolutionExceptionFacade .throwForFile (e , new File (directory , IMavenPlexusContainer .EXTENSIONS_FILENAME ));
185175 }
186176 }
187177 return plexusContainer ;
@@ -215,15 +205,27 @@ private static IMavenPlexusContainer newPlexusContainer(File multiModuleProjectD
215205 multiModuleProjectDirectory );
216206 ClassRealm coreRealm = classWorld .getRealm (PLEXUS_CORE_REALM );
217207 CoreExtensionEntry coreEntry = CoreExtensionEntry .discoverFrom (coreRealm );
218-
219- List <CoreExtensionEntry > extensions = loadCoreExtensions (coreRealm , coreEntry , multiModuleProjectDirectory ,
220- loggerManager , mavenConfiguration );
208+ List <CoreExtensionEntry > extensions = PlexusContainerFacade .loadCoreExtensions (coreRealm , coreEntry ,
209+ multiModuleProjectDirectory , loggerManager , container -> {
210+ Optional <MavenProperties > mavenProperties = MavenProperties .getMavenArgs (multiModuleProjectDirectory );
211+ IMavenConfiguration workspaceConfiguration = IMavenConfiguration .getWorkspaceConfiguration ();
212+ MavenExecutionRequest request = MavenExecutionContext .createExecutionRequest (mavenConfiguration ,
213+ wrap (container ), mavenProperties .map (mavenCfg -> mavenCfg .getSettingsLocations (workspaceConfiguration ))
214+ .orElseGet (workspaceConfiguration ::getSettingsLocations ),
215+ multiModuleProjectDirectory );
216+ container .lookup (MavenExecutionRequestPopulator .class ).populateDefaults (request );
217+ request .setBaseDirectory (multiModuleProjectDirectory );
218+ request .setMultiModuleProjectDirectory (multiModuleProjectDirectory );
219+ Properties userProperties = request .getUserProperties ();
220+ mavenProperties .ifPresent (prop -> prop .getCliProperties (userProperties ::setProperty ));
221+ return request ;
222+ });
221223 List <File > extClassPath = List .of (); //TODO should we allow to set an ext-class path for m2e?
222224 ClassRealm containerRealm = setupContainerRealm (coreRealm , extClassPath , extensions );
223225
224226 ContainerConfiguration cc = new DefaultContainerConfiguration ().setClassWorld (classWorld ).setRealm (containerRealm )
225227 .setClassPathScanning (PlexusConstants .SCANNING_INDEX ).setAutoWiring (true ).setJSR250Lifecycle (true )
226- .setName (CONTAINER_CONFIGURATION_NAME );
228+ .setName (PlexusContainerFacade . CONTAINER_CONFIGURATION_NAME );
227229
228230 Set <String > exportedArtifacts = new HashSet <>(coreEntry .getExportedArtifacts ());
229231 Set <String > exportedPackages = new HashSet <>(coreEntry .getExportedPackages ());
@@ -241,6 +243,7 @@ protected void configure() {
241243 bind (CoreExports .class ).toInstance (exports );
242244 }
243245 }, new ExtensionModule ());
246+ PlexusContainerFacade facade = new PlexusContainerFacade (container );
244247 classWorld .addListener (new LifecycleManagerDisposer (container ));
245248 container .setLookupRealm (null );
246249 Thread thread = Thread .currentThread ();
@@ -249,8 +252,7 @@ protected void configure() {
249252 thread .setContextClassLoader (container .getContainerRealm ());
250253 container .setLoggerManager (loggerManager );
251254 for (CoreExtensionEntry extension : extensions ) {
252- container .discoverComponents (extension .getClassRealm (), new SessionScopeModule (container ),
253- new MojoExecutionScopeModule (container ));
255+ facade .loadExtension (extension );
254256 }
255257 } finally {
256258 thread .setContextClassLoader (ccl );
@@ -304,60 +306,6 @@ private static ClassRealm setupContainerRealm(ClassRealm coreRealm, List<File> e
304306 return extRealm ;
305307 }
306308
307- private static List <CoreExtensionEntry > loadCoreExtensions (ClassRealm coreRealm , CoreExtensionEntry coreEntry ,
308- File multiModuleProjectDirectory , LoggerManager loggerManager , IMavenConfiguration mavenConfiguration )
309- throws Exception {
310- if (multiModuleProjectDirectory == null ) {
311- return Collections .emptyList ();
312- }
313- File extensionsXml = new File (multiModuleProjectDirectory , IMavenPlexusContainer .EXTENSIONS_FILENAME );
314- if (!extensionsXml .isFile ()) {
315- return Collections .emptyList ();
316- }
317- List <CoreExtension > extensions ;
318- try (InputStream is = new FileInputStream (extensionsXml )) {
319- extensions = new CoreExtensionsXpp3Reader ().read (is ).getExtensions ();
320- }
321- if (extensions .isEmpty ()) {
322- return Collections .emptyList ();
323- }
324-
325- ContainerConfiguration cc = new DefaultContainerConfiguration ().setClassWorld (coreRealm .getWorld ())
326- .setRealm (coreRealm ).setClassPathScanning (PlexusConstants .SCANNING_INDEX ).setAutoWiring (true )
327- .setJSR250Lifecycle (true ).setName (CONTAINER_CONFIGURATION_NAME );
328-
329- DefaultPlexusContainer container = new DefaultPlexusContainer (cc , new AbstractModule () {
330- @ Override
331- protected void configure () {
332- bind (ILoggerFactory .class ).toInstance (LoggerFactory .getILoggerFactory ());
333- }
334- });
335-
336- Thread thread = Thread .currentThread ();
337- ClassLoader ccl = thread .getContextClassLoader ();
338- try {
339- container .setLookupRealm (null );
340- container .setLoggerManager (loggerManager );
341- thread .setContextClassLoader (container .getContainerRealm ());
342- Optional <MavenProperties > mavenProperties = MavenProperties .getMavenArgs (multiModuleProjectDirectory );
343- IMavenConfiguration workspaceConfiguration = IMavenConfiguration .getWorkspaceConfiguration ();
344- MavenExecutionRequest request = MavenExecutionContext .createExecutionRequest (mavenConfiguration ,
345- wrap (container ), mavenProperties .map (mavenCfg -> mavenCfg .getSettingsLocations (workspaceConfiguration ))
346- .orElseGet (workspaceConfiguration ::getSettingsLocations ),
347- multiModuleProjectDirectory );
348- container .lookup (MavenExecutionRequestPopulator .class ).populateDefaults (request );
349- request .setBaseDirectory (multiModuleProjectDirectory );
350- request .setMultiModuleProjectDirectory (multiModuleProjectDirectory );
351- Properties userProperties = request .getUserProperties ();
352- mavenProperties .ifPresent (prop -> prop .getCliProperties (userProperties ::setProperty ));
353- BootstrapCoreExtensionManager resolver = container .lookup (BootstrapCoreExtensionManager .class );
354- return resolver .loadCoreExtensions (request , coreEntry .getExportedArtifacts (), extensions );
355- } finally {
356- thread .setContextClassLoader (ccl );
357- container .dispose ();
358- }
359- }
360-
361309 private static final class M2EClassWorld extends ClassWorld {
362310
363311 private File multiModuleProjectDirectory ;
0 commit comments