Skip to content

Commit 87d457c

Browse files
aloubyanskygsmet
authored andcommitted
Fix loading POMs manipulated by Maven extensions
(cherry picked from commit 468fae0)
1 parent d1e55cb commit 87d457c

File tree

21 files changed

+541
-98
lines changed

21 files changed

+541
-98
lines changed

devtools/cli/src/test/java/io/quarkus/cli/MavenProjectInfoAndUpdateTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,17 @@ void testMisalignedPlatformExtensionVersion() throws Exception {
104104
assertRegistryExtensions(infoResult.stdout, "registry.acme.org",
105105
UP_TO_DATE_ICON.iconOrMessage() + " org.acme:acme-quarkiverse-extension:1.0");
106106

107-
final CliDriver.Result rectifyResult = run(projectDir, "update", "--platform-version=1.0.0", "--no-rewrite");
108-
assertThat(rectifyResult.getExitCode()).isEqualTo(0);
107+
CliDriver.Result updateResult = run(projectDir, "update", "--platform-version=1.0.0", "--no-rewrite");
108+
assertThat(updateResult.getExitCode()).isEqualTo(0);
109109

110-
assertThat(rectifyResult.stdout)
110+
assertThat(updateResult.stdout)
111111
.contains(
112112
"- org.acme.quarkus.platform:acme-quarkus-subatomic:[1.0.0 -> managed]");
113+
assertQuarkusPlatformBomUpdates(updateResult.stdout,
114+
ArtifactCoords.pom("org.acme.quarkus.platform", "quarkus-bom", "[2.0.0 -> 1.0.0]"),
115+
ArtifactCoords.pom("org.acme.quarkus.platform", "acme-bom", "[2.0.0 -> 1.0.0]"));
113116

114-
final CliDriver.Result updateResult = run(projectDir, "update", "-Dquarkus.platform.version=1.0.0", "--no-rewrite");
117+
updateResult = run(projectDir, "update", "-Dquarkus.platform.version=1.0.0", "--no-rewrite");
115118
assertThat(updateResult.getExitCode()).isEqualTo(0);
116119
assertQuarkusPlatformBomUpdates(updateResult.stdout,
117120
ArtifactCoords.pom("org.acme.quarkus.platform", "quarkus-bom", "[1.0.0 -> 2.0.0]"),

devtools/maven/src/main/java/io/quarkus/maven/QuarkusBootstrapProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ static Map<Path, Model> getProjectMap(MavenSession session) {
9191
model.setPomFile(mp.getFile());
9292
// activated profiles or custom extensions may have overridden the build defaults
9393
model.setBuild(mp.getModel().getBuild());
94-
projectModels.put(mp.getBasedir().toPath(), model);
94+
projectModels.put(mp.getFile().toPath(), model);
9595
// The Maven Model API determines the project directory as the directory containing the POM file.
9696
// However, in case when plugins manipulating POMs store their results elsewhere
9797
// (such as the flatten plugin storing the flattened POM under the target directory),
9898
// both the base directory and the directory containing the POM file should be added to the map.
9999
var pomDir = mp.getFile().getParentFile();
100100
if (!pomDir.equals(mp.getBasedir())) {
101-
projectModels.put(pomDir.toPath(), model);
101+
projectModels.put(mp.getBasedir().toPath().resolve("pom.xml"), model);
102102
}
103103
}
104104
return projectModels;
@@ -210,7 +210,7 @@ private MavenArtifactResolver artifactResolver(QuarkusBootstrapMojo mojo, Launch
210210
.setUserSettings(mojo.mavenSession().getRequest().getUserSettingsFile())
211211
.setCurrentProject(mojo.mavenProject().getFile().toString())
212212
.setPreferPomsFromWorkspace(true)
213-
.setProjectModelProvider(getProjectMap(mojo.mavenSession())::get)
213+
.setProjectModelProvider(getProjectMap(mojo.mavenSession()))
214214
// pass the repositories since Maven extensions could manipulate repository configs
215215
.setRemoteRepositories(mojo.remoteRepositories())
216216
.setEffectiveModelBuilder(BootstrapMavenContextConfig

independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/BootstrapMavenContext.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import java.util.Map;
1515
import java.util.Properties;
1616
import java.util.Set;
17-
import java.util.function.Function;
1817
import java.util.function.Supplier;
1918
import java.util.stream.Collectors;
2019

@@ -378,7 +377,7 @@ private boolean getLocalRepoTailIgnoreAvailability() {
378377
: localRepoTailIgnoreAvailability;
379378
}
380379

381-
private LocalProject resolveCurrentProject(Function<Path, Model> modelProvider) throws BootstrapMavenException {
380+
private LocalProject resolveCurrentProject(Map<Path, Model> modelProvider) throws BootstrapMavenException {
382381
try {
383382
return LocalProject.loadWorkspace(this, modelProvider);
384383
} catch (Exception e) {

independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/BootstrapMavenContextConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import java.nio.file.Paths;
77
import java.util.ArrayList;
88
import java.util.List;
9+
import java.util.Map;
910
import java.util.Properties;
10-
import java.util.function.Function;
1111

1212
import org.apache.maven.model.Model;
1313
import org.apache.maven.settings.crypto.SettingsDecrypter;
@@ -58,7 +58,7 @@ public static boolean getEffectiveModelBuilderProperty(Properties props) {
5858
protected boolean preferPomsFromWorkspace;
5959
protected Boolean effectiveModelBuilder;
6060
protected Boolean wsModuleParentHierarchy;
61-
protected Function<Path, Model> modelProvider;
61+
protected Map<Path, Model> modelProvider;
6262
protected List<String> excludeSisuBeanPackages;
6363
protected List<String> includeSisuBeanPackages;
6464
protected Boolean warnOnFailedWorkspaceModules;
@@ -374,7 +374,7 @@ public T setWorkspaceModuleParentHierarchy(boolean wsModuleParentHierarchy) {
374374
* @return this instance
375375
*/
376376
@SuppressWarnings("unchecked")
377-
public T setProjectModelProvider(Function<Path, Model> modelProvider) {
377+
public T setProjectModelProvider(Map<Path, Model> modelProvider) {
378378
this.modelProvider = modelProvider;
379379
return (T) this;
380380
}

independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/MavenModelBuilder.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import java.io.File;
44
import java.io.IOException;
5+
import java.util.Collection;
6+
import java.util.HashMap;
57
import java.util.HashSet;
68
import java.util.List;
9+
import java.util.Map;
710
import java.util.Set;
811

912
import org.apache.maven.model.Model;
@@ -17,6 +20,7 @@
1720
import org.eclipse.aether.artifact.DefaultArtifact;
1821

1922
import io.quarkus.bootstrap.resolver.maven.options.BootstrapMavenOptions;
23+
import io.quarkus.bootstrap.resolver.maven.workspace.LocalProject;
2024
import io.quarkus.bootstrap.resolver.maven.workspace.LocalWorkspace;
2125
import io.quarkus.bootstrap.resolver.maven.workspace.ModelUtils;
2226
import io.quarkus.maven.dependency.ArtifactCoords;
@@ -29,10 +33,23 @@ public class MavenModelBuilder implements ModelBuilder {
2933

3034
private final ModelBuilder builder;
3135
private final BootstrapMavenContext ctx;
36+
// This mapping is particularly useful when POM files do not exactly match the Model present in the LocalWorkspace.
37+
// This may happen when Maven extensions manipulate the original POMs by changing versions, etc.
38+
private final Map<File, Model> poms;
3239

3340
public MavenModelBuilder(BootstrapMavenContext ctx) {
3441
builder = BootstrapModelBuilderFactory.getDefaultModelBuilder();
3542
this.ctx = ctx;
43+
if (ctx != null && ctx.getWorkspace() != null) {
44+
final Collection<LocalProject> projects = ctx.getWorkspace().getProjects().values();
45+
final Map<File, Model> tmp = new HashMap<>(projects.size());
46+
for (var p : projects) {
47+
tmp.put(p.getRawModel().getPomFile(), p.getRawModel());
48+
}
49+
poms = tmp;
50+
} else {
51+
poms = Map.of();
52+
}
3653
}
3754

3855
@Override
@@ -65,17 +82,25 @@ public ModelBuildingResult build(ModelBuildingRequest request) throws ModelBuild
6582

6683
private Model getModel(ModelBuildingRequest request) {
6784
Model requestModel = request.getRawModel();
68-
if (requestModel == null) {
69-
if (request.getModelSource() != null) {
70-
try {
71-
requestModel = ModelUtils.readModel(request.getModelSource().getInputStream());
72-
request.setRawModel(requestModel);
73-
if (request.getPomFile() != null) {
74-
requestModel.setPomFile(request.getPomFile());
75-
}
76-
} catch (IOException e) {
77-
// ignore
85+
if (requestModel != null) {
86+
return requestModel;
87+
}
88+
if (request.getPomFile() != null) {
89+
requestModel = poms.get(request.getPomFile());
90+
if (requestModel != null) {
91+
request.setRawModel(requestModel);
92+
return requestModel;
93+
}
94+
}
95+
if (request.getModelSource() != null) {
96+
try {
97+
requestModel = ModelUtils.readModel(request.getModelSource().getInputStream());
98+
request.setRawModel(requestModel);
99+
if (request.getPomFile() != null) {
100+
requestModel.setPomFile(request.getPomFile());
78101
}
102+
} catch (IOException e) {
103+
// ignore
79104
}
80105
}
81106
return requestModel;

independent-projects/bootstrap/maven-resolver/src/main/java/io/quarkus/bootstrap/resolver/maven/workspace/LocalProject.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public static LocalProject loadWorkspace(BootstrapMavenContext ctx) throws Boots
104104
return loadWorkspace(ctx, null);
105105
}
106106

107-
public static LocalProject loadWorkspace(BootstrapMavenContext ctx, Function<Path, Model> modelProvider)
107+
public static LocalProject loadWorkspace(BootstrapMavenContext ctx, Map<Path, Model> modelProvider)
108108
throws BootstrapMavenException {
109109
final Path currentProjectPom = ctx.getCurrentProjectPomOrNull();
110110
if (currentProjectPom == null) {
@@ -163,6 +163,9 @@ static Path locateCurrentProjectPom(Path path, boolean required) throws Bootstra
163163
this.workspace = workspace;
164164
if (workspace != null) {
165165
workspace.addProject(this);
166+
if (!version.equals(ModelUtils.getRawVersion(rawModel))) {
167+
workspace.setResolvedVersion(version);
168+
}
166169
}
167170
}
168171

0 commit comments

Comments
 (0)