001package org.apache.maven.project; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.io.File; 023import java.io.IOException; 024import java.util.ArrayList; 025import java.util.Arrays; 026import java.util.Collections; 027import java.util.HashMap; 028import java.util.LinkedHashSet; 029import java.util.List; 030import java.util.Map; 031import java.util.Set; 032 033import org.apache.maven.RepositoryUtils; 034import org.apache.maven.artifact.Artifact; 035import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager; 036import org.apache.maven.model.Build; 037import org.apache.maven.model.Model; 038import org.apache.maven.model.Profile; 039import org.apache.maven.model.building.DefaultModelBuildingRequest; 040import org.apache.maven.model.building.DefaultModelProblem; 041import org.apache.maven.model.building.FileModelSource; 042import org.apache.maven.model.building.ModelBuilder; 043import org.apache.maven.model.building.ModelBuildingException; 044import org.apache.maven.model.building.ModelBuildingRequest; 045import org.apache.maven.model.building.ModelBuildingResult; 046import org.apache.maven.model.building.ModelProblem; 047import org.apache.maven.model.building.ModelProcessor; 048import org.apache.maven.model.building.ModelSource; 049import org.apache.maven.model.building.StringModelSource; 050import org.apache.maven.model.resolution.ModelResolver; 051import org.apache.maven.repository.RepositorySystem; 052import org.apache.maven.repository.internal.ArtifactDescriptorUtils; 053import org.codehaus.plexus.component.annotations.Component; 054import org.codehaus.plexus.component.annotations.Requirement; 055import org.codehaus.plexus.logging.Logger; 056import org.codehaus.plexus.util.Os; 057import org.codehaus.plexus.util.StringUtils; 058import org.eclipse.aether.RepositorySystemSession; 059import org.eclipse.aether.RequestTrace; 060import org.eclipse.aether.impl.RemoteRepositoryManager; 061import org.eclipse.aether.repository.LocalRepositoryManager; 062import org.eclipse.aether.repository.RemoteRepository; 063import org.eclipse.aether.repository.WorkspaceRepository; 064import org.eclipse.aether.resolution.ArtifactRequest; 065import org.eclipse.aether.resolution.ArtifactResult; 066import org.eclipse.aether.resolution.VersionRangeRequest; 067import org.eclipse.aether.resolution.VersionRangeResolutionException; 068import org.eclipse.aether.resolution.VersionRangeResult; 069 070/** 071 */ 072@Component( role = ProjectBuilder.class ) 073public class DefaultProjectBuilder 074 implements ProjectBuilder 075{ 076 077 @Requirement 078 private Logger logger; 079 080 @Requirement 081 private ModelBuilder modelBuilder; 082 083 @Requirement 084 private ModelProcessor modelProcessor; 085 086 @Requirement 087 private ProjectBuildingHelper projectBuildingHelper; 088 089 @Requirement 090 private RepositorySystem repositorySystem; 091 092 @Requirement 093 private org.eclipse.aether.RepositorySystem repoSystem; 094 095 @Requirement 096 private RemoteRepositoryManager repositoryManager; 097 098 @Requirement 099 private ProjectDependenciesResolver dependencyResolver; 100 101 // ---------------------------------------------------------------------- 102 // MavenProjectBuilder Implementation 103 // ---------------------------------------------------------------------- 104 105 public ProjectBuildingResult build( File pomFile, ProjectBuildingRequest request ) 106 throws ProjectBuildingException 107 { 108 return build( pomFile, new FileModelSource( pomFile ), new InternalConfig( request, null ) ); 109 } 110 111 public ProjectBuildingResult build( ModelSource modelSource, ProjectBuildingRequest request ) 112 throws ProjectBuildingException 113 { 114 return build( null, modelSource, new InternalConfig( request, null ) ); 115 } 116 117 private ProjectBuildingResult build( File pomFile, ModelSource modelSource, InternalConfig config ) 118 throws ProjectBuildingException 119 { 120 ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader(); 121 122 try 123 { 124 ProjectBuildingRequest configuration = config.request; 125 126 MavenProject project = configuration.getProject(); 127 128 List<ModelProblem> modelProblems = null; 129 Throwable error = null; 130 131 if ( project == null ) 132 { 133 ModelBuildingRequest request = getModelBuildingRequest( config ); 134 135 project = new MavenProject( repositorySystem, this, configuration, logger ); 136 137 DefaultModelBuildingListener listener = 138 new DefaultModelBuildingListener( project, projectBuildingHelper, configuration ); 139 request.setModelBuildingListener( listener ); 140 141 request.setPomFile( pomFile ); 142 request.setModelSource( modelSource ); 143 request.setLocationTracking( true ); 144 145 ModelBuildingResult result; 146 try 147 { 148 result = modelBuilder.build( request ); 149 } 150 catch ( ModelBuildingException e ) 151 { 152 result = e.getResult(); 153 if ( result == null || result.getEffectiveModel() == null ) 154 { 155 throw new ProjectBuildingException( e.getModelId(), e.getMessage(), pomFile, e ); 156 } 157 // validation error, continue project building and delay failing to help IDEs 158 error = e; 159 } 160 161 modelProblems = result.getProblems(); 162 163 initProject( project, Collections.<String, MavenProject> emptyMap(), result, 164 new HashMap<File, Boolean>() ); 165 } 166 else if ( configuration.isResolveDependencies() ) 167 { 168 projectBuildingHelper.selectProjectRealm( project ); 169 } 170 171 DependencyResolutionResult resolutionResult = null; 172 173 if ( configuration.isResolveDependencies() ) 174 { 175 resolutionResult = resolveDependencies( project, config.session ); 176 } 177 178 ProjectBuildingResult result = new DefaultProjectBuildingResult( project, modelProblems, resolutionResult ); 179 180 if ( error != null ) 181 { 182 ProjectBuildingException e = new ProjectBuildingException( Arrays.asList( result ) ); 183 e.initCause( error ); 184 throw e; 185 } 186 187 return result; 188 } 189 finally 190 { 191 Thread.currentThread().setContextClassLoader( oldContextClassLoader ); 192 } 193 } 194 195 private DependencyResolutionResult resolveDependencies( MavenProject project, RepositorySystemSession session ) 196 { 197 DependencyResolutionResult resolutionResult; 198 199 try 200 { 201 DefaultDependencyResolutionRequest resolution = new DefaultDependencyResolutionRequest( project, session ); 202 resolutionResult = dependencyResolver.resolve( resolution ); 203 } 204 catch ( DependencyResolutionException e ) 205 { 206 resolutionResult = e.getResult(); 207 } 208 209 Set<Artifact> artifacts = new LinkedHashSet<Artifact>(); 210 if ( resolutionResult.getDependencyGraph() != null ) 211 { 212 RepositoryUtils.toArtifacts( artifacts, resolutionResult.getDependencyGraph().getChildren(), 213 Collections.singletonList( project.getArtifact().getId() ), null ); 214 215 // Maven 2.x quirk: an artifact always points at the local repo, regardless whether resolved or not 216 LocalRepositoryManager lrm = session.getLocalRepositoryManager(); 217 for ( Artifact artifact : artifacts ) 218 { 219 if ( !artifact.isResolved() ) 220 { 221 String path = lrm.getPathForLocalArtifact( RepositoryUtils.toArtifact( artifact ) ); 222 artifact.setFile( new File( lrm.getRepository().getBasedir(), path ) ); 223 } 224 } 225 } 226 project.setResolvedArtifacts( artifacts ); 227 project.setArtifacts( artifacts ); 228 229 return resolutionResult; 230 } 231 232 private List<String> getProfileIds( List<Profile> profiles ) 233 { 234 List<String> ids = new ArrayList<String>( profiles.size() ); 235 236 for ( Profile profile : profiles ) 237 { 238 ids.add( profile.getId() ); 239 } 240 241 return ids; 242 } 243 244 private ModelBuildingRequest getModelBuildingRequest( InternalConfig config ) 245 { 246 ProjectBuildingRequest configuration = config.request; 247 248 ModelBuildingRequest request = new DefaultModelBuildingRequest(); 249 250 RequestTrace trace = RequestTrace.newChild( null, configuration ).newChild( request ); 251 252 ModelResolver resolver = 253 new ProjectModelResolver( config.session, trace, repoSystem, repositoryManager, config.repositories, 254 configuration.getRepositoryMerging(), config.modelPool ); 255 256 request.setValidationLevel( configuration.getValidationLevel() ); 257 request.setProcessPlugins( configuration.isProcessPlugins() ); 258 request.setProfiles( configuration.getProfiles() ); 259 request.setActiveProfileIds( configuration.getActiveProfileIds() ); 260 request.setInactiveProfileIds( configuration.getInactiveProfileIds() ); 261 request.setSystemProperties( configuration.getSystemProperties() ); 262 request.setUserProperties( configuration.getUserProperties() ); 263 request.setBuildStartTime( configuration.getBuildStartTime() ); 264 request.setModelResolver( resolver ); 265 request.setModelCache( new ReactorModelCache() ); 266 267 return request; 268 } 269 270 public ProjectBuildingResult build( Artifact artifact, ProjectBuildingRequest request ) 271 throws ProjectBuildingException 272 { 273 return build( artifact, false, request ); 274 } 275 276 public ProjectBuildingResult build( Artifact artifact, boolean allowStubModel, ProjectBuildingRequest request ) 277 throws ProjectBuildingException 278 { 279 org.eclipse.aether.artifact.Artifact pomArtifact = RepositoryUtils.toArtifact( artifact ); 280 pomArtifact = ArtifactDescriptorUtils.toPomArtifact( pomArtifact ); 281 282 InternalConfig config = new InternalConfig( request, null ); 283 284 boolean localProject; 285 286 if ( request.isResolveVersionRanges() ) 287 { 288 VersionRangeRequest versionRangeRequest = new VersionRangeRequest( pomArtifact, config.repositories, null ); 289 290 try 291 { 292 VersionRangeResult versionRangeResult = 293 repoSystem.resolveVersionRange( config.session, versionRangeRequest ); 294 295 if ( versionRangeResult.getHighestVersion() == null ) 296 { 297 throw new ProjectBuildingException( 298 artifact.getId(), "Error resolving project artifact: No versions matched the requested range", 299 (Throwable) null ); 300 301 } 302 303 if ( versionRangeResult.getVersionConstraint() != null 304 && versionRangeResult.getVersionConstraint().getRange() != null 305 && versionRangeResult.getVersionConstraint().getRange().getUpperBound() == null ) 306 { 307 throw new ProjectBuildingException( 308 artifact.getId(), 309 "Error resolving project artifact: The requested version range does not specify an upper bound", 310 (Throwable) null ); 311 312 } 313 314 pomArtifact = pomArtifact.setVersion( versionRangeResult.getHighestVersion().toString() ); 315 } 316 catch ( VersionRangeResolutionException e ) 317 { 318 throw new ProjectBuildingException( 319 artifact.getId(), "Error resolving project artifact: " + e.getMessage(), e ); 320 321 } 322 } 323 324 try 325 { 326 ArtifactRequest pomRequest = new ArtifactRequest(); 327 pomRequest.setArtifact( pomArtifact ); 328 pomRequest.setRepositories( config.repositories ); 329 ArtifactResult pomResult = repoSystem.resolveArtifact( config.session, pomRequest ); 330 331 pomArtifact = pomResult.getArtifact(); 332 localProject = pomResult.getRepository() instanceof WorkspaceRepository; 333 } 334 catch ( org.eclipse.aether.resolution.ArtifactResolutionException e ) 335 { 336 if ( e.getResults().get( 0 ).isMissing() && allowStubModel ) 337 { 338 return build( null, createStubModelSource( artifact ), config ); 339 } 340 throw new ProjectBuildingException( artifact.getId(), 341 "Error resolving project artifact: " + e.getMessage(), e ); 342 } 343 344 File pomFile = pomArtifact.getFile(); 345 346 if ( "pom".equals( artifact.getType() ) ) 347 { 348 artifact.selectVersion( pomArtifact.getVersion() ); 349 artifact.setFile( pomFile ); 350 artifact.setResolved( true ); 351 } 352 353 return build( localProject ? pomFile : null, new FileModelSource( pomFile ), config ); 354 } 355 356 private ModelSource createStubModelSource( Artifact artifact ) 357 { 358 StringBuilder buffer = new StringBuilder( 1024 ); 359 360 buffer.append( "<?xml version='1.0'?>" ); 361 buffer.append( "<project>" ); 362 buffer.append( "<modelVersion>4.0.0</modelVersion>" ); 363 buffer.append( "<groupId>" ).append( artifact.getGroupId() ).append( "</groupId>" ); 364 buffer.append( "<artifactId>" ).append( artifact.getArtifactId() ).append( "</artifactId>" ); 365 buffer.append( "<version>" ).append( artifact.getBaseVersion() ).append( "</version>" ); 366 buffer.append( "<packaging>" ).append( artifact.getType() ).append( "</packaging>" ); 367 buffer.append( "</project>" ); 368 369 return new StringModelSource( buffer, artifact.getId() ); 370 } 371 372 public List<ProjectBuildingResult> build( List<File> pomFiles, boolean recursive, ProjectBuildingRequest request ) 373 throws ProjectBuildingException 374 { 375 List<ProjectBuildingResult> results = new ArrayList<ProjectBuildingResult>(); 376 377 List<InterimResult> interimResults = new ArrayList<InterimResult>(); 378 379 ReactorModelPool modelPool = new ReactorModelPool(); 380 381 InternalConfig config = new InternalConfig( request, modelPool ); 382 383 Map<String, MavenProject> projectIndex = new HashMap<String, MavenProject>( 256 ); 384 385 boolean noErrors = 386 build( results, interimResults, projectIndex, pomFiles, new LinkedHashSet<File>(), true, recursive, config ); 387 388 populateReactorModelPool( modelPool, interimResults ); 389 390 ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader(); 391 392 try 393 { 394 noErrors = 395 build( results, new ArrayList<MavenProject>(), projectIndex, interimResults, request, 396 new HashMap<File, Boolean>() ) && noErrors; 397 } 398 finally 399 { 400 Thread.currentThread().setContextClassLoader( oldContextClassLoader ); 401 } 402 403 if ( !noErrors ) 404 { 405 throw new ProjectBuildingException( results ); 406 } 407 408 return results; 409 } 410 411 private boolean build( List<ProjectBuildingResult> results, List<InterimResult> interimResults, 412 Map<String, MavenProject> projectIndex, List<File> pomFiles, Set<File> aggregatorFiles, 413 boolean isRoot, boolean recursive, InternalConfig config ) 414 { 415 boolean noErrors = true; 416 417 for ( File pomFile : pomFiles ) 418 { 419 aggregatorFiles.add( pomFile ); 420 421 if ( !build( results, interimResults, projectIndex, pomFile, aggregatorFiles, isRoot, recursive, config ) ) 422 { 423 noErrors = false; 424 } 425 426 aggregatorFiles.remove( pomFile ); 427 } 428 429 return noErrors; 430 } 431 432 private boolean build( List<ProjectBuildingResult> results, List<InterimResult> interimResults, 433 Map<String, MavenProject> projectIndex, File pomFile, Set<File> aggregatorFiles, 434 boolean isRoot, boolean recursive, InternalConfig config ) 435 { 436 boolean noErrors = true; 437 438 ModelBuildingRequest request = getModelBuildingRequest( config ); 439 440 MavenProject project = new MavenProject( repositorySystem, this, config.request, logger ); 441 442 request.setPomFile( pomFile ); 443 request.setTwoPhaseBuilding( true ); 444 request.setLocationTracking( true ); 445 446 DefaultModelBuildingListener listener = 447 new DefaultModelBuildingListener( project, projectBuildingHelper, config.request ); 448 request.setModelBuildingListener( listener ); 449 450 try 451 { 452 ModelBuildingResult result = modelBuilder.build( request ); 453 454 Model model = result.getEffectiveModel(); 455 456 projectIndex.put( result.getModelIds().get( 0 ), project ); 457 458 InterimResult interimResult = new InterimResult( pomFile, request, result, listener, isRoot ); 459 interimResults.add( interimResult ); 460 461 if ( recursive && !model.getModules().isEmpty() ) 462 { 463 File basedir = pomFile.getParentFile(); 464 465 List<File> moduleFiles = new ArrayList<File>(); 466 467 for ( String module : model.getModules() ) 468 { 469 if ( StringUtils.isEmpty( module ) ) 470 { 471 continue; 472 } 473 474 module = module.replace( '\\', File.separatorChar ).replace( '/', File.separatorChar ); 475 476 File moduleFile = new File( basedir, module ); 477 478 if ( moduleFile.isDirectory() ) 479 { 480 moduleFile = modelProcessor.locatePom( moduleFile ); 481 } 482 483 if ( !moduleFile.isFile() ) 484 { 485 ModelProblem problem = 486 new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile 487 + " does not exist", ModelProblem.Severity.ERROR, ModelProblem.Version.BASE, model, -1, -1, null ); 488 result.getProblems().add( problem ); 489 490 noErrors = false; 491 492 continue; 493 } 494 495 if ( Os.isFamily( Os.FAMILY_WINDOWS ) ) 496 { 497 // we don't canonicalize on unix to avoid interfering with symlinks 498 try 499 { 500 moduleFile = moduleFile.getCanonicalFile(); 501 } 502 catch ( IOException e ) 503 { 504 moduleFile = moduleFile.getAbsoluteFile(); 505 } 506 } 507 else 508 { 509 moduleFile = new File( moduleFile.toURI().normalize() ); 510 } 511 512 if ( aggregatorFiles.contains( moduleFile ) ) 513 { 514 StringBuilder buffer = new StringBuilder( 256 ); 515 for ( File aggregatorFile : aggregatorFiles ) 516 { 517 buffer.append( aggregatorFile ).append( " -> " ); 518 } 519 buffer.append( moduleFile ); 520 521 ModelProblem problem = 522 new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile 523 + " forms aggregation cycle " + buffer, ModelProblem.Severity.ERROR, ModelProblem.Version.BASE, model, -1, -1, 524 null ); 525 result.getProblems().add( problem ); 526 527 noErrors = false; 528 529 continue; 530 } 531 532 moduleFiles.add( moduleFile ); 533 } 534 535 interimResult.modules = new ArrayList<InterimResult>(); 536 537 if ( !build( results, interimResult.modules, projectIndex, moduleFiles, aggregatorFiles, false, 538 recursive, config ) ) 539 { 540 noErrors = false; 541 } 542 } 543 } 544 catch ( ModelBuildingException e ) 545 { 546 results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) ); 547 548 noErrors = false; 549 } 550 551 return noErrors; 552 } 553 554 static class InterimResult 555 { 556 557 File pomFile; 558 559 ModelBuildingRequest request; 560 561 ModelBuildingResult result; 562 563 DefaultModelBuildingListener listener; 564 565 boolean root; 566 567 List<InterimResult> modules = Collections.emptyList(); 568 569 InterimResult( File pomFile, ModelBuildingRequest request, ModelBuildingResult result, 570 DefaultModelBuildingListener listener, boolean root ) 571 { 572 this.pomFile = pomFile; 573 this.request = request; 574 this.result = result; 575 this.listener = listener; 576 this.root = root; 577 } 578 579 } 580 581 private void populateReactorModelPool( ReactorModelPool reactorModelPool, List<InterimResult> interimResults ) 582 { 583 for ( InterimResult interimResult : interimResults ) 584 { 585 Model model = interimResult.result.getEffectiveModel(); 586 reactorModelPool.put( model.getGroupId(), model.getArtifactId(), model.getVersion(), model.getPomFile() ); 587 588 populateReactorModelPool( reactorModelPool, interimResult.modules ); 589 } 590 } 591 592 private boolean build( List<ProjectBuildingResult> results, List<MavenProject> projects, 593 Map<String, MavenProject> projectIndex, List<InterimResult> interimResults, 594 ProjectBuildingRequest request, Map<File, Boolean> profilesXmls ) 595 { 596 boolean noErrors = true; 597 598 for ( InterimResult interimResult : interimResults ) 599 { 600 try 601 { 602 ModelBuildingResult result = modelBuilder.build( interimResult.request, interimResult.result ); 603 604 MavenProject project = interimResult.listener.getProject(); 605 initProject( project, projectIndex, result, profilesXmls ); 606 607 List<MavenProject> modules = new ArrayList<MavenProject>(); 608 noErrors = 609 build( results, modules, projectIndex, interimResult.modules, request, profilesXmls ) && noErrors; 610 611 projects.addAll( modules ); 612 projects.add( project ); 613 614 project.setExecutionRoot( interimResult.root ); 615 project.setCollectedProjects( modules ); 616 617 results.add( new DefaultProjectBuildingResult( project, result.getProblems(), null ) ); 618 } 619 catch ( ModelBuildingException e ) 620 { 621 results.add( new DefaultProjectBuildingResult( e.getModelId(), interimResult.pomFile, e.getProblems() ) ); 622 623 noErrors = false; 624 } 625 } 626 627 return noErrors; 628 } 629 630 private void initProject( MavenProject project, Map<String, MavenProject> projects, ModelBuildingResult result, 631 Map<File, Boolean> profilesXmls ) 632 { 633 Model model = result.getEffectiveModel(); 634 635 project.setModel( model ); 636 project.setOriginalModel( result.getRawModel() ); 637 638 project.setFile( model.getPomFile() ); 639 640 File parentPomFile = result.getRawModel( result.getModelIds().get( 1 ) ).getPomFile(); 641 project.setParentFile( parentPomFile ); 642 643 project.setParent( projects.get( result.getModelIds().get( 1 ) ) ); 644 645 Artifact projectArtifact = 646 repositorySystem.createArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), null, 647 project.getPackaging() ); 648 project.setArtifact( projectArtifact ); 649 650 if ( project.getFile() != null ) 651 { 652 Build build = project.getBuild(); 653 project.addScriptSourceRoot( build.getScriptSourceDirectory() ); 654 project.addCompileSourceRoot( build.getSourceDirectory() ); 655 project.addTestCompileSourceRoot( build.getTestSourceDirectory() ); 656 } 657 658 List<Profile> activeProfiles = new ArrayList<Profile>(); 659 activeProfiles.addAll( result.getActivePomProfiles( result.getModelIds().get( 0 ) ) ); 660 activeProfiles.addAll( result.getActiveExternalProfiles() ); 661 project.setActiveProfiles( activeProfiles ); 662 663 project.setInjectedProfileIds( "external", getProfileIds( result.getActiveExternalProfiles() ) ); 664 for ( String modelId : result.getModelIds() ) 665 { 666 project.setInjectedProfileIds( modelId, getProfileIds( result.getActivePomProfiles( modelId ) ) ); 667 } 668 669 String modelId = findProfilesXml( result, profilesXmls ); 670 if ( modelId != null ) 671 { 672 ModelProblem problem = 673 new DefaultModelProblem( "Detected profiles.xml alongside " + modelId 674 + ", this file is no longer supported and was ignored" + ", please use the settings.xml instead", 675 ModelProblem.Severity.WARNING, ModelProblem.Version.V30, model, -1, -1, null ); 676 result.getProblems().add( problem ); 677 } 678 } 679 680 private String findProfilesXml( ModelBuildingResult result, Map<File, Boolean> profilesXmls ) 681 { 682 for ( String modelId : result.getModelIds() ) 683 { 684 Model model = result.getRawModel( modelId ); 685 686 File basedir = model.getProjectDirectory(); 687 if ( basedir == null ) 688 { 689 break; 690 } 691 692 Boolean profilesXml = profilesXmls.get( basedir ); 693 if ( profilesXml == null ) 694 { 695 profilesXml = new File( basedir, "profiles.xml" ).exists(); 696 profilesXmls.put( basedir, profilesXml ); 697 } 698 if ( profilesXml ) 699 { 700 return modelId; 701 } 702 } 703 704 return null; 705 } 706 707 class InternalConfig 708 { 709 710 public final ProjectBuildingRequest request; 711 712 public final RepositorySystemSession session; 713 714 public final List<RemoteRepository> repositories; 715 716 public final ReactorModelPool modelPool; 717 718 InternalConfig( ProjectBuildingRequest request, ReactorModelPool modelPool ) 719 { 720 this.request = request; 721 this.modelPool = modelPool; 722 session = 723 LegacyLocalRepositoryManager.overlay( request.getLocalRepository(), request.getRepositorySession(), 724 repoSystem ); 725 repositories = RepositoryUtils.toRepos( request.getRemoteRepositories() ); 726 } 727 728 } 729 730}