|
21 | 21 | import org.apache.maven.model.Plugin;
|
22 | 22 | import org.apache.maven.model.Profile;
|
23 | 23 | import org.apache.maven.model.Repository;
|
| 24 | +import org.apache.maven.plugin.AbstractMojoExecutionException; |
24 | 25 | import org.apache.maven.plugin.MojoExecutionException;
|
| 26 | +import org.apache.maven.plugin.MojoFailureException; |
25 | 27 | import org.apache.maven.plugin.logging.Log;
|
26 | 28 | import org.apache.maven.project.MavenProject;
|
27 | 29 | import org.apache.maven.rtinfo.RuntimeInformation;
|
|
50 | 52 | import org.openrewrite.maven.tree.ProfileActivation;
|
51 | 53 | import org.openrewrite.maven.utilities.MavenWrapper;
|
52 | 54 | import org.openrewrite.style.NamedStyles;
|
53 |
| -import org.openrewrite.tree.ParseError; |
54 | 55 | import org.openrewrite.xml.tree.Xml;
|
55 | 56 |
|
56 | 57 | import java.io.File;
|
@@ -132,7 +133,7 @@ public MavenMojoProjectParser(Log logger, Path baseDir, boolean pomCacheEnabled,
|
132 | 133 | }
|
133 | 134 |
|
134 | 135 | public Stream<SourceFile> listSourceFiles(MavenProject mavenProject, List<NamedStyles> styles,
|
135 |
| - ExecutionContext ctx) throws DependencyResolutionRequiredException, MojoExecutionException { |
| 136 | + ExecutionContext ctx) throws DependencyResolutionRequiredException, AbstractMojoExecutionException { |
136 | 137 | if (runPerSubmodule) {
|
137 | 138 | //If running per submodule, parse the source files for only the current project.
|
138 | 139 | List<Marker> projectProvenance = generateProvenance(mavenProject);
|
@@ -241,9 +242,7 @@ private SourceFile logParseErrors(SourceFile source) {
|
241 | 242 | logger.warn("There were problems parsing some source files" +
|
242 | 243 | (mavenSession.getRequest().isShowErrors() ? "" : ", run with --errors to see full stack traces"));
|
243 | 244 | }
|
244 |
| - String pomMessage = source instanceof Xml.Document |
245 |
| - ? "; the pom could not be resolved. Some recipes may not function correctly" : ""; |
246 |
| - logger.warn("There were problems parsing " + source.getSourcePath() + pomMessage); |
| 245 | + logger.warn("There were problems parsing " + source.getSourcePath()); |
247 | 246 | if (mavenSession.getRequest().isShowErrors()) {
|
248 | 247 | logger.warn(e.getMessage());
|
249 | 248 | }
|
@@ -514,11 +513,11 @@ private static JavaSourceSet sourceSet(String name, List<Path> dependencies, Jav
|
514 | 513 | return JavaSourceSet.build(name, dependencies);
|
515 | 514 | }
|
516 | 515 |
|
517 |
| - public Xml.@Nullable Document parseMaven(MavenProject mavenProject, List<Marker> projectProvenance, ExecutionContext ctx) { |
| 516 | + public Xml.@Nullable Document parseMaven(MavenProject mavenProject, List<Marker> projectProvenance, ExecutionContext ctx) throws MojoFailureException { |
518 | 517 | return parseMaven(singletonList(mavenProject), singletonMap(mavenProject, projectProvenance), ctx).get(mavenProject);
|
519 | 518 | }
|
520 | 519 |
|
521 |
| - public Map<MavenProject, Xml.Document> parseMaven(List<MavenProject> mavenProjects, Map<MavenProject, List<Marker>> projectProvenances, ExecutionContext ctx) { |
| 520 | + public Map<MavenProject, Xml.Document> parseMaven(List<MavenProject> mavenProjects, Map<MavenProject, List<Marker>> projectProvenances, ExecutionContext ctx) throws MojoFailureException { |
522 | 521 | if (skipMavenParsing) {
|
523 | 522 | logger.info("Skipping Maven parsing...");
|
524 | 523 | return emptyMap();
|
@@ -578,11 +577,15 @@ public Map<MavenProject, Xml.Document> parseMaven(List<MavenProject> mavenProjec
|
578 | 577 | Path path = baseDir.resolve(document.getSourcePath());
|
579 | 578 | MavenProject mavenProject = projectsByPath.get(path);
|
580 | 579 | if (mavenProject != null) {
|
581 |
| - if (document instanceof Xml.Document) { |
582 |
| - projectMap.put(mavenProject, (Xml.Document) document); |
583 |
| - } else if (document instanceof ParseError) { |
584 |
| - logError(mavenProject, "Parse error in Maven Project File '" + path + "': " + document); |
| 580 | + Optional<ParseExceptionResult> parseExceptionResult = document.getMarkers().findFirst(ParseExceptionResult.class); |
| 581 | + if (parseExceptionResult.isPresent()) { |
| 582 | + throw new MojoFailureException( |
| 583 | + mavenProject, |
| 584 | + "Failed to parse or resolve the Maven POM file or one of its dependencies; " + |
| 585 | + "We can not reliably continue without this information.", |
| 586 | + parseExceptionResult.get().getMessage()); |
585 | 587 | }
|
| 588 | + projectMap.put(mavenProject, (Xml.Document) document); |
586 | 589 | }
|
587 | 590 | }
|
588 | 591 | for (MavenProject mavenProject : mavenProjects) {
|
@@ -770,6 +773,7 @@ private static List<Path> listSources(Path sourceDirectory, String extension) th
|
770 | 773 | }
|
771 | 774 |
|
772 | 775 | private static final Map<Path, GitProvenance> REPO_ROOT_TO_PROVENANCE = new HashMap<>();
|
| 776 | + |
773 | 777 | private @Nullable GitProvenance gitProvenance(Path baseDir, @Nullable BuildEnvironment buildEnvironment) {
|
774 | 778 | try {
|
775 | 779 | // Computing git provenance can be expensive for repositories with many commits, ensure we do it only once
|
|
0 commit comments