Uploaded image for project: 'Maven'
  1. Maven
  2. MNG-8292 Rework profile activation
  3. MNG-8286

Add a condition profile based on a simple expressions

    XMLWordPrintableJSON

Details

    • Sub-task
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 4.0.0-rc-1
    • Profiles
    • None

    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

          Activity

            People

              gnodet Guillaume Nodet
              gnodet Guillaume Nodet
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: