Uploaded image for project: 'Maven'
  1. Maven
  2. MNG-8015

Control the type of path where each dependency can be placed

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.0.0-alpha-12
    • 4.0.0-alpha-13
    • Core
    • None

    Description

      Make possible to declare where each dependency can be placed: on the module-path, class-path, agent path, doclet path, taglet path, annotation processing path, etc. The proposed improvement consists in adding a new PATH_TYPES property that can be associated to dependencies. The property value is an array of PathType, a new enumeration-like class with values such as CLASSES, MODULES, DOCLET, etc. Contrarily to real Java enumerations, this enumeration-like class is extensible: plugins can add their own enumeration values. This is required at least for the --patch-module option, where a new PathType enumeration value need to be created for each module to patch.

      Users can control indirectly the PathType of a dependency by specifying the dependency type. Note that there is no direct mapping between the dependency type and where the dependency will be placed, but only an indirect mapping caused by the fact that using a dependency type implies implicit values of some properties such as classifier, and (with this proposal) path types:

      • <type>jar</type> implies PathType.CLASSES and PathType.MODULES.
      • <type>modular-jar</type> implies PathType.MODULES only.
      • <type>classpath-jar</type> implies PathType.CLASSES only.
      • etc.

      When a plugin requests the paths of dependencies, the plugin specifies the types of path it is interested in. For example, a Java compiler plugin can specify that it is interested in PathType.CLASSES and PathType.MODULES, but not PathType.DOCLET. If a dependency declared that it can be placed on the class-path or the doclet-path, only the class-path is left after intersection with plugin's request. This is important for the next step.

      If, after all filtering such as above paragraph are applied, a dependency has only one PathType left, then there is no ambiguity and we are done. Combined with above-cited dependency types like modular-jar or classpath-jar, this rule allows users to control where the dependency will be placed. But if there are two or more PathType left after filtering, then a choice needs to be done. For example if there are both PathType.CLASSES and PathType.MODULES (which may happen when <type>jar</type> is used), then an heuristic rule similar to Maven 3 can be applied: check if a module-info.class file or an Automatic-Name manifest attribute is present, and base the decision on that.

      This proposal aims to fix MNG-7855.

      Attachments

        Issue Links

          Activity

            People

              gnodet Guillaume Nodet
              desruisseaux Martin Desruisseaux
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: