Skip to content

[MNG-8286] Add a condition profile based on a simple expressions #9751

@jira-importer

Description

@jira-importer

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions