Guillaume Nodet opened MNG-8286 and commented
GitHub Pull Request: #1771
Condition-Based Profile Activation in Maven
In addition to the traditional activation mechanisms (JDK version, OS properties, file existence, etc.), Maven now supports a powerful condition-based activation through the condition field. This new mechanism allows for more flexible and expressive profile activation rules.
Condition Syntax
The condition is specified as a string expression that can include various functions, comparisons, and logical operators.
Some key features include:
Property access: {}${property.name{}}
Comparison operators: {}=={}, {}!={}, {}<{}, {}>{}, {}<={}, >=
Logical operators: && (AND), || (OR), not(...)
Functions: {}exists(...){}, {}missing(...){}, {}matches(...){}, {}inrange(...){}, and more
Supported Functions
The following functions are supported in condition expressions:
{}length(string){}: Returns the length of the given string.
{}upper(string){}: Converts the string to uppercase.
{}lower(string){}: Converts the string to lowercase.
{}substring(string, start, [end]){}: Returns a substring of the given string.
{}indexOf(string, substring){}: Returns the index of the first occurrence of substring in string, or -1 if not found.
{}contains(string, substring){}: Checks if the string contains the substring.
{}matches(string, regex){}: Checks if the string matches the given regular expression.
{}not(condition){}: Negates the given condition.
{}if(condition, trueValue, falseValue){}: Returns trueValue if the condition is true, falseValue otherwise.
{}exists(path){}: Checks if a file matching the given glob pattern exists.
{}missing(path){}: Checks if a file matching the given glob pattern does not exist.
{}inrange(version, range){}: Checks if the given version is within the specified version range.
Supported properties
The following properties are supported in expressions:
{}project.basedir{}: The project directory
{}project.rootDirectory{}: The root directory of the project
{}project.artifactId{}: The artifactId of the project
{}project.packaging{}: The packaging of the project
- user properties
- system properties (including environment variables prefixed with env.)
Examples
- JDK version range:
inrange(${java.version}, '[11,)') (JDK 11 or higher)
- OS check:
${os.name} == 'windows'
- File existence:
exists('${project.basedir}/src/** /*.xsd')
- Property check:
${my.property} != 'some-value'
- Regex matching:
matches(${os.version}, '.*aws')
- Complex condition:
${os.name} == 'windows' && ${os.arch} != 'amd64' && inrange(${os.version}, '[10,)')
- String length check:
length(${user.name}) > 5
- Substring with version:
substring(${java.version}, 0, 3) == '1.8'
- Using indexOf:
indexOf(${java.version}, '-') > 0
- Conditional logic:
if(contains(${java.version}, '-'), substring(${java.version}, 0, indexOf(${java.version}, '-')), ${java.version})
This flexible condition mechanism allows for more precise control over profile activation, enabling developers to create profiles that respond to a wide range of environmental factors and project states.
This will be triggered using a new profile activation in the 4.1.0 model:
<profile>
<activation>
<condition>inrange(${maven.version}, '[4,)')</condition>
</activation>
</profile>
This issue is a sub-task of MNG-8292
Issue Links:
- MNG-8124 Allow regex usage in any profile activation key/value
("fixes")
- MNG-3328 Allow multiple profile activation properties
("contains")
- MNG-7577 Ability to activate profile based on multiple property values
("contains")
- MNG-5909 Activating a profile based on the existence of multiple files is not possible
Remote Links:
Backported to: 4.0.0-rc-1
Guillaume Nodet opened MNG-8286 and commented
GitHub Pull Request: #1771
Condition-Based Profile Activation in Maven
In addition to the traditional activation mechanisms (JDK version, OS properties, file existence, etc.), Maven now supports a powerful condition-based activation through the condition field. This new mechanism allows for more flexible and expressive profile activation rules.
Condition Syntax
The condition is specified as a string expression that can include various functions, comparisons, and logical operators.
Some key features include:
Property access:
{}${property.name{}}Comparison operators:
{}=={},{}!={},{}<{},{}>{},{}<={},>=Logical operators:
&&(AND),||(OR),not(...)Functions:
{}exists(...){},{}missing(...){},{}matches(...){},{}inrange(...){}, and moreSupported Functions
The following functions are supported in condition expressions:
{}length(string){}: Returns the length of the given string.{}upper(string){}: Converts the string to uppercase.{}lower(string){}: Converts the string to lowercase.{}substring(string, start, [end]){}: Returns a substring of the given string.{}indexOf(string, substring){}: Returns the index of the first occurrence of substring in string, or -1 if not found.{}contains(string, substring){}: Checks if the string contains the substring.{}matches(string, regex){}: Checks if the string matches the given regular expression.{}not(condition){}: Negates the given condition.{}if(condition, trueValue, falseValue){}: Returns trueValue if the condition is true, falseValue otherwise.{}exists(path){}: Checks if a file matching the given glob pattern exists.{}missing(path){}: Checks if a file matching the given glob pattern does not exist.{}inrange(version, range){}: Checks if the given version is within the specified version range.Supported properties
The following properties are supported in expressions:
{}project.basedir{}: The project directory{}project.rootDirectory{}: The root directory of the project{}project.artifactId{}: The artifactId of the project{}project.packaging{}: The packaging of the projectExamples
inrange(${java.version}, '[11,)')(JDK 11 or higher)${os.name} == 'windows'exists('${project.basedir}/src/** /*.xsd')${my.property} != 'some-value'matches(${os.version}, '.*aws')${os.name} == 'windows' && ${os.arch} != 'amd64' && inrange(${os.version}, '[10,)')length(${user.name}) > 5substring(${java.version}, 0, 3) == '1.8'indexOf(${java.version}, '-') > 0if(contains(${java.version}, '-'), substring(${java.version}, 0, indexOf(${java.version}, '-')), ${java.version})This flexible condition mechanism allows for more precise control over profile activation, enabling developers to create profiles that respond to a wide range of environmental factors and project states.
This will be triggered using a new profile activation in the 4.1.0 model:
This issue is a sub-task of MNG-8292
Issue Links:
("fixes")
("contains")
("contains")
Remote Links:
Backported to: 4.0.0-rc-1