You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2019/01/14 13:02:46 UTC

[maven] branch MNG-6533-2 updated (4151f33 -> 27332cf)

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

hboutemy pushed a change to branch MNG-6533-2
in repository https://gitbox.apache.org/repos/asf/maven.git.


 discard 4151f33  [MNG-6533] ProjectBuilder report ModelProblem instead of Exception
 discard e4c2d90  [MNG-6533] Prefer passing the interim project in ProjectBuildingResult
 discard 23cedf6  [MNG-6533] Test: ProjectBuildingException miss reference to MavenProject
 discard dc8b7bb  refactoring: reduced try/catch scope
 discard ea979aa  refactoring: extracted initParent() method
     add 71128cb  spelling: vertices
     add 9c94626  [MNG-6213] Validate scope in dependencyManagement
     add 391a111  [MNG-6526] Upgrade to Wagon 3.3.1
     add eab62f1  [MNG-6520] Update namespaces for maven-assembly to 2.0.0
     add 33e4f20  [MNG-6548] Lifecycle plugin version upgrades
     add d9facde  [MNG-6530] Introduce system property to disable global model cache
     add a939654  [MNG-6256] Surround parameter of echo command with double quotes
     add 8e5ecf0  fixed link (that goes to implementation in maven-core)
     add 375cd7b  [MNG-6559] Fix mailing list URL (#230)
     add fdf5d92  renamed variables for better understanding
     add 396291b  [MNG-6069] Migrate to non deprecated parts of Commons CLI (#153)
     new 2928dc6  refactoring: extracted initParent() method
     new 049b7a7  refactoring: reduced try/catch scope
     new ae1c32a  [MNG-6533] Test: ProjectBuildingException miss reference to MavenProject
     new 8b7055f  [MNG-6533] Prefer passing the interim project in ProjectBuildingResult
     new 27332cf  [MNG-6533] ProjectBuilder report ModelProblem instead of Exception

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (4151f33)
            \
             N -- N -- N   refs/heads/MNG-6533-2 (27332cf)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 5 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.


Summary of changes:
 CONTRIBUTING.md                                    |   4 +-
 apache-maven/README.txt                            |   2 +-
 apache-maven/src/bin/mvn.cmd                       |   4 +-
 apache-maven/src/main/assembly/bin.xml             |   4 +-
 apache-maven/src/main/assembly/component.xml       |   4 +-
 apache-maven/src/main/assembly/dir.xml             |   4 +-
 apache-maven/src/main/assembly/src.xml             |   4 +-
 .../plugin/DefaultLifecycleBindingsInjector.java   |  14 +--
 .../maven/project/DefaultProjectBuilder.java       |  23 +++-
 .../org/apache/maven/project/ProjectSorter.java    |   2 +-
 .../main/resources/META-INF/plexus/components.xml  |   6 +-
 .../apache/maven/project/ProjectBuilderTest.java   |  42 +++++++
 .../main/java/org/apache/maven/cli/CLIManager.java | 124 ++++++++++++++-------
 .../main/java/org/apache/maven/cli/MavenCli.java   |  50 ++-------
 .../java/org/apache/maven/cli/MavenCliTest.java    |   4 +-
 .../model/validation/DefaultModelValidator.java    |  10 +-
 maven-model-builder/src/site/apt/index.apt         |   4 +-
 .../validation/DefaultModelValidatorTest.java      |  10 ++
 ...ier.xml => bad-dependency-management-scope.xml} |  38 ++++++-
 pom.xml                                            |  12 +-
 20 files changed, 238 insertions(+), 127 deletions(-)
 copy maven-model-builder/src/test/resources/poms/validation/{bad-import-scope-classifier.xml => bad-dependency-management-scope.xml} (53%)


[maven] 02/05: refactoring: reduced try/catch scope

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

hboutemy pushed a commit to branch MNG-6533-2
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 049b7a7ba8857fdbca94acca4d104af6f3532ee9
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Thu Dec 27 17:25:27 2018 +0100

    refactoring: reduced try/catch scope
---
 .../maven/project/DefaultProjectBuilder.java       | 143 +++++++++++----------
 1 file changed, 72 insertions(+), 71 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index a44e932..218119d 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -438,106 +438,107 @@ public class DefaultProjectBuilder
             new DefaultModelBuildingListener( project, projectBuildingHelper, config.request );
         request.setModelBuildingListener( listener );
 
+        ModelBuildingResult result;
         try
         {
-            ModelBuildingResult result = modelBuilder.build( request );
+            result = modelBuilder.build( request );
+        }
+        catch ( ModelBuildingException e )
+        {
+            results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) );
 
-            Model model = result.getEffectiveModel();
+            return false;
+        }
 
-            projectIndex.put( result.getModelIds().get( 0 ), project );
+        Model model = result.getEffectiveModel();
 
-            InterimResult interimResult = new InterimResult( pomFile, request, result, listener, isRoot );
-            interimResults.add( interimResult );
+        projectIndex.put( result.getModelIds().get( 0 ), project );
 
-            if ( recursive && !model.getModules().isEmpty() )
-            {
-                File basedir = pomFile.getParentFile();
+        InterimResult interimResult = new InterimResult( pomFile, request, result, listener, isRoot );
+        interimResults.add( interimResult );
+
+        if ( recursive && !model.getModules().isEmpty() )
+        {
+            File basedir = pomFile.getParentFile();
 
-                List<File> moduleFiles = new ArrayList<>();
+            List<File> moduleFiles = new ArrayList<>();
 
-                for ( String module : model.getModules() )
+            for ( String module : model.getModules() )
+            {
+                if ( StringUtils.isEmpty( module ) )
                 {
-                    if ( StringUtils.isEmpty( module ) )
-                    {
-                        continue;
-                    }
+                    continue;
+                }
 
-                    module = module.replace( '\\', File.separatorChar ).replace( '/', File.separatorChar );
+                module = module.replace( '\\', File.separatorChar ).replace( '/', File.separatorChar );
 
-                    File moduleFile = new File( basedir, module );
+                File moduleFile = new File( basedir, module );
 
-                    if ( moduleFile.isDirectory() )
-                    {
-                        moduleFile = modelProcessor.locatePom( moduleFile );
-                    }
+                if ( moduleFile.isDirectory() )
+                {
+                    moduleFile = modelProcessor.locatePom( moduleFile );
+                }
 
-                    if ( !moduleFile.isFile() )
-                    {
-                        ModelProblem problem =
-                            new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile
-                                + " does not exist", ModelProblem.Severity.ERROR, ModelProblem.Version.BASE, model, -1,
-                                                     -1, null );
-                        result.getProblems().add( problem );
+                if ( !moduleFile.isFile() )
+                {
+                    ModelProblem problem =
+                        new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile
+                            + " does not exist", ModelProblem.Severity.ERROR, ModelProblem.Version.BASE, model, -1,
+                                                 -1, null );
+                    result.getProblems().add( problem );
 
-                        noErrors = false;
+                    noErrors = false;
 
-                        continue;
-                    }
+                    continue;
+                }
 
-                    if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
+                if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
+                {
+                    // we don't canonicalize on unix to avoid interfering with symlinks
+                    try
                     {
-                        // we don't canonicalize on unix to avoid interfering with symlinks
-                        try
-                        {
-                            moduleFile = moduleFile.getCanonicalFile();
-                        }
-                        catch ( IOException e )
-                        {
-                            moduleFile = moduleFile.getAbsoluteFile();
-                        }
+                        moduleFile = moduleFile.getCanonicalFile();
                     }
-                    else
+                    catch ( IOException e )
                     {
-                        moduleFile = new File( moduleFile.toURI().normalize() );
+                        moduleFile = moduleFile.getAbsoluteFile();
                     }
+                }
+                else
+                {
+                    moduleFile = new File( moduleFile.toURI().normalize() );
+                }
 
-                    if ( aggregatorFiles.contains( moduleFile ) )
+                if ( aggregatorFiles.contains( moduleFile ) )
+                {
+                    StringBuilder buffer = new StringBuilder( 256 );
+                    for ( File aggregatorFile : aggregatorFiles )
                     {
-                        StringBuilder buffer = new StringBuilder( 256 );
-                        for ( File aggregatorFile : aggregatorFiles )
-                        {
-                            buffer.append( aggregatorFile ).append( " -> " );
-                        }
-                        buffer.append( moduleFile );
-
-                        ModelProblem problem =
-                            new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile
-                                + " forms aggregation cycle " + buffer, ModelProblem.Severity.ERROR,
-                                                     ModelProblem.Version.BASE, model, -1, -1, null );
-                        result.getProblems().add( problem );
-
-                        noErrors = false;
-
-                        continue;
+                        buffer.append( aggregatorFile ).append( " -> " );
                     }
+                    buffer.append( moduleFile );
 
-                    moduleFiles.add( moduleFile );
-                }
-
-                interimResult.modules = new ArrayList<>();
+                    ModelProblem problem =
+                        new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile
+                            + " forms aggregation cycle " + buffer, ModelProblem.Severity.ERROR,
+                                                 ModelProblem.Version.BASE, model, -1, -1, null );
+                    result.getProblems().add( problem );
 
-                if ( !build( results, interimResult.modules, projectIndex, moduleFiles, aggregatorFiles, false,
-                             recursive, config ) )
-                {
                     noErrors = false;
+
+                    continue;
                 }
+
+                moduleFiles.add( moduleFile );
             }
-        }
-        catch ( ModelBuildingException e )
-        {
-            results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) );
 
-            noErrors = false;
+            interimResult.modules = new ArrayList<>();
+
+            if ( !build( results, interimResult.modules, projectIndex, moduleFiles, aggregatorFiles, false,
+                         recursive, config ) )
+            {
+                noErrors = false;
+            }
         }
 
         return noErrors;


[maven] 03/05: [MNG-6533] Test: ProjectBuildingException miss reference to MavenProject

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

hboutemy pushed a commit to branch MNG-6533-2
in repository https://gitbox.apache.org/repos/asf/maven.git

commit ae1c32aa099b63e68200128c5bd526a08c07b9f5
Author: Mickael Istria <mi...@redhat.com>
AuthorDate: Thu Nov 29 18:26:46 2018 +0100

    [MNG-6533] Test: ProjectBuildingException miss reference to MavenProject
---
 .../apache/maven/project/ProjectBuilderTest.java   | 41 ++++++++++++++++++++++
 .../resources/projects/artifactMissingVersion.xml  | 34 ++++++++++++++++++
 2 files changed, 75 insertions(+)

diff --git a/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java b/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
index c472e47..369b22e 100644
--- a/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
+++ b/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
@@ -27,6 +27,7 @@ import java.util.Properties;
 import org.apache.maven.AbstractCoreMavenComponentTestCase;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.building.FileModelSource;
+import org.apache.maven.model.building.ModelBuildingRequest;
 import org.apache.maven.model.building.ModelSource;
 import org.apache.maven.shared.utils.io.FileUtils;
 
@@ -167,4 +168,44 @@ public class ProjectBuilderTest
             FileUtils.deleteDirectory( tempDir );
         }
     }
+
+    public void testReadErroneousMavenProjectContainsReference()
+        throws Exception
+    {
+        File pomFile = new File( "src/test/resources/projects/artifactMissingVersion.xml" ).getAbsoluteFile();
+        MavenSession mavenSession = createMavenSession( null );
+        ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
+        configuration.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
+        configuration.setRepositorySession( mavenSession.getRepositorySession() );
+        org.apache.maven.project.ProjectBuilder projectBuilder =
+            lookup( org.apache.maven.project.ProjectBuilder.class );
+
+        // single project build entry point
+        try
+        {
+            projectBuilder.build( pomFile, configuration );
+        }
+        catch ( ProjectBuildingException ex )
+        {
+            assertEquals( 1, ex.getResults().size() );
+            MavenProject project = ex.getResults().get( 0 ).getProject();
+            assertNotNull( project );
+            assertEquals( "testArtifactMissingVersion", project.getArtifactId() );
+            assertEquals( pomFile, project.getFile() );
+        }
+
+        // multi projects build entry point
+        try
+        {
+            projectBuilder.build( Collections.singletonList( pomFile ), false, configuration );
+        }
+        catch ( ProjectBuildingException ex )
+        {
+            assertEquals( 1, ex.getResults().size() );
+            MavenProject project = ex.getResults().get( 0 ).getProject();
+            assertNotNull( project );
+            assertEquals( "testArtifactMissingVersion", project.getArtifactId() );
+            assertEquals( pomFile, project.getFile() );
+        }
+    }
 }
diff --git a/maven-core/src/test/resources/projects/artifactMissingVersion.xml b/maven-core/src/test/resources/projects/artifactMissingVersion.xml
new file mode 100644
index 0000000..b87aa28
--- /dev/null
+++ b/maven-core/src/test/resources/projects/artifactMissingVersion.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>markerTest</groupId>
+  <artifactId>testArtifactMissingVersion</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>missing</groupId>
+      <artifactId>missing</artifactId>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0.2</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.2</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.4.1</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.4.3</version>
+      </plugin>
+    </plugins>
+  </build>
+</project>


[maven] 01/05: refactoring: extracted initParent() method

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

hboutemy pushed a commit to branch MNG-6533-2
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 2928dc6b68660cc5ac4022b0bfbc84d51d6905e4
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Thu Dec 27 01:01:10 2018 +0100

    refactoring: extracted initParent() method
---
 .../maven/project/DefaultProjectBuilder.java       | 150 +++++++++++----------
 1 file changed, 78 insertions(+), 72 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index a402040..a44e932 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -637,78 +637,7 @@ public class DefaultProjectBuilder
         project.setOriginalModel( result.getRawModel() );
         project.setFile( model.getPomFile() );
 
-        Model parentModel = result.getModelIds().size() > 1 && !result.getModelIds().get( 1 ).isEmpty()
-                                ? result.getRawModel( result.getModelIds().get( 1 ) )
-                                : null;
-
-        if ( parentModel != null )
-        {
-            final String parentGroupId = inheritedGroupId( result, 1 );
-            final String parentVersion = inheritedVersion( result, 1 );
-
-            project.setParentArtifact( repositorySystem.createProjectArtifact( parentGroupId,
-                                                                               parentModel.getArtifactId(),
-                                                                               parentVersion ) );
-
-            // org.apache.maven.its.mng4834:parent:0.1
-            String parentModelId = result.getModelIds().get( 1 );
-            File parentPomFile = result.getRawModel( parentModelId ).getPomFile();
-            MavenProject parent = projects.get( parentModelId );
-            if ( parent == null )
-            {
-                //
-                // At this point the DefaultModelBuildingListener has fired and it populates the
-                // remote repositories with those found in the pom.xml, along with the existing externally
-                // defined repositories.
-                //
-                projectBuildingRequest.setRemoteRepositories( project.getRemoteArtifactRepositories() );
-                if ( parentPomFile != null )
-                {
-                    project.setParentFile( parentPomFile );
-                    try
-                    {
-                        parent = build( parentPomFile, projectBuildingRequest ).getProject();
-                    }
-                    catch ( ProjectBuildingException e )
-                    {
-                        // MNG-4488 where let invalid parents slide on by
-                        if ( logger.isDebugEnabled() )
-                        {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn( "Failed to build parent project for " + project.getId(), e );
-                        }
-                        else
-                        {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn( "Failed to build parent project for " + project.getId() );
-                        }
-                    }
-                }
-                else
-                {
-                    Artifact parentArtifact = project.getParentArtifact();
-                    try
-                    {
-                        parent = build( parentArtifact, projectBuildingRequest ).getProject();
-                    }
-                    catch ( ProjectBuildingException e )
-                    {
-                        // MNG-4488 where let invalid parents slide on by
-                        if ( logger.isDebugEnabled() )
-                        {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn( "Failed to build parent project for " + project.getId(), e );
-                        }
-                        else
-                        {
-                            // Message below is checked for in the MNG-2199 core IT.
-                            logger.warn( "Failed to build parent project for " + project.getId() );
-                        }
-                    }
-                }
-            }
-            project.setParent( parent );
-        }
+        initParent( project, projects, result, projectBuildingRequest );
 
         Artifact projectArtifact =
             repositorySystem.createArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), null,
@@ -885,6 +814,83 @@ public class DefaultProjectBuilder
         }
     }
 
+    private void initParent( MavenProject project, Map<String, MavenProject> projects, ModelBuildingResult result,
+                             ProjectBuildingRequest projectBuildingRequest )
+    {
+        Model parentModel = result.getModelIds().size() > 1 && !result.getModelIds().get( 1 ).isEmpty()
+                                ? result.getRawModel( result.getModelIds().get( 1 ) )
+                                : null;
+
+        if ( parentModel != null )
+        {
+            final String parentGroupId = inheritedGroupId( result, 1 );
+            final String parentVersion = inheritedVersion( result, 1 );
+
+            project.setParentArtifact( repositorySystem.createProjectArtifact( parentGroupId,
+                                                                               parentModel.getArtifactId(),
+                                                                               parentVersion ) );
+
+            // org.apache.maven.its.mng4834:parent:0.1
+            String parentModelId = result.getModelIds().get( 1 );
+            File parentPomFile = result.getRawModel( parentModelId ).getPomFile();
+            MavenProject parent = projects.get( parentModelId );
+            if ( parent == null )
+            {
+                //
+                // At this point the DefaultModelBuildingListener has fired and it populates the
+                // remote repositories with those found in the pom.xml, along with the existing externally
+                // defined repositories.
+                //
+                projectBuildingRequest.setRemoteRepositories( project.getRemoteArtifactRepositories() );
+                if ( parentPomFile != null )
+                {
+                    project.setParentFile( parentPomFile );
+                    try
+                    {
+                        parent = build( parentPomFile, projectBuildingRequest ).getProject();
+                    }
+                    catch ( ProjectBuildingException e )
+                    {
+                        // MNG-4488 where let invalid parents slide on by
+                        if ( logger.isDebugEnabled() )
+                        {
+                            // Message below is checked for in the MNG-2199 core IT.
+                            logger.warn( "Failed to build parent project for " + project.getId(), e );
+                        }
+                        else
+                        {
+                            // Message below is checked for in the MNG-2199 core IT.
+                            logger.warn( "Failed to build parent project for " + project.getId() );
+                        }
+                    }
+                }
+                else
+                {
+                    Artifact parentArtifact = project.getParentArtifact();
+                    try
+                    {
+                        parent = build( parentArtifact, projectBuildingRequest ).getProject();
+                    }
+                    catch ( ProjectBuildingException e )
+                    {
+                        // MNG-4488 where let invalid parents slide on by
+                        if ( logger.isDebugEnabled() )
+                        {
+                            // Message below is checked for in the MNG-2199 core IT.
+                            logger.warn( "Failed to build parent project for " + project.getId(), e );
+                        }
+                        else
+                        {
+                            // Message below is checked for in the MNG-2199 core IT.
+                            logger.warn( "Failed to build parent project for " + project.getId() );
+                        }
+                    }
+                }
+            }
+            project.setParent( parent );
+        }
+    }
+
     private static String inheritedGroupId( final ModelBuildingResult result, final int modelIndex )
     {
         String groupId = null;


[maven] 04/05: [MNG-6533] Prefer passing the interim project in ProjectBuildingResult

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

hboutemy pushed a commit to branch MNG-6533-2
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 8b7055fe3ff3696b821409a6904ff4d69aa3ff6b
Author: Mickael Istria <mi...@redhat.com>
AuthorDate: Thu Nov 29 22:21:29 2018 +0100

    [MNG-6533] Prefer passing the interim project in ProjectBuildingResult
    
    Initialize the interim project with "simple" items (ie do not build
    not reference parent if it's not yet in the projectIndex) and returns
    it when installation fails further.
    This give a partial validation of the file, pretty convenient in IDEs.
---
 .../maven/project/DefaultProjectBuilder.java       | 46 ++++++++++++++++------
 1 file changed, 33 insertions(+), 13 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index 218119d..bf94abc 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -182,8 +182,8 @@ public class DefaultProjectBuilder
 
                 modelProblems = result.getProblems();
 
-                initProject( project, Collections.<String, MavenProject>emptyMap(), result,
-                             new HashMap<File, Boolean>(), projectBuildingRequest );
+                initProject( project, Collections.<String, MavenProject>emptyMap(), true,
+                             result, new HashMap<File, Boolean>(), projectBuildingRequest );
             }
             else if ( projectBuildingRequest.isResolveDependencies() )
             {
@@ -429,6 +429,7 @@ public class DefaultProjectBuilder
         ModelBuildingRequest request = getModelBuildingRequest( config );
 
         MavenProject project = new MavenProject();
+        project.setFile( pomFile );
 
         request.setPomFile( pomFile );
         request.setTwoPhaseBuilding( true );
@@ -445,12 +446,21 @@ public class DefaultProjectBuilder
         }
         catch ( ModelBuildingException e )
         {
-            results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) );
+            result = e.getResult();
+            if ( result == null || result.getEffectiveModel() == null )
+            {
+                 results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) );
 
-            return false;
+                 return false;
+            }
+            // validation error, continue project building and delay failing to help IDEs
+            // result.getProblems().addAll(e.getProblems()) ?
+            noErrors = false;
         }
 
         Model model = result.getEffectiveModel();
+        // first pass: build without building parent.
+        initProject( project, projectIndex, false, result, new HashMap<File, Boolean>( 0 ), config.request );
 
         projectIndex.put( result.getModelIds().get( 0 ), project );
 
@@ -591,12 +601,13 @@ public class DefaultProjectBuilder
 
         for ( InterimResult interimResult : interimResults )
         {
+            MavenProject project = interimResult.listener.getProject();
             try
             {
                 ModelBuildingResult result = modelBuilder.build( interimResult.request, interimResult.result );
 
-                MavenProject project = interimResult.listener.getProject();
-                initProject( project, projectIndex, result, profilesXmls, request );
+                // 2nd pass of initialization: resolve and build parent if necessary
+                initProject( project, projectIndex, true, result, profilesXmls, request );
 
                 List<MavenProject> modules = new ArrayList<>();
                 noErrors =
@@ -618,8 +629,16 @@ public class DefaultProjectBuilder
             }
             catch ( ModelBuildingException e )
             {
-                results.add( new DefaultProjectBuildingResult( e.getModelId(), interimResult.pomFile,
-                                                               e.getProblems() ) );
+                DefaultProjectBuildingResult result = null;
+                if ( project == null )
+                {
+                    result = new DefaultProjectBuildingResult( e.getModelId(), interimResult.pomFile, e.getProblems() );
+                }
+                else
+                {
+                    result = new DefaultProjectBuildingResult( project, e.getProblems(), null );
+                }
+                results.add( result );
 
                 noErrors = false;
             }
@@ -629,7 +648,8 @@ public class DefaultProjectBuilder
     }
 
     @SuppressWarnings( "checkstyle:methodlength" )
-    private void initProject( MavenProject project, Map<String, MavenProject> projects, ModelBuildingResult result,
+    private void initProject( MavenProject project, Map<String, MavenProject> projects,
+                              boolean buildParentIfNotExisting, ModelBuildingResult result,
                               Map<File, Boolean> profilesXmls, ProjectBuildingRequest projectBuildingRequest )
     {
         Model model = result.getEffectiveModel();
@@ -638,7 +658,7 @@ public class DefaultProjectBuilder
         project.setOriginalModel( result.getRawModel() );
         project.setFile( model.getPomFile() );
 
-        initParent( project, projects, result, projectBuildingRequest );
+        initParent( project, projects, buildParentIfNotExisting, result, projectBuildingRequest );
 
         Artifact projectArtifact =
             repositorySystem.createArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), null,
@@ -815,8 +835,8 @@ public class DefaultProjectBuilder
         }
     }
 
-    private void initParent( MavenProject project, Map<String, MavenProject> projects, ModelBuildingResult result,
-                             ProjectBuildingRequest projectBuildingRequest )
+    private void initParent( MavenProject project, Map<String, MavenProject> projects, boolean buildParentIfNotExisting,
+                             ModelBuildingResult result, ProjectBuildingRequest projectBuildingRequest )
     {
         Model parentModel = result.getModelIds().size() > 1 && !result.getModelIds().get( 1 ).isEmpty()
                                 ? result.getRawModel( result.getModelIds().get( 1 ) )
@@ -835,7 +855,7 @@ public class DefaultProjectBuilder
             String parentModelId = result.getModelIds().get( 1 );
             File parentPomFile = result.getRawModel( parentModelId ).getPomFile();
             MavenProject parent = projects.get( parentModelId );
-            if ( parent == null )
+            if ( parent == null && buildParentIfNotExisting )
             {
                 //
                 // At this point the DefaultModelBuildingListener has fired and it populates the


[maven] 05/05: [MNG-6533] ProjectBuilder report ModelProblem instead of Exception

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

hboutemy pushed a commit to branch MNG-6533-2
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 27332cfab0a18bbbd7d7d1374f2a201577d9c567
Author: Mickael Istria <mi...@redhat.com>
AuthorDate: Fri Nov 30 11:28:03 2018 +0100

    [MNG-6533] ProjectBuilder report ModelProblem instead of Exception
    
    Sending ModelProblems allows to keep processing other pom files.
---
 .../maven/project/DefaultProjectBuilder.java       | 22 +++++++++++++++---
 .../apache/maven/project/ProjectBuilderTest.java   | 26 ++++++++++++++++++++++
 maven-core/src/test/resources/projects/badPom.xml  |  8 +++++++
 3 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index bf94abc..df2aac9 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -459,8 +459,16 @@ public class DefaultProjectBuilder
         }
 
         Model model = result.getEffectiveModel();
-        // first pass: build without building parent.
-        initProject( project, projectIndex, false, result, new HashMap<File, Boolean>( 0 ), config.request );
+        try
+        {
+            // first pass: build without building parent.
+            initProject( project, projectIndex, false, result, new HashMap<File, Boolean>( 0 ), config.request );
+        }
+        catch ( Exception e )
+        {
+            result.getProblems().add( new DefaultModelProblem( null, ModelProblem.Severity.ERROR, null, model, -1, -1,
+                  e ) );
+        }
 
         projectIndex.put( result.getModelIds().get( 0 ), project );
 
@@ -607,7 +615,15 @@ public class DefaultProjectBuilder
                 ModelBuildingResult result = modelBuilder.build( interimResult.request, interimResult.result );
 
                 // 2nd pass of initialization: resolve and build parent if necessary
-                initProject( project, projectIndex, true, result, profilesXmls, request );
+                try
+                {
+                    initProject( project, projectIndex, true, result, profilesXmls, request );
+                }
+                catch ( Exception e )
+                {
+                    result.getProblems().add( new DefaultModelProblem( null, ModelProblem.Severity.ERROR, null,
+                            result.getEffectiveModel(), -1, -1, e ) );
+                }
 
                 List<MavenProject> modules = new ArrayList<>();
                 noErrors =
diff --git a/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java b/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
index 369b22e..624a9d1 100644
--- a/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
+++ b/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
@@ -208,4 +208,30 @@ public class ProjectBuilderTest
             assertEquals( pomFile, project.getFile() );
         }
     }
+
+    public void testReadInvalidPom()
+        throws Exception
+    {
+        File pomFile = new File( "src/test/resources/projects/badPom.xml" ).getAbsoluteFile();
+        MavenSession mavenSession = createMavenSession( null );
+        ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
+        configuration.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
+        configuration.setRepositorySession( mavenSession.getRepositorySession() );
+        org.apache.maven.project.ProjectBuilder projectBuilder =
+            lookup( org.apache.maven.project.ProjectBuilder.class );
+
+        // multi projects build entry point
+        try
+        {
+            projectBuilder.build( Collections.singletonList( pomFile ), false, configuration );
+        }
+        catch ( ProjectBuildingException ex )
+        {
+            assertEquals( 1, ex.getResults().size() );
+            MavenProject project = ex.getResults().get( 0 ).getProject();
+            assertNotNull( project );
+            assertNotSame( 0, ex.getResults().get( 0 ).getProblems().size() );
+        }
+    }
+
 }
diff --git a/maven-core/src/test/resources/projects/badPom.xml b/maven-core/src/test/resources/projects/badPom.xml
new file mode 100644
index 0000000..219ae94
--- /dev/null
+++ b/maven-core/src/test/resources/projects/badPom.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  some garbage maven project builder can't parse
+
+</project>