Hello all

Following the recommendations in the "Guidance on Maven 4 API issue" thread, I refactored the proposal. The new commits (only 2 at this time) replace the previous ones.


   Commit 1

The first commit [1] adds the following constants in the API:

 * In Type interface: POM, JAR, CLASSPATH_JAR, MODULAR_JAR,
   JAVA_SOURCE, JAVADOC, TEST_JAR (see note below for December 14 change).
 * In DependencyProperties interface: FLAG_MODULE_PATH_CONSTITUENT,
   FLAG_PATCH_MODULE.

The isAddedToModulePath() method is no longer introduced. Instead, this commit deprecates isAddedToClasspath() methods because checking this boolean value is not sufficient for determining if a dependency should be on the classpath.

The change in the MavenProject class are only factorization for reducing code duplication and should not have behavioural impact. It is a side-effect of the previous version of JPMS support proposal, with the new methods removed.

Note: I noticed that a commit on December 14th removed the POM, JAR, etc. constants from the Type interface. So I suspect that my first commit needs to be changed, but I'm not sure how. Where those constants are supposed to be now, or has the "type" approach changed?


   Commit 2

The second commit [2] add a new "enumeration" in the API: PathType. This is actually implemented as a class for allowing extensions, but should be understood as an enumeration. The enumeration contains the following values:

 * CLASSES for the --class-path option
 * MODULES for the --module-path option
 * UPGRADE_MODULES for the --upgrade-module-path option
 * PROCESSOR_CLASSES for the --processor-path option
 * PROCESSOR_MODULES for the --processor-module-path option
 * AGENT for the -agentpath option
 * DOCLET for the -doclet option
 * TAGLET for the -tagletpath option
 * patchModule(String moduleName) for the --patch-module option

The latter is the reason why this enumeration cannot be a java.lang.Enum. Another reason is for allowing plugins to define their own enumeration values. Then, this commit add a new method in DependencyResolverResult:

   Map<PathType, List<Path>> getDispatchedPaths();

Above method is like getPaths(), but returns a distinct List<Path> for each PathType instead of a single list mixing all kinds of path. The PathType of each dependency is fully determined by the DependencyProperties, which are themselves determined by the Type (at least before the December 14th commit), except in the following cases:

 * If the type is "jar" instead of "classpath-jar" or "modular-jar",
   then an heuristic rule similar to Maven 3 is applied.
 * If the type is "test-jar", a more complex analysis is done for
   inferring the --patch-module option value.
 * The main and test output directories also needs some analysis for
   inferring which Java 9+ compiler layout is used (package hierarchy
   versus module hierarchy).

Finally, this commit adds an implementation of above methods. In the DefaultDependencyResolver class, the DefaultDependencyResolverResult inner class has been extracted as a top-level class for making room for more development. Then the resolve(DependencyResolverRequest) has been refactored, but this refactoring should not change the way that the existing `dependencies` and `paths` collections were populated. Then new codes were added for populating the above-cited `dispatchedPath` map.

This is not yet tested, but before working on tests and would like to know what need to be changed (I suspect some changes will be needed, e.g. regarding Type constants).

    Thanks,

        Martin


[1]https://github.com/Geomatys/maven/commit/d05c51bd0f5fa5610b744ef66f159128303a67d7
[2]https://github.com/Geomatys/maven/commit/322dffddeb18d7acaea4a3670966dd5f8aeb4add

Reply via email to