Martin Desruisseaux created MNG-8015:
----------------------------------------

             Summary: Control the type of path where each dependency can be 
placed
                 Key: MNG-8015
                 URL: https://issues.apache.org/jira/browse/MNG-8015
             Project: Maven
          Issue Type: Improvement
          Components: Core
    Affects Versions: 4.0.0-alpha-12
            Reporter: Martin Desruisseaux


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.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to