diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index 350031c7703b..6648ffc9d8de 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -432,9 +432,17 @@ private Map getPropertiesFromRequestedProfiles(MavenExecutionReq HashSet activeProfileId = new HashSet<>(request.getProfileActivation().getRequiredActiveProfileIds()); activeProfileId.addAll(request.getProfileActivation().getOptionalActiveProfileIds()); + // Profiles explicitly deactivated via -P !id must be excluded even if they + // declare activeByDefault=true. + HashSet inactiveProfileId = + new HashSet<>(request.getProfileActivation().getRequiredInactiveProfileIds()); + inactiveProfileId.addAll(request.getProfileActivation().getOptionalInactiveProfileIds()); return request.getProfiles().stream() - .filter(profile -> activeProfileId.contains(profile.getId())) + .filter(profile -> activeProfileId.contains(profile.getId()) + || (!inactiveProfileId.contains(profile.getId()) + && profile.getActivation() != null + && profile.getActivation().isActiveByDefault())) .map(ModelBase::getProperties) .flatMap(properties -> properties.entrySet().stream()) .filter(e -> e.getValue() != null) diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh12288SettingsProfileAetherPropertiesTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh12288SettingsProfileAetherPropertiesTest.java new file mode 100644 index 000000000000..d3abfa3032e8 --- /dev/null +++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh12288SettingsProfileAetherPropertiesTest.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.maven.it; + +import java.io.File; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Integration tests proving that {@code aether.*} properties declared in the + * {@code } block of a {@code settings.xml} profile are honored + * by the resolver at local repository manager initialization, regardless of + * which settings.xml-only activation channel was used. + * + *

Two activation channels are covered: + *

    + *
  • {@code true} + * on the profile itself;
  • + *
  • {@code ...} + * at the top of {@code settings.xml}.
  • + *
+ * + *

In both cases the same profile sets: + *

+ *   aether.enhancedLocalRepository.split       = true
+ *   aether.enhancedLocalRepository.localPrefix = it-custom-prefix
+ * 
+ * and the test asserts that {@code mvn install} writes the installed pom + * under {@code /it-custom-prefix/<groupId-path>/...} rather + * than the flat or default-split layout. + * + *

The same properties on the same profile work correctly when the + * profile is activated via {@code -P } on the CLI; only the + * settings.xml activation channels fail, which is what these tests guard + * against. + */ +public class MavenITgh12288SettingsProfileAetherPropertiesTest extends AbstractMavenIntegrationTestCase { + + MavenITgh12288SettingsProfileAetherPropertiesTest() { + super("(4.0.0-rc-5,)"); + } + + @Test + public void testActiveByDefaultProfile() throws Exception { + runAndAssertCustomPrefix("settings-active-by-default.xml"); + } + + @Test + public void testActiveProfilesList() throws Exception { + runAndAssertCustomPrefix("settings-active-profiles-list.xml"); + } + + private void runAndAssertCustomPrefix(String settingsFile) throws Exception { + File testDir = extractResources("/settings-profile-aether-properties"); + + Verifier verifier = newVerifier(testDir.getAbsolutePath()); + verifier.setAutoclean(false); + verifier.deleteDirectory("target"); + verifier.deleteArtifacts("org.apache.maven.its.settings.profile.aether"); + + verifier.addCliArgument("--settings"); + verifier.addCliArgument(settingsFile); + verifier.addCliArgument("install"); + verifier.execute(); + verifier.verifyErrorFreeLog(); + + File localRepo = new File(verifier.getLocalRepository()); + String gavRelativePath = "org/apache/maven/its/settings/profile/aether/test-artifact/1.0/test-artifact-1.0.pom"; + + File expectedAtCustomPrefix = new File(localRepo, "it-custom-prefix/" + gavRelativePath); + File flatLayout = new File(localRepo, gavRelativePath); + File defaultSplitPrefix = new File(localRepo, "installed/" + gavRelativePath); + + assertTrue( + expectedAtCustomPrefix.exists(), + "Expected install to use custom localPrefix 'it-custom-prefix' from " + + settingsFile + + ", but artifact not found at " + + expectedAtCustomPrefix); + + assertFalse( + flatLayout.exists(), + "Found artifact at flat layout " + + flatLayout + + " — indicates the settings.xml profile properties did not reach the resolver" + + " session config in time for LRM init."); + + assertFalse( + defaultSplitPrefix.exists(), + "Found artifact at default split-LRM prefix " + + defaultSplitPrefix + + " — indicates split=true was honored but localPrefix was silently dropped."); + } +} diff --git a/its/core-it-suite/src/test/resources/settings-profile-aether-properties/pom.xml b/its/core-it-suite/src/test/resources/settings-profile-aether-properties/pom.xml new file mode 100644 index 000000000000..4e3e07381b5e --- /dev/null +++ b/its/core-it-suite/src/test/resources/settings-profile-aether-properties/pom.xml @@ -0,0 +1,34 @@ + + + + 4.0.0 + + org.apache.maven.its.settings.profile.aether + test-artifact + 1.0 + pom + + Maven Integration Test :: Settings Profile Aether Properties + + Minimal project for proving that aether.enhancedLocalRepository.* + properties set in an active-by-default settings.xml profile are honored + by the resolver at local repository manager initialization. + + diff --git a/its/core-it-suite/src/test/resources/settings-profile-aether-properties/settings-active-by-default.xml b/its/core-it-suite/src/test/resources/settings-profile-aether-properties/settings-active-by-default.xml new file mode 100644 index 000000000000..455bcccde2db --- /dev/null +++ b/its/core-it-suite/src/test/resources/settings-profile-aether-properties/settings-active-by-default.xml @@ -0,0 +1,33 @@ + + + + + + aether-split-via-settings + + true + + + true + it-custom-prefix + + + + diff --git a/its/core-it-suite/src/test/resources/settings-profile-aether-properties/settings-active-profiles-list.xml b/its/core-it-suite/src/test/resources/settings-profile-aether-properties/settings-active-profiles-list.xml new file mode 100644 index 000000000000..c40eccb58c0d --- /dev/null +++ b/its/core-it-suite/src/test/resources/settings-profile-aether-properties/settings-active-profiles-list.xml @@ -0,0 +1,33 @@ + + + + + aether-split-via-settings + + + + aether-split-via-settings + + true + it-custom-prefix + + + +