mirror of https://github.com/apache/maven.git
[MNG-2199] Support version ranges in parent elements
o Updated the ITs to correctly detect parent resolution failures. Maven does not fail the build when it cannot resolve a parent but instead logs a warning message. The ITs never checked the log to contain the warning messages but instead asserted the build to fail when a parent cannot be resolved. The only Maven version supporting parent version ranges is Maven 3.2.2 due to this. o Removed an incorrect test case for local parent resolution. Maven ignored the '<version>' in '<parent>' elements for local parent resolution. The core has been updated across various versions to eliminate any differences between local and remote parent resolution. When local parent resolution had been updated to match remote parent resolution, an existing IT started to fail testing incorrect behaviour. As soon as the '<parent>' is referenced using a version range, the '<version>' element in the project becomes mandatory and does no longer support using an expression any more. This has been that way for remote parent resolution from day one. It has never been supported to inherit a version from a parent when referencing that parent using a version range intentionally. o Updated to account for updated error messages.
This commit is contained in:
parent
812069740e
commit
aa4e06da1f
|
@ -32,8 +32,11 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
public void testValidParentVersionRangeWithInclusiveUpperBound()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "(3.2.2,3.5.0)" );
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-2199-parent-version-range/valid-inclusive-upper-bound" );
|
||||
File testDir =
|
||||
ResourceExtractor.simpleExtractResources( getClass(),
|
||||
"/mng-2199-parent-version-range/valid-inclusive-upper-bound" );
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -43,18 +46,31 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
|
||||
verifier.executeGoal( "verify" );
|
||||
verifier.verifyErrorFreeLog();
|
||||
|
||||
// All Maven versions not supporting remote parent version ranges will log a warning message whenever
|
||||
// building a parent fails. The build succeeds without any parent. If that warning message appears in the
|
||||
// log, parent resolution failed.
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
assertFalse( "Unxpected error message found.",
|
||||
indexOf( lines, ".*Failed to build parent project.*" ) >= 0 );
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifier.resetStreams();
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testValidParentVersionRangeWithExclusiveUpperBound()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "(3.2.2,3.5.0)" );
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-2199-parent-version-range/valid-exclusive-upper-bound" );
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/valid-exclusive-upper-bound" );
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -64,14 +80,25 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
|
||||
verifier.executeGoal( "verify" );
|
||||
verifier.verifyErrorFreeLog();
|
||||
|
||||
// All Maven versions not supporting remote parent version ranges will log a warning message whenever
|
||||
// building a parent fails. The build succeeds without any parent. If that warning message appears in the
|
||||
// log, parent resolution failed.
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
assertFalse( "Unxpected error message found.",
|
||||
indexOf( lines, ".*Failed to build parent project.*" ) >= 0 );
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifier.resetStreams();
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testInvalidParentVersionRange()
|
||||
public void testInvalidParentVersionRangeWithoutUpperBound()
|
||||
throws Exception
|
||||
{
|
||||
Verifier verifier = null;
|
||||
|
@ -87,13 +114,18 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
}
|
||||
catch ( final VerificationException e )
|
||||
{
|
||||
assertNotNull( verifier );
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
int msg = indexOf( lines, ".*The requested version range.*does not specify an upper bound.*" );
|
||||
assertTrue( "Expected error message not found.", msg >= 0 );
|
||||
assertTrue( "Expected error message not found.",
|
||||
indexOf( lines, ".*(parent)? version range.*does not specify an upper bound.*" ) >= 0 );
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifier.resetStreams();
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,8 +133,8 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
throws Exception
|
||||
{
|
||||
Verifier verifier = null;
|
||||
File testDir =
|
||||
ResourceExtractor.simpleExtractResources( getClass(), "/mng-2199-parent-version-range/expression" );
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/expression" );
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -114,16 +146,17 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
}
|
||||
catch ( final VerificationException e )
|
||||
{
|
||||
assertNotNull( verifier );
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
int msg =
|
||||
indexOf( lines,
|
||||
".*Version must be a constant @ org.apache.maven.its.mng2199:expression:\\$\\{project.parent.version\\}.*" );
|
||||
|
||||
int msg = indexOf( lines, ".*Version must be a constant.*org.apache.maven.its.mng2199:expression.*" );
|
||||
assertTrue( "Expected error message not found.", msg >= 0 );
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifier.resetStreams();
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -131,8 +164,8 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
throws Exception
|
||||
{
|
||||
Verifier verifier = null;
|
||||
File testDir =
|
||||
ResourceExtractor.simpleExtractResources( getClass(), "/mng-2199-parent-version-range/inherited" );
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/inherited" );
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -144,37 +177,175 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
}
|
||||
catch ( final VerificationException e )
|
||||
{
|
||||
assertNotNull( verifier );
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
int msg =
|
||||
indexOf( lines,
|
||||
".*Version must be a constant @ org.apache.maven.its.mng2199:inherited:\\[unknown-version\\].*" );
|
||||
|
||||
int msg = indexOf( lines, ".*Version must be a constant.*org.apache.maven.its.mng2199:inherited.*" );
|
||||
assertTrue( "Expected error message not found.", msg >= 0 );
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifier.resetStreams();
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testValidLocalParentVersionRange()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "(,3.3.0),(3.3.9,3.5.0)" );
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-2199-parent-version-range/local-parent" );
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/valid-local/child" );
|
||||
|
||||
try
|
||||
{
|
||||
verifier = newVerifier( testDir.getAbsolutePath() );
|
||||
verifier.executeGoal( "verify" );
|
||||
verifier.verifyErrorFreeLog();
|
||||
|
||||
// All Maven versions not supporting remote parent version ranges will log a warning message whenever
|
||||
// building a parent fails. The build succeeds without any parent. If that warning message appears in the
|
||||
// log, parent resolution failed. For this test, this really just tests the project on disk getting tested
|
||||
// is not corrupt. It's expected to find the local parent and not fall back to remote resolution. If it
|
||||
// falls back to remote resolution, this just catches the test project to be broken.
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
assertFalse( "Unxpected error message found.",
|
||||
indexOf( lines, ".*Failed to build parent project.*" ) >= 0 );
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testInvalidLocalParentVersionRange()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "[3.3.0,3.3.9)" );
|
||||
// Fallback to remote resolution not tested here. Remote parent expected to not be available anywhere.
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/invalid-local/child" );
|
||||
|
||||
try
|
||||
{
|
||||
verifier = newVerifier( testDir.getAbsolutePath() );
|
||||
verifier.executeGoal( "verify" );
|
||||
fail( "Expected 'VerificationException' not thrown." );
|
||||
}
|
||||
catch ( final VerificationException e )
|
||||
{
|
||||
assertNotNull( verifier );
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
int msg = indexOf( lines,
|
||||
".*Non-resolvable parent POM org.apache.maven.its.mng2199:local-parent:\\[2,3\\].*" );
|
||||
assertTrue( "Expected error message not found.", msg >= 0 );
|
||||
}
|
||||
finally
|
||||
{
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testInvalidLocalParentVersionRangeFallingBackToRemote()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "[3.3.9]" );
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/local-fallback-to-remote/child" );
|
||||
|
||||
try
|
||||
{
|
||||
verifier = newVerifier( testDir.getAbsolutePath(), "remote" );
|
||||
verifier.addCliOption( "-U" );
|
||||
verifier.setAutoclean( false );
|
||||
|
||||
verifier.executeGoal( "verify" );
|
||||
verifier.verifyErrorFreeLog();
|
||||
|
||||
// All Maven versions not supporting remote parent version ranges will log a warning message whenever
|
||||
// building a parent fails. The build succeeds without any parent. If that warning message appears in the
|
||||
// log, parent resolution failed. For this test, local parent resolution falls back to remote parent
|
||||
// resolution with a version range in use. If the warning message is in the logs, that remote parent
|
||||
// resolution failed unexpectedly.
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
assertFalse( "Unxpected error message found.",
|
||||
indexOf( lines, ".*Failed to build parent project.*" ) >= 0 );
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
verifier.resetStreams();
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testValidLocalParentVersionRangeInvalidVersionExpression()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "(,3.5.0)" );
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/expression-local/child" );
|
||||
|
||||
try
|
||||
{
|
||||
verifier = newVerifier( testDir.getAbsolutePath() );
|
||||
verifier.executeGoal( "verify" );
|
||||
fail( "Expected 'VerificationException' not thrown." );
|
||||
}
|
||||
catch ( final VerificationException e )
|
||||
{
|
||||
assertNotNull( verifier );
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
int msg = indexOf( lines, ".*Version must be a constant.*org.apache.maven.its.mng2199:expression.*" );
|
||||
assertTrue( "Expected error message not found.", msg >= 0 );
|
||||
}
|
||||
finally
|
||||
{
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testValidLocalParentVersionRangeInvalidVersionInheritance()
|
||||
throws Exception
|
||||
{
|
||||
failingMavenVersions( "(,3.5.0)" );
|
||||
Verifier verifier = null;
|
||||
File testDir = ResourceExtractor.simpleExtractResources(
|
||||
getClass(), "/mng-2199-parent-version-range/inherited-local/child" );
|
||||
|
||||
try
|
||||
{
|
||||
verifier = newVerifier( testDir.getAbsolutePath() );
|
||||
verifier.executeGoal( "verify" );
|
||||
fail( "Expected 'VerificationException' not thrown." );
|
||||
}
|
||||
catch ( final VerificationException e )
|
||||
{
|
||||
assertNotNull( verifier );
|
||||
final List<String> lines = verifier.loadFile( new File( testDir, "log.txt" ), false );
|
||||
int msg = indexOf( lines, ".*Version must be a constant.*org.apache.maven.its.mng2199:inherited.*" );
|
||||
assertTrue( "Expected error message not found.", msg >= 0 );
|
||||
}
|
||||
finally
|
||||
{
|
||||
if ( verifier != null )
|
||||
{
|
||||
verifier.resetStreams();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -192,4 +363,5 @@ public class MavenITmng2199ParentVersionRangeTest
|
|||
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<parent>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>[1,2]</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>expression</artifactId>
|
||||
<!-- Must not use expressions, when using version ranges. -->
|
||||
<version>${project.parent.version}</version>
|
||||
</project>
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>1</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Maven Integration Test :: MNG-2199 :: Invalid Local Version Expression</name>
|
||||
<description>Verifies that the build fails when using a parent version range in combination with a version expression for local parent resolution.</description>
|
||||
</project>
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<parent>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>[1,2]</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>inherited</artifactId>
|
||||
<!-- Must not inherit version, when using version ranges. -->
|
||||
</project>
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>1</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Maven Integration Test :: MNG-2199 :: Invalid Local Version Inheritance</name>
|
||||
<description>Verifies that the build fails when using a parent version range in combination with an inherited version.</description>
|
||||
</project>
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<parent>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<!-- Not available anywhere. Not on disk, not in repository. -->
|
||||
<version>[2,3]</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>invalid</artifactId>
|
||||
<version>1</version>
|
||||
</project>
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>1</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Maven Integration Test :: MNG-2199 :: Invalid Local Parent Version</name>
|
||||
<description>Verifies that the build fails when using a parent version range not matching what is on disk (fallback to remote is not tested here - the parent does not exist anywhere but on disk).</description>
|
||||
</project>
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.apache</groupId>
|
||||
<artifactId>apache</artifactId>
|
||||
<!-- Not found on disk, but available remotely. -->
|
||||
<version>[1,15)</version>
|
||||
</parent>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>valid</artifactId>
|
||||
<version>1</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>Maven Integration Test :: MNG-2199 :: Valid POM</name>
|
||||
<description>Verifies that the build succeeds by falling back to remote parent resolution when the local parent does not mach the range.</description>
|
||||
</project>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache</groupId>
|
||||
<artifactId>apache</artifactId>
|
||||
<version>DOES NOT EXIST</version>
|
||||
<packaging>pom</packaging>
|
||||
</project>
|
|
@ -1,16 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>1.1</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<name>Maven Integration Test :: MNG-2199 :: Local Parent POM</name>
|
||||
<description>Verifies that the build succeeds when using a valid parent version range that matches local parent.</description>
|
||||
|
||||
<modules>
|
||||
<module>module</module>
|
||||
</modules>
|
||||
</project>
|
|
@ -1,13 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>[1.0,2)</version>
|
||||
<version>[1,2]</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>local-parent-module</artifactId>
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>valid</artifactId>
|
||||
<version>3.4.5</version>
|
||||
</project>
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.apache.maven.its.mng2199</groupId>
|
||||
<artifactId>local-parent</artifactId>
|
||||
<version>1</version>
|
||||
<packaging>pom</packaging>
|
||||
<name>Maven Integration Test :: MNG-2199 :: Valid Local Parent Version Range</name>
|
||||
<description>Verifies that the build succeeds when using a parent version range for local parent resolution.</description>
|
||||
</project>
|
Loading…
Reference in New Issue