Description
GitHub Pull Request: https://github.com/apache/maven/pull/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>
Attachments
Issue Links
- contains
-
MNG-3328 Allow multiple profile activation properties
- Closed
-
MNG-7577 Ability to activate profile based on multiple property values
- Closed
- fixes
-
MNG-8124 Allow regex usage in any profile activation key/value
- Closed
- relates to
-
MNG-5909 Activating a profile based on the existence of multiple files is not possible
- Closed