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]

Reply via email to