slachiewicz commented on PR #13442:
URL: https://github.com/apache/maven/pull/13442#issuecomment-6132760193
> interesting ... why project pom have an impact to tests
The test never asks for this POM: the model builder loads it as the reactor
root.
1. `ApiRunner.createSession()` gives a session whose `getRootDirectory()`
throws `IllegalStateException`.
2. `buildBuildPom()` then falls back to
`RootLocator.findMandatoryRoot(top)`, which walks up from
`src/test/resources/poms/factory/complex.xml` to the first `.mvn` directory:
the root of the checkout. `locateExistingPom()` returns our `pom.xml`, and
`loadFromRoot(root, top)` reads it before it reaches `complex.xml`.
3. Profile activation uses `request.getSystemProperties()` only
(`getProfileActivationContext`), and the test passes `Map.of("myproperty",
"test")`. The session's system properties are not merged in, so `java.version`
is missing.
4. `JdkVersionProfileActivator` reports a missing `java.version` as an ERROR
problem rather than an inactive profile. The problem is collected, not thrown,
so the surefire trace shows only where `buildBuildPom` turns the collected
problems into a `ModelBuilderException`:
```
org.apache.maven.api.services.ModelBuilderException:
1 problem was for test:test:pom:0.1-SNAPSHOT
- [ERROR] Failed to determine Java version for profile
jdk27-skip-spotless @ line 998, column 9
at
...DefaultModelBuilder$ModelBuilderSessionState.newModelBuilderException(DefaultModelBuilder.java:640)
at
...DefaultModelBuilder$ModelBuilderSessionState.buildBuildPom(DefaultModelBuilder.java:980)
at
...DefaultModelBuilder$ModelBuilderSessionImpl.build(DefaultModelBuilder.java:243)
at
...ComplexActivationTest.testAndConditionInActivation(ComplexActivationTest.java:63)
```
The problem is also reported for `test:test` although its location (line
998) is in the root `pom.xml`, which makes it look as if the test POM were
wrong.
The root POM is activated twice, both times from `loadFilePom` of the root.
A `Throwable` dumped in `JdkVersionProfileActivator.isActive` shows both paths
(`maven-4.0.x`, test frames trimmed):
<details><summary>Call stacks</summary>
Root model read, to compute properties for CI-friendly versions:
```
JdkVersionProfileActivator.isActive(JdkVersionProfileActivator.java:66)
DefaultProfileSelector.isActive(DefaultProfileSelector.java:100)
DefaultProfileSelector.getActiveProfiles(DefaultProfileSelector.java:72)
DefaultModelBuilder$ModelBuilderSessionState.getActiveProfiles(DefaultModelBuilder.java:1736)
DefaultModelBuilder$ModelBuilderSessionState.getPropertiesWithProfiles(DefaultModelBuilder.java:923)
DefaultModelBuilder$ModelBuilderSessionState.getEnhancedProperties(DefaultModelBuilder.java:896)
DefaultModelBuilder$ModelBuilderSessionState.doReadFileModel(DefaultModelBuilder.java:1987)
DefaultModelBuilder$ModelBuilderSessionState.lambda$readFileModel$12(DefaultModelBuilder.java:1808)
DefaultModelBuilder$ModelBuilderSessionState.lambda$cache$19(DefaultModelBuilder.java:2690)
CachingSupplier.apply(CachingSupplier.java:85)
AbstractRequestCache.request(AbstractRequestCache.java:86)
AbstractSession.request(AbstractSession.java:172)
DefaultModelBuilder$ModelBuilderSessionState.cache(DefaultModelBuilder.java:2690)
DefaultModelBuilder$ModelBuilderSessionState.readFileModel(DefaultModelBuilder.java:1808)
DefaultModelBuilder$ModelBuilderSessionState.readFileModel(DefaultModelBuilder.java:1804)
DefaultModelBuilder$ModelBuilderSessionState.loadFilePom(DefaultModelBuilder.java:1066)
DefaultModelBuilder$ModelBuilderSessionState.loadFromRoot(DefaultModelBuilder.java:1043)
DefaultModelBuilder$ModelBuilderSessionState.buildBuildPom(DefaultModelBuilder.java:976)
DefaultModelBuilder$ModelBuilderSessionImpl.build(DefaultModelBuilder.java:243)
ComplexActivationTest.testAndConditionInActivation(ComplexActivationTest.java:63)
```
Root file model activation, to find its subprojects:
```
JdkVersionProfileActivator.isActive(JdkVersionProfileActivator.java:66)
DefaultProfileSelector.isActive(DefaultProfileSelector.java:100)
DefaultProfileSelector.getActiveProfiles(DefaultProfileSelector.java:72)
DefaultModelBuilder$ModelBuilderSessionState.getActiveProfiles(DefaultModelBuilder.java:1736)
DefaultModelBuilder$ModelBuilderSessionState.activateFileModel(DefaultModelBuilder.java:1584)
DefaultModelBuilder$ModelBuilderSessionState.loadFilePom(DefaultModelBuilder.java:1071)
DefaultModelBuilder$ModelBuilderSessionState.loadFromRoot(DefaultModelBuilder.java:1043)
DefaultModelBuilder$ModelBuilderSessionState.buildBuildPom(DefaultModelBuilder.java:976)
DefaultModelBuilder$ModelBuilderSessionImpl.build(DefaultModelBuilder.java:243)
ComplexActivationTest.testAndConditionInActivation(ComplexActivationTest.java:63)
```
</details>
A `<property>` activation on `java.specification.version` is simply inactive
when the property is missing, so the profile now uses it. The underlying issue
is that these tests depend on the root POM of whatever checkout they run in:
any `<jdk>` profile added there breaks them. Setting a root directory on the
test session, or a `.mvn` marker next to the test POMs, would isolate them;
that is out of scope here.
Verified: `mvn test -pl impl/maven-impl -Dtest=ComplexActivationTest` on
`maven-4.0.x` → 1 error with `<jdk>[27,)</jdk>`, 0 with the property activation.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]