mirror of https://github.com/apache/maven.git
[MNG-8414] Warn when not able to downgrade consumer POM unless preserveModelVersion is forced to true (#1981)
This commit is contained in:
parent
e600b09ea5
commit
5375f61a1d
|
@ -44,6 +44,8 @@ import org.apache.maven.internal.impl.InternalSession;
|
||||||
import org.apache.maven.model.v4.MavenModelVersion;
|
import org.apache.maven.model.v4.MavenModelVersion;
|
||||||
import org.apache.maven.project.MavenProject;
|
import org.apache.maven.project.MavenProject;
|
||||||
import org.eclipse.aether.RepositorySystemSession;
|
import org.eclipse.aether.RepositorySystemSession;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@Named
|
@Named
|
||||||
class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
||||||
|
@ -51,6 +53,8 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
||||||
|
|
||||||
public static final String POM_PACKAGING = "pom";
|
public static final String POM_PACKAGING = "pom";
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultConsumerPomBuilder.class);
|
||||||
|
|
||||||
private final LifecycleBindingsInjector lifecycleBindingsInjector;
|
private final LifecycleBindingsInjector lifecycleBindingsInjector;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -103,6 +107,7 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
||||||
|
|
||||||
static Model transform(Model model, MavenProject project) {
|
static Model transform(Model model, MavenProject project) {
|
||||||
String packaging = model.getPackaging();
|
String packaging = model.getPackaging();
|
||||||
|
boolean preserveModelVersion = model.isPreserveModelVersion();
|
||||||
if (POM_PACKAGING.equals(packaging)) {
|
if (POM_PACKAGING.equals(packaging)) {
|
||||||
// raw to consumer transform
|
// raw to consumer transform
|
||||||
model = model.withRoot(false).withModules(null).withSubprojects(null);
|
model = model.withRoot(false).withModules(null).withSubprojects(null);
|
||||||
|
@ -110,7 +115,7 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
||||||
model = model.withParent(model.getParent().withRelativePath(null));
|
model = model.withParent(model.getParent().withRelativePath(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!model.isPreserveModelVersion()) {
|
if (!preserveModelVersion) {
|
||||||
model = model.withPreserveModelVersion(false);
|
model = model.withPreserveModelVersion(false);
|
||||||
String modelVersion = new MavenModelVersion().getModelVersion(model);
|
String modelVersion = new MavenModelVersion().getModelVersion(model);
|
||||||
model = model.withModelVersion(modelVersion);
|
model = model.withModelVersion(modelVersion);
|
||||||
|
@ -137,6 +142,9 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
||||||
|
|
||||||
model = builder.build();
|
model = builder.build();
|
||||||
String modelVersion = new MavenModelVersion().getModelVersion(model);
|
String modelVersion = new MavenModelVersion().getModelVersion(model);
|
||||||
|
if (!ModelBuilder.MODEL_VERSION_4_0_0.equals(modelVersion) && !preserveModelVersion) {
|
||||||
|
warnNotDowngraded(project);
|
||||||
|
}
|
||||||
model = model.withModelVersion(modelVersion);
|
model = model.withModelVersion(modelVersion);
|
||||||
} else {
|
} else {
|
||||||
Model.Builder builder = prune(
|
Model.Builder builder = prune(
|
||||||
|
@ -150,11 +158,22 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
|
||||||
|
|
||||||
model = builder.build();
|
model = builder.build();
|
||||||
String modelVersion = new MavenModelVersion().getModelVersion(model);
|
String modelVersion = new MavenModelVersion().getModelVersion(model);
|
||||||
|
if (!ModelBuilder.MODEL_VERSION_4_0_0.equals(modelVersion) && !preserveModelVersion) {
|
||||||
|
warnNotDowngraded(project);
|
||||||
|
}
|
||||||
model = model.withModelVersion(modelVersion);
|
model = model.withModelVersion(modelVersion);
|
||||||
}
|
}
|
||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void warnNotDowngraded(MavenProject project) {
|
||||||
|
LOGGER.warn("The consumer POM for " + project.getId() + " cannot be downgraded to 4.0.0. "
|
||||||
|
+ "If you intent your build to be consumed with Maven 3 projects, you need to remove "
|
||||||
|
+ "the features that request a newer model version. If you're fine with having the "
|
||||||
|
+ "consumer POM not consumable with Maven 3, add the `preserve.model.version='true'` "
|
||||||
|
+ "attribute on the <project> element of your POM.");
|
||||||
|
}
|
||||||
|
|
||||||
private static List<Profile> prune(List<Profile> profiles) {
|
private static List<Profile> prune(List<Profile> profiles) {
|
||||||
return profiles.stream()
|
return profiles.stream()
|
||||||
.map(p -> {
|
.map(p -> {
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* 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.Reader;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
|
import org.apache.maven.api.model.Model;
|
||||||
|
import org.apache.maven.model.v4.MavenStaxReader;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-8414">MNG-8414</a>.
|
||||||
|
*/
|
||||||
|
class MavenITmng8414ConsumerPomWithNewFeaturesTest extends AbstractMavenIntegrationTestCase {
|
||||||
|
|
||||||
|
MavenITmng8414ConsumerPomWithNewFeaturesTest() {
|
||||||
|
super("[4.0.0-rc-2,)");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify behavior of the consumer POM when using a feature that require a newer model.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void testNotPreserving() throws Exception {
|
||||||
|
Path basedir =
|
||||||
|
extractResources("/mng-8414-consumer-pom-with-new-features").toPath();
|
||||||
|
|
||||||
|
Verifier verifier = newVerifier(basedir.toString(), null);
|
||||||
|
verifier.addCliArguments("package");
|
||||||
|
verifier.execute();
|
||||||
|
verifier.verifyErrorFreeLog();
|
||||||
|
|
||||||
|
verifier.verifyTextInLog(
|
||||||
|
"The consumer POM for org.apache.maven.its:mng-8414:jar:1.0.0-SNAPSHOT cannot be downgraded to 4.0.0.");
|
||||||
|
|
||||||
|
Path consumerPom = basedir.resolve(Paths.get(
|
||||||
|
"target",
|
||||||
|
"project-local-repo",
|
||||||
|
"org.apache.maven.its",
|
||||||
|
"mng-8414",
|
||||||
|
"1.0.0-SNAPSHOT",
|
||||||
|
"mng-8414-1.0.0-SNAPSHOT-consumer.pom"));
|
||||||
|
assertTrue(Files.exists(consumerPom));
|
||||||
|
Model consumerPomModel;
|
||||||
|
try (Reader r = Files.newBufferedReader(consumerPom)) {
|
||||||
|
consumerPomModel = new MavenStaxReader().read(r);
|
||||||
|
}
|
||||||
|
assertEquals("4.1.0", consumerPomModel.getModelVersion());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify behavior of the consumer POM when using a feature that require a newer model.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void testPreserving() throws Exception {
|
||||||
|
Path basedir =
|
||||||
|
extractResources("/mng-8414-consumer-pom-with-new-features").toPath();
|
||||||
|
|
||||||
|
Verifier verifier = newVerifier(basedir.toString(), null);
|
||||||
|
verifier.setLogFileName("log-preserving.txt");
|
||||||
|
verifier.addCliArguments("-f", "pom-preserving.xml", "package");
|
||||||
|
verifier.execute();
|
||||||
|
verifier.verifyErrorFreeLog();
|
||||||
|
|
||||||
|
verifier.verifyTextNotInLog("cannot be downgraded to 4.0.0.");
|
||||||
|
|
||||||
|
Path consumerPom = basedir.resolve(Paths.get(
|
||||||
|
"target",
|
||||||
|
"project-local-repo",
|
||||||
|
"org.apache.maven.its",
|
||||||
|
"mng-8414-preserving",
|
||||||
|
"1.0.0-SNAPSHOT",
|
||||||
|
"mng-8414-preserving-1.0.0-SNAPSHOT-consumer.pom"));
|
||||||
|
assertTrue(Files.exists(consumerPom));
|
||||||
|
Model consumerPomModel;
|
||||||
|
try (Reader r = Files.newBufferedReader(consumerPom)) {
|
||||||
|
consumerPomModel = new MavenStaxReader().read(r);
|
||||||
|
}
|
||||||
|
assertEquals("4.1.0", consumerPomModel.getModelVersion());
|
||||||
|
}
|
||||||
|
}
|
|
@ -100,6 +100,7 @@ public class TestSuiteOrdering implements ClassOrderer {
|
||||||
* the tests are to finishing. Newer tests are also more likely to fail, so this is
|
* the tests are to finishing. Newer tests are also more likely to fail, so this is
|
||||||
* a fail fast technique as well.
|
* a fail fast technique as well.
|
||||||
*/
|
*/
|
||||||
|
suite.addTestSuite(MavenITmng8414ConsumerPomWithNewFeaturesTest.class);
|
||||||
suite.addTestSuite(MavenITmng8245BeforePhaseCliTest.class);
|
suite.addTestSuite(MavenITmng8245BeforePhaseCliTest.class);
|
||||||
suite.addTestSuite(MavenITmng8244PhaseAllTest.class);
|
suite.addTestSuite(MavenITmng8244PhaseAllTest.class);
|
||||||
suite.addTestSuite(MavenITmng8421MavenEncryptionTest.class);
|
suite.addTestSuite(MavenITmng8421MavenEncryptionTest.class);
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.1.0 https://maven.apache.org/xsd/maven-4.1.0.xsd"
|
||||||
|
root="true" preserve.model.version="true">
|
||||||
|
|
||||||
|
<groupId>org.apache.maven.its</groupId>
|
||||||
|
<artifactId>mng-8414-preserving</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>my-profile</id>
|
||||||
|
<activation>
|
||||||
|
<condition>true</condition>
|
||||||
|
</activation>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" root="true" xsi:schemaLocation="http://maven.apache.org/POM/4.1.0 https://maven.apache.org/xsd/maven-4.1.0.xsd">
|
||||||
|
|
||||||
|
<groupId>org.apache.maven.its</groupId>
|
||||||
|
<artifactId>mng-8414</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>my-profile</id>
|
||||||
|
<activation>
|
||||||
|
<condition>true</condition>
|
||||||
|
</activation>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
Loading…
Reference in New Issue