Skip to content

Commit 702c6d2

Browse files
committed
Support for Maven model 4.1
1 parent 0ed63bc commit 702c6d2

File tree

15 files changed

+144
-28
lines changed

15 files changed

+144
-28
lines changed

core/runtime/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@
187187
<parentFirstArtifact>org.jboss.logmanager:jboss-logmanager</parentFirstArtifact>
188188
<parentFirstArtifact>org.jboss.logging:jboss-logging</parentFirstArtifact>
189189
<parentFirstArtifact>org.apache.maven:maven-model</parentFirstArtifact>
190+
<parentFirstArtifact>org.apache.maven:maven-xml</parentFirstArtifact>
190191
<parentFirstArtifact>org.apache.maven.resolver:maven-resolver-api</parentFirstArtifact>
191192
<parentFirstArtifact>org.apache.maven.resolver:maven-resolver-impl</parentFirstArtifact>
192193
<parentFirstArtifact>org.codehaus.plexus:plexus-utils</parentFirstArtifact>

devtools/maven/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@
151151
<artifactId>maven-model-builder</artifactId>
152152
<scope>provided</scope>
153153
</dependency>
154+
<dependency>
155+
<groupId>org.apache.maven</groupId>
156+
<artifactId>maven-xml</artifactId>
157+
<scope>provided</scope>
158+
</dependency>
154159

155160
<dependency>
156161
<groupId>org.freemarker</groupId>

independent-projects/bootstrap/bom/pom.xml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,24 @@
105105
<dependency>
106106
<groupId>org.apache.maven</groupId>
107107
<artifactId>maven-model</artifactId>
108-
<version>${maven-core.version}</version>
108+
<version>${maven-model.version}</version>
109109
</dependency>
110110
<dependency>
111111
<groupId>org.apache.maven</groupId>
112112
<artifactId>maven-model-builder</artifactId>
113-
<version>${maven-core.version}</version>
113+
<version>${maven-model.version}</version>
114114
<exclusions>
115115
<exclusion>
116116
<groupId>javax.inject</groupId>
117117
<artifactId>javax.inject</artifactId>
118118
</exclusion>
119119
</exclusions>
120120
</dependency>
121+
<dependency>
122+
<groupId>org.apache.maven</groupId>
123+
<artifactId>maven-xml</artifactId>
124+
<version>${maven-model.version}</version>
125+
</dependency>
121126
<dependency>
122127
<groupId>org.apache.maven</groupId>
123128
<artifactId>maven-artifact</artifactId>
@@ -126,7 +131,7 @@
126131
<dependency>
127132
<groupId>org.apache.maven</groupId>
128133
<artifactId>maven-builder-support</artifactId>
129-
<version>${maven-core.version}</version>
134+
<version>${maven-model.version}</version>
130135
</dependency>
131136
<dependency>
132137
<groupId>org.apache.maven</groupId>
@@ -434,6 +439,11 @@
434439
<artifactId>plexus-utils</artifactId>
435440
<version>${plexus-utils.version}</version>
436441
</dependency>
442+
<dependency>
443+
<groupId>org.codehaus.plexus</groupId>
444+
<artifactId>plexus-xml</artifactId>
445+
<version>${plexus-xml.version}</version>
446+
</dependency>
437447
<dependency>
438448
<groupId>org.graalvm.sdk</groupId>
439449
<artifactId>nativeimage</artifactId>

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@
1111
import java.util.Deque;
1212
import java.util.List;
1313
import java.util.Map;
14+
import java.util.ServiceLoader;
1415
import java.util.concurrent.ConcurrentHashMap;
1516
import java.util.concurrent.ConcurrentLinkedDeque;
1617
import java.util.function.Consumer;
1718

19+
import org.apache.maven.api.xml.XmlService;
1820
import org.apache.maven.model.Model;
1921
import org.apache.maven.model.Profile;
2022
import org.apache.maven.model.building.DefaultModelBuildingRequest;
2123
import org.apache.maven.model.building.ModelBuilder;
2224
import org.apache.maven.model.building.ModelCache;
2325
import org.apache.maven.model.resolution.WorkspaceModelResolver;
26+
import org.apache.maven.model.v4.MavenStaxReader;
27+
import org.eclipse.aether.RepositorySystem;
2428
import org.eclipse.aether.artifact.Artifact;
2529
import org.eclipse.aether.repository.WorkspaceReader;
2630
import org.eclipse.aether.repository.WorkspaceRepository;
@@ -44,10 +48,29 @@ public class WorkspaceLoader implements WorkspaceModelResolver, WorkspaceReader
4448

4549
static final Model MISSING_MODEL = new Model();
4650

51+
/**
52+
* Preloads a few classes related to POM parsing. This is to avoid classloading deadlocks when called
53+
* in the context of the FacadeClassLoader, which isn't parallel capable atm.
54+
*/
55+
private static void preloadMavenXmlReaders() {
56+
new MavenStaxReader().getXMLInputFactory();
57+
try {
58+
// maven-xml was added as parent-first in quarkus-core, which helps with initializing the resolver in a test process,
59+
// here we use TCCL to make sure quarkus:dev boots
60+
//final Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(XmlService.class.getName());
61+
final Class<?> cls = RepositorySystem.class.getClassLoader().loadClass(XmlService.class.getName());
62+
ServiceLoader.load(cls).findFirst();
63+
} catch (ClassNotFoundException e) {
64+
// it's expected to load the class. If it doesn't, there is no reason to fail at this point though, since
65+
// this preload is a kind of hacky workaround anyway
66+
}
67+
}
68+
4769
private static ModelResolutionTaskRunner getTaskRunner() {
4870
if (ModelResolutionTaskRunnerFactory.isDefaultRunnerBlocking()) {
4971
return ModelResolutionTaskRunnerFactory.getBlockingTaskRunner();
5072
}
73+
preloadMavenXmlReaders();
5174
return ModelResolutionTaskRunnerFactory.getNonBlockingTaskRunner();
5275
}
5376

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,21 @@ public static ResolvedDependencyBuilder newDependencyBuilder(DependencyNode node
161161
}
162162

163163
public static ResolvedDependencyBuilder toAppArtifact(Artifact artifact, WorkspaceModule module) {
164+
String version = artifact.getVersion();
165+
// Hopefully, this version check won't be necessary once we move to the Maven resolver 2.x.
166+
// For now, when we resolve an artifact descriptor for a local project that has a dependency
167+
// on another local project but doesn't configure a version for that dependency (and it's not managed),
168+
// we will get an empty version for that dependency, which will also appear in the corresponding DependencyNode.
169+
if (version.isEmpty() && module != null) {
170+
version = module.getId().getVersion();
171+
}
164172
return ResolvedDependencyBuilder.newInstance()
165173
.setWorkspaceModule(module)
166174
.setGroupId(artifact.getGroupId())
167175
.setArtifactId(artifact.getArtifactId())
168176
.setClassifier(artifact.getClassifier())
169177
.setType(artifact.getExtension())
170-
.setVersion(artifact.getVersion())
178+
.setVersion(version)
171179
.setResolvedPaths(artifact.getFile() == null ? PathList.empty() : PathList.of(artifact.getFile().toPath()));
172180
}
173181

independent-projects/bootstrap/maven-resolver/src/test/java/io/quarkus/bootstrap/workspace/test/LocalWorkspaceDiscoveryTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,21 @@ public void warnOnFailingWorkspaceModules() throws Exception {
733733
assertEquals(2, ws.getProjects().size());
734734
}
735735

736+
@Test
737+
public void mavenModel401() throws Exception {
738+
final Path moduleDir = getModuleDir("maven-model-4.1/integration-test/java/quarkus-app");
739+
740+
final LocalWorkspace ws = new BootstrapMavenContext(BootstrapMavenContext.config()
741+
.setOffline(true)
742+
.setCurrentProject(moduleDir.toString()))
743+
.getWorkspace();
744+
745+
assertThat(ws.getProject("org.acme.integration", "integration-test-java-quarkus-app")).isNotNull();
746+
assertThat(ws.getProject("org.acme.integration", "integration-test-parent")).isNotNull();
747+
assertThat(ws.getProject("org.acme", "acme-parent")).isNotNull();
748+
assertThat(ws.getProjects().size()).isEqualTo(3);
749+
}
750+
736751
private void testMavenCiFriendlyVersion(String placeholder, String testResourceDirName, String expectedResolvedVersion,
737752
boolean resolvesFromWorkspace) throws Exception {
738753
final Path module1Dir = getModuleDir(testResourceDirName + "/root/module1");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.1.0 http://maven.apache.org/xsd/maven-4.1.0.xsd">
4+
<modelVersion>4.1.0</modelVersion>
5+
6+
<parent>
7+
<relativePath>../../pom.xml</relativePath>
8+
</parent>
9+
10+
<artifactId>integration-test-java-quarkus-app</artifactId>
11+
<name>Integration Test Java Quarkus-App</name>
12+
13+
</project>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.1.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.1.0 http://maven.apache.org/xsd/maven-4.1.0.xsd">
5+
<modelVersion>4.1.0</modelVersion>
6+
<parent>
7+
<groupId>org.acme</groupId>
8+
<artifactId>acme-parent</artifactId>
9+
</parent>
10+
11+
<groupId>org.acme.integration</groupId>
12+
<artifactId>integration-test-parent</artifactId>
13+
<name>Integration Test Parent</name>
14+
<packaging>pom</packaging>
15+
16+
<subprojects>
17+
<subproject>java/quarkus-app</subproject>
18+
</subprojects>
19+
20+
</project>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.1.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.1.0 http://maven.apache.org/xsd/maven-4.1.0.xsd">
5+
<modelVersion>4.1.0</modelVersion>
6+
7+
<groupId>org.acme</groupId>
8+
<artifactId>acme-parent</artifactId>
9+
<version>0.1.0-SNAPSHOT</version>
10+
<packaging>pom</packaging>
11+
12+
<name>Acme Project POM</name>
13+
<description>Parent POM for Acme project</description>
14+
15+
<subprojects>
16+
<subproject>integration-test</subproject>
17+
</subprojects>
18+
19+
</project>

independent-projects/bootstrap/pom.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<junit.version>6.0.3</junit.version>
4444
<maven-core.version>3.9.12</maven-core.version><!-- Keep in sync with sisu.version -->
4545
<sisu.version>0.9.0.M4</sisu.version><!-- Keep in sync with maven-core.version -->
46+
<maven-model.version>4.0.0-rc-5</maven-model.version>
4647
<maven-plugin-annotations.version>3.15.1</maven-plugin-annotations.version>
4748
<maven-resolver.version>1.9.25</maven-resolver.version>
4849
<maven-shared-utils.version>3.4.2</maven-shared-utils.version> <!-- Keep in sync with maven-core.version (force this version on maven-invoker) -->
@@ -69,7 +70,8 @@
6970
<plexus-cipher.version>2.0</plexus-cipher.version>
7071
<plexus-interpolation.version>1.26</plexus-interpolation.version>
7172
<plexus-sec-dispatcher.version>2.0</plexus-sec-dispatcher.version>
72-
<plexus-utils.version>3.5.1</plexus-utils.version>
73+
<plexus-utils.version>4.0.2</plexus-utils.version>
74+
<plexus-xml.version>4.1.0</plexus-xml.version>
7375
<smallrye-common.version>2.16.0</smallrye-common.version>
7476
<smallrye-beanbag.version>1.6.1</smallrye-beanbag.version>
7577
<gradle-tooling.version>9.3.1</gradle-tooling.version>

0 commit comments

Comments
 (0)