1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.project;
20
21 import java.io.File;
22 import java.nio.charset.StandardCharsets;
23 import java.nio.file.Files;
24 import java.nio.file.Path;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.Properties;
29 import java.util.concurrent.atomic.AtomicInteger;
30
31 import org.apache.maven.AbstractCoreMavenComponentTestCase;
32 import org.apache.maven.execution.MavenSession;
33 import org.apache.maven.model.Dependency;
34 import org.apache.maven.model.InputLocation;
35 import org.apache.maven.model.Plugin;
36 import org.apache.maven.model.building.ModelBuildingRequest;
37 import org.apache.maven.model.building.ModelProblem;
38 import org.codehaus.plexus.util.FileUtils;
39 import org.junit.jupiter.api.Test;
40 import org.junit.jupiter.api.io.TempDir;
41
42 import static org.apache.maven.project.ProjectBuildingResultWithLocationMatcher.projectBuildingResultWithLocation;
43 import static org.apache.maven.project.ProjectBuildingResultWithProblemMessageMatcher.projectBuildingResultWithProblemMessage;
44 import static org.hamcrest.MatcherAssert.assertThat;
45 import static org.hamcrest.Matchers.contains;
46 import static org.hamcrest.Matchers.containsString;
47 import static org.hamcrest.Matchers.empty;
48 import static org.hamcrest.Matchers.greaterThan;
49 import static org.hamcrest.Matchers.hasKey;
50 import static org.hamcrest.Matchers.is;
51 import static org.junit.jupiter.api.Assertions.assertEquals;
52 import static org.junit.jupiter.api.Assertions.assertNotNull;
53 import static org.junit.jupiter.api.Assertions.assertThrows;
54 import static org.junit.jupiter.api.Assertions.assertTrue;
55
56 class ProjectBuilderTest extends AbstractCoreMavenComponentTestCase {
57 @Override
58 protected String getProjectsDirectory() {
59 return "src/test/projects/project-builder";
60 }
61
62 @Test
63 void testSystemScopeDependencyIsPresentInTheCompileClasspathElements() throws Exception {
64 File pom = getProject("it0063");
65
66 Properties eps = new Properties();
67 eps.setProperty("jre.home", new File(pom.getParentFile(), "jdk/jre").getPath());
68
69 MavenSession session = createMavenSession(pom, eps);
70 MavenProject project = session.getCurrentProject();
71
72
73
74
75 project.getCompileClasspathElements();
76 }
77
78 @Test
79 void testBuildFromModelSource() throws Exception {
80 File pomFile = new File("src/test/resources/projects/modelsource/module01/pom.xml");
81 MavenSession mavenSession = createMavenSession(pomFile);
82 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
83 configuration.setRepositorySession(mavenSession.getRepositorySession());
84 ProjectBuildingResult result = getContainer()
85 .lookup(org.apache.maven.project.ProjectBuilder.class)
86 .build(pomFile, configuration);
87
88 assertNotNull(result.getProject().getParentFile());
89 }
90
91 @Test
92 void testVersionlessManagedDependency() throws Exception {
93 File pomFile = new File("src/test/resources/projects/versionless-managed-dependency.xml");
94 MavenSession mavenSession = createMavenSession(null);
95 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
96 configuration.setRepositorySession(mavenSession.getRepositorySession());
97
98 ProjectBuildingException e = assertThrows(ProjectBuildingException.class, () -> getContainer()
99 .lookup(org.apache.maven.project.ProjectBuilder.class)
100 .build(pomFile, configuration));
101 assertThat(
102 e.getResults(),
103 contains(
104 projectBuildingResultWithProblemMessage(
105 "'dependencies.dependency.version' for groupId='org.apache.maven.its', artifactId='a', type='jar' is missing")));
106 assertThat(e.getResults(), contains(projectBuildingResultWithLocation(5, 9)));
107 }
108
109 @Test
110 void testResolveDependencies() throws Exception {
111 File pomFile = new File("src/test/resources/projects/basic-resolveDependencies.xml");
112 MavenSession mavenSession = createMavenSession(null);
113 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
114 configuration.setRepositorySession(mavenSession.getRepositorySession());
115 configuration.setResolveDependencies(true);
116
117
118 ProjectBuildingResult result = getContainer()
119 .lookup(org.apache.maven.project.ProjectBuilder.class)
120 .build(pomFile, configuration);
121 assertEquals(1, result.getProject().getArtifacts().size());
122
123 List<ProjectBuildingResult> results = getContainer()
124 .lookup(org.apache.maven.project.ProjectBuilder.class)
125 .build(Collections.singletonList(pomFile), false, configuration);
126 assertEquals(1, results.size());
127 MavenProject mavenProject = results.get(0).getProject();
128 assertEquals(1, mavenProject.getArtifacts().size());
129
130 final MavenProject project = mavenProject;
131 final AtomicInteger artifactsResultInAnotherThread = new AtomicInteger();
132 Thread t = new Thread(new Runnable() {
133 @Override
134 public void run() {
135 artifactsResultInAnotherThread.set(project.getArtifacts().size());
136 }
137 });
138 t.start();
139 t.join();
140 assertEquals(project.getArtifacts().size(), artifactsResultInAnotherThread.get());
141 }
142
143 @Test
144 void testDontResolveDependencies() throws Exception {
145 File pomFile = new File("src/test/resources/projects/basic-resolveDependencies.xml");
146 MavenSession mavenSession = createMavenSession(null);
147 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
148 configuration.setRepositorySession(mavenSession.getRepositorySession());
149 configuration.setResolveDependencies(false);
150
151
152 ProjectBuildingResult result = getContainer()
153 .lookup(org.apache.maven.project.ProjectBuilder.class)
154 .build(pomFile, configuration);
155 assertEquals(0, result.getProject().getArtifacts().size());
156
157 List<ProjectBuildingResult> results = getContainer()
158 .lookup(org.apache.maven.project.ProjectBuilder.class)
159 .build(Collections.singletonList(pomFile), false, configuration);
160 assertEquals(1, results.size());
161 MavenProject mavenProject = results.get(0).getProject();
162 assertEquals(0, mavenProject.getArtifacts().size());
163 }
164
165 @Test
166 void testReadModifiedPoms(@TempDir Path tempDir) throws Exception {
167
168
169
170 FileUtils.copyDirectoryStructure(new File("src/test/resources/projects/grandchild-check"), tempDir.toFile());
171
172 MavenSession mavenSession = createMavenSession(null);
173 mavenSession.getRequest().setRootDirectory(tempDir);
174 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
175 configuration.setRepositorySession(mavenSession.getRepositorySession());
176 org.apache.maven.project.ProjectBuilder projectBuilder =
177 getContainer().lookup(org.apache.maven.project.ProjectBuilder.class);
178 File child = new File(tempDir.toFile(), "child/pom.xml");
179
180 projectBuilder.build(child, configuration);
181
182 File parent = new File(tempDir.toFile(), "pom.xml");
183 String parentContent = new String(Files.readAllBytes(parent.toPath()), StandardCharsets.UTF_8);
184 parentContent = parentContent.replace(
185 "<packaging>pom</packaging>",
186 "<packaging>pom</packaging><properties><addedProperty>addedValue</addedProperty></properties>");
187 Files.write(parent.toPath(), parentContent.getBytes(StandardCharsets.UTF_8));
188
189 ProjectBuildingResult result = projectBuilder.build(child, configuration);
190 assertThat(result.getProject().getProperties(), hasKey((Object) "addedProperty"));
191 }
192
193 @Test
194 void testReadErroneousMavenProjectContainsReference() throws Exception {
195 File pomFile = new File("src/test/resources/projects/artifactMissingVersion/pom.xml").getAbsoluteFile();
196 MavenSession mavenSession = createMavenSession(null);
197 mavenSession.getRequest().setRootDirectory(pomFile.getParentFile().toPath());
198 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
199 configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
200 configuration.setRepositorySession(mavenSession.getRepositorySession());
201 org.apache.maven.project.ProjectBuilder projectBuilder =
202 getContainer().lookup(org.apache.maven.project.ProjectBuilder.class);
203
204
205 ProjectBuildingException ex1 =
206 assertThrows(ProjectBuildingException.class, () -> projectBuilder.build(pomFile, configuration));
207
208 assertEquals(1, ex1.getResults().size());
209 MavenProject project1 = ex1.getResults().get(0).getProject();
210 assertNotNull(project1);
211 assertEquals("testArtifactMissingVersion", project1.getArtifactId());
212 assertEquals(pomFile, project1.getFile());
213
214
215 ProjectBuildingException ex2 = assertThrows(
216 ProjectBuildingException.class,
217 () -> projectBuilder.build(Collections.singletonList(pomFile), true, configuration));
218
219 assertEquals(1, ex2.getResults().size());
220 MavenProject project2 = ex2.getResults().get(0).getProject();
221 assertNotNull(project2);
222 assertEquals("testArtifactMissingVersion", project2.getArtifactId());
223 assertEquals(pomFile, project2.getFile());
224 }
225
226 @Test
227 void testReadInvalidPom() throws Exception {
228 File pomFile = new File("src/test/resources/projects/badPom.xml").getAbsoluteFile();
229 MavenSession mavenSession = createMavenSession(null);
230 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
231 configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_STRICT);
232 configuration.setRepositorySession(mavenSession.getRepositorySession());
233 org.apache.maven.project.ProjectBuilder projectBuilder =
234 getContainer().lookup(org.apache.maven.project.ProjectBuilder.class);
235
236
237 Exception ex = assertThrows(Exception.class, () -> projectBuilder.build(pomFile, configuration));
238 assertThat(ex.getMessage(), containsString("Received non-all-whitespace CHARACTERS or CDATA event"));
239
240
241 ProjectBuildingException pex = assertThrows(
242 ProjectBuildingException.class,
243 () -> projectBuilder.build(Collections.singletonList(pomFile), false, configuration));
244 assertEquals(1, pex.getResults().size());
245 assertNotNull(pex.getResults().get(0).getPomFile());
246 assertThat(pex.getResults().get(0).getProblems().size(), greaterThan(0));
247 assertThat(
248 pex.getResults(),
249 contains(projectBuildingResultWithProblemMessage(
250 "Received non-all-whitespace CHARACTERS or CDATA event in nextTag()")));
251 }
252
253 @Test
254 void testReadParentAndChildWithRegularVersionSetParentFile() throws Exception {
255 List<File> toRead = new ArrayList<>(2);
256 File parentPom = getProject("MNG-6723");
257 toRead.add(parentPom);
258 toRead.add(new File(parentPom.getParentFile(), "child/pom.xml"));
259 MavenSession mavenSession = createMavenSession(null);
260 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
261 configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
262 configuration.setRepositorySession(mavenSession.getRepositorySession());
263 org.apache.maven.project.ProjectBuilder projectBuilder =
264 getContainer().lookup(org.apache.maven.project.ProjectBuilder.class);
265
266
267 boolean parentFileWasFoundOnChild = false;
268 for (File file : toRead) {
269 List<ProjectBuildingResult> results =
270 projectBuilder.build(Collections.singletonList(file), false, configuration);
271 assertResultShowNoError(results);
272 MavenProject project = findChildProject(results);
273 if (project != null) {
274 assertEquals(parentPom, project.getParentFile());
275 parentFileWasFoundOnChild = true;
276 }
277 }
278 assertTrue(parentFileWasFoundOnChild);
279
280
281 List<ProjectBuildingResult> results = projectBuilder.build(toRead, false, configuration);
282 assertResultShowNoError(results);
283 assertEquals(parentPom, findChildProject(results).getParentFile());
284 Collections.reverse(toRead);
285 results = projectBuilder.build(toRead, false, configuration);
286 assertResultShowNoError(results);
287 assertEquals(parentPom, findChildProject(results).getParentFile());
288 }
289
290 private MavenProject findChildProject(List<ProjectBuildingResult> results) {
291 for (ProjectBuildingResult result : results) {
292 if (result.getPomFile().getParentFile().getName().equals("child")) {
293 return result.getProject();
294 }
295 }
296 return null;
297 }
298
299 private void assertResultShowNoError(List<ProjectBuildingResult> results) {
300 for (ProjectBuildingResult result : results) {
301 assertThat(result.getProblems(), is(empty()));
302 assertNotNull(result.getProject());
303 }
304 }
305
306 @Test
307 void testBuildProperties() throws Exception {
308 File file = new File(getProject("MNG-6716").getParentFile(), "project/pom.xml");
309 MavenSession mavenSession = createMavenSession(null);
310 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
311 configuration.setRepositorySession(mavenSession.getRepositorySession());
312 configuration.setResolveDependencies(true);
313 List<ProjectBuildingResult> result =
314 projectBuilder.build(Collections.singletonList(file), false, configuration);
315 MavenProject project = result.get(0).getProject();
316
317 assertEquals(1, project.getTestCompileSourceRoots().size());
318 assertEquals(1, project.getCompileSourceRoots().size());
319 assertEquals(1, project.getMailingLists().size());
320 assertEquals(1, project.getResources().size());
321 }
322
323 @Test
324 void testPropertyInPluginManagementGroupId() throws Exception {
325 File pom = getProject("MNG-6983");
326
327 MavenSession session = createMavenSession(pom);
328 MavenProject project = session.getCurrentProject();
329
330 for (Plugin buildPlugin : project.getBuildPlugins()) {
331 assertNotNull(buildPlugin.getVersion(), "Missing version for build plugin " + buildPlugin.getKey());
332 }
333 }
334
335 @Test
336 void testBuildFromModelSourceResolvesBasedir() throws Exception {
337 File pomFile = new File("src/test/resources/projects/modelsourcebasedir/pom.xml");
338 MavenSession mavenSession = createMavenSession(null);
339 ProjectBuildingRequest configuration = new DefaultProjectBuildingRequest();
340 configuration.setRepositorySession(mavenSession.getRepositorySession());
341 ProjectBuildingResult result = getContainer()
342 .lookup(org.apache.maven.project.ProjectBuilder.class)
343 .build(pomFile, configuration);
344
345 assertEquals(
346 pomFile.getAbsoluteFile(),
347 result.getProject().getModel().getPomFile().getAbsoluteFile());
348 int errors = 0;
349 for (ModelProblem p : result.getProblems()) {
350 if (p.getSeverity() == ModelProblem.Severity.ERROR) {
351 errors++;
352 }
353 }
354 assertEquals(0, errors);
355 }
356
357 @Test
358 void testLocationTrackingResolution() throws Exception {
359 File pom = getProject("MNG-7648");
360
361 MavenSession session = createMavenSession(pom);
362 MavenProject project = session.getCurrentProject();
363
364 InputLocation dependencyLocation = null;
365 for (Dependency dependency : project.getDependencies()) {
366 if (dependency.getManagementKey().equals("org.apache.maven.its:a:jar")) {
367 dependencyLocation = dependency.getLocation("version");
368 }
369 }
370 assertNotNull(dependencyLocation, "missing dependency");
371 assertEquals(
372 "org.apache.maven.its:bom:0.1", dependencyLocation.getSource().getModelId());
373
374 InputLocation pluginLocation = null;
375 for (Plugin plugin : project.getBuildPlugins()) {
376 if (plugin.getKey().equals("org.apache.maven.plugins:maven-clean-plugin")) {
377 pluginLocation = plugin.getLocation("version");
378 }
379 }
380 assertNotNull(pluginLocation, "missing build plugin");
381 assertEquals(
382 "org.apache.maven.its:parent:0.1", pluginLocation.getSource().getModelId());
383 }
384 }