-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Description
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