You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by GitBox <gi...@apache.org> on 2022/11/15 12:57:53 UTC

[GitHub] [maven-site] elharo commented on a diff in pull request #338: [MNG-5771] Document all classloaders used in Maven

elharo commented on code in PR #338:
URL: https://github.com/apache/maven-site/pull/338#discussion_r1022745807


##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we

Review Comment:
   "with which we
    create our" --> to create the



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:

Review Comment:
   why are we talking about ant? Please delete this.



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR

Review Comment:
   comma after directory



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 
- to the Maven core and all plugins for the current project and subsequent projects (in future, we
- plan to remove it from subsequent projects).
+ to the Maven core and all plugins for the current project (through the API classloader).
+ More information available in {{{./guide-using-extensions.html}Core Extension}}.
+
+* {API Classloader}
+
+ This exposes a filtered view of the Core Classloader by only exposing the exported packages from all Core Extensions.
+ The main API is listed in {{{https://maven.apache.org/ref/3-LATEST/maven-core/core-extensions.html}Maven Core Extensions Reference}}.
+ 
+ This has been introduced with Maven 3.3.1 ({{{https://issues.apache.org/jira/browse/MNG-5771}MNG-5771}}).
+
+* {Build Extension Classloaders}
 
-  
-* 3. {Plugin Classloaders}
+[../../buildExtensionClassRealm.svg] Build Extension Class Realm
 
- After that, each plugin has its own classloader that is a child of Maven's core classloader. 
- The classes in this classloader are taken from the dependencies in the plugin's dependency list.
+ For every plugin which is marked with <<<\<extensions\>true\</extensions\>>>> or a build extension listed in the according section of the POM there is

Review Comment:
   comma after POM



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 
- to the Maven core and all plugins for the current project and subsequent projects (in future, we
- plan to remove it from subsequent projects).
+ to the Maven core and all plugins for the current project (through the API classloader).
+ More information available in {{{./guide-using-extensions.html}Core Extension}}.
+
+* {API Classloader}
+
+ This exposes a filtered view of the Core Classloader by only exposing the exported packages from all Core Extensions.
+ The main API is listed in {{{https://maven.apache.org/ref/3-LATEST/maven-core/core-extensions.html}Maven Core Extensions Reference}}.
+ 
+ This has been introduced with Maven 3.3.1 ({{{https://issues.apache.org/jira/browse/MNG-5771}MNG-5771}}).
+
+* {Build Extension Classloaders}
 
-  
-* 3. {Plugin Classloaders}
+[../../buildExtensionClassRealm.svg] Build Extension Class Realm
 
- After that, each plugin has its own classloader that is a child of Maven's core classloader. 
- The classes in this classloader are taken from the dependencies in the plugin's dependency list.
+ For every plugin which is marked with <<<\<extensions\>true\</extensions\>>>> or a build extension listed in the according section of the POM there is
+ a dedicated classloader. Those are isolated (i.e. one build extension does not have access to other build extensions).

Review Comment:
   Those are isolated (i.e. -->
   
   Those are isolated. That is,



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -118,7 +152,7 @@ Guide to Maven Classloading
  When a build plugin is executed, the thread's context classloader is set to the plugin classloader.
 
 
-* 4. {Custom Classloaders}
+* {Custom Classloaders}
  
  Plugins are free to create further classloaders on their discretion. For example, a plugin might want to create a

Review Comment:
   delete "on their discretion"



##########
content/apt/guides/mini/guide-using-extensions.apt:
##########
@@ -40,10 +41,12 @@ Using Extensions
 
 * Loading Extensions
 
- There are different means of loading extensions. They can be distinguished into <<early>> and <<late>> loading behaviour. Some extensions require early loading.
- Please refer to the extension's documentation whether early loading is required.
+ There are different means of loading extensions depending on the type. There are <core extensions> which are loaded <<early>>
+ and build extensions which are loaded <<late>>.
+ Some extensions require early loading as they fundamentally change Maven behaviour.
+ Please refer to the extension's documentation whether they provide a core or a build extension.

Review Comment:
   "Please refer to the extension's documentation whether they provide a core or a build extension." --> An extension's documentation should indicate whether it provide a core or a build extension.



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 
- to the Maven core and all plugins for the current project and subsequent projects (in future, we
- plan to remove it from subsequent projects).
+ to the Maven core and all plugins for the current project (through the API classloader).
+ More information available in {{{./guide-using-extensions.html}Core Extension}}.
+
+* {API Classloader}
+
+ This exposes a filtered view of the Core Classloader by only exposing the exported packages from all Core Extensions.

Review Comment:
   This --> The API classloader
   
   only exposing the --> exposing only the



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of

Review Comment:
   , e.g. -> . For example,



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.

Review Comment:
   "The Classworlds JAR is the only element of
    the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology." is awkward. perhaps something like
   
   Classworlds uses this jar to bootstrap the other classloaders ("realms" in Classworlds terminology).
   



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 
- to the Maven core and all plugins for the current project and subsequent projects (in future, we
- plan to remove it from subsequent projects).
+ to the Maven core and all plugins for the current project (through the API classloader).
+ More information available in {{{./guide-using-extensions.html}Core Extension}}.

Review Comment:
   is available



##########
content/apt/guides/mini/guide-using-extensions.apt:
##########
@@ -28,7 +28,8 @@
 
 Using Extensions
 
- Extensions are a way to add classes to {{{./guide-maven-classloading.html#Core_Classloader}Core Classloader}}.
+ Extensions are a way to add classes to either the {{{./guide-maven-classloading.html#Core_Classloader}Core Classloader}} (Core Extensions) 
+ or the {{{./guide-maven-classloading.html#Project_Classloaders}Project Classloader}} (Build Extensions).
  This is necessary for adjusting Maven in a way that affects more than just one plug-in.
 
  The mechanism allows to either replace default {{{https://www.eclipse.org/sisu/}Sisu components}} with custom ones or add

Review Comment:
   allows who?



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 

Review Comment:
   delete only, lower case plugins



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 

Review Comment:
   place is unclear. Is this a classpath?



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 
- to the Maven core and all plugins for the current project and subsequent projects (in future, we
- plan to remove it from subsequent projects).
+ to the Maven core and all plugins for the current project (through the API classloader).
+ More information available in {{{./guide-using-extensions.html}Core Extension}}.
+
+* {API Classloader}
+
+ This exposes a filtered view of the Core Classloader by only exposing the exported packages from all Core Extensions.
+ The main API is listed in {{{https://maven.apache.org/ref/3-LATEST/maven-core/core-extensions.html}Maven Core Extensions Reference}}.
+ 
+ This has been introduced with Maven 3.3.1 ({{{https://issues.apache.org/jira/browse/MNG-5771}MNG-5771}}).
+
+* {Build Extension Classloaders}
 
-  
-* 3. {Plugin Classloaders}
+[../../buildExtensionClassRealm.svg] Build Extension Class Realm
 
- After that, each plugin has its own classloader that is a child of Maven's core classloader. 
- The classes in this classloader are taken from the dependencies in the plugin's dependency list.
+ For every plugin which is marked with <<<\<extensions\>true\</extensions\>>>> or a build extension listed in the according section of the POM there is
+ a dedicated classloader. Those are isolated (i.e. one build extension does not have access to other build extensions).
+ It imports everything from API classloader.

Review Comment:
   the API



##########
content/apt/guides/mini/guide-maven-classloading.apt:
##########
@@ -30,55 +30,89 @@
 Guide to Maven Classloading
 
  This is a description of the classloader hierarchy in Maven.
- 
+
+%{toc|section=1|fromDepth=2}
+
 * Overview
 
- * System Classloader
+ Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
+ create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
+ which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
+ the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
  
- * Core Classloader
+ Each realm exposes
  
- * Plugin Classloaders
+ [[1]] optionally some classes imported from 0..n other classloaders
  
- * Custom Classloaders
-
- [] 
+ [[2]] optionally some classes from a directory or JAR
+ 
+ [[3]] one parent classloader
  
+ []
  
-* 1. {System Classloader}
+ The search order is always as given above.
 
- Maven uses the {{{https://codehaus-plexus.github.io/plexus-classworlds/}Plexus Classworlds}} classloading framework with which we
- create our classloader graph. If you look in your <<<$\{maven.home\}/boot>>> directory you will see a single JAR
- which is the Classworlds JAR we use to boot the classloader graph. The Classworlds JAR is the only element of
- the Java <<<CLASSPATH>>> and Classworlds then builds the other classloaders or realms in Classworlds terminology.
+* {Platform Classloader}
+
+ This is the classloader exposing all JRE classes.
+
+* {System Classloader}
  
- An Ant script like this will show the contents of the system classloader:
+ An Ant script like this will show the contents of the system/bootstrap classloader:
  
 +---+
     <target name="info">
       <echo>java.class.path=${java.class.path}</echo>
     </target>
 +---+
 
+ It imports the platform classloader.
 
-* 2. {Core Classloader}
+* {Core Classloader}
  
- The second classloader down the graph contains the core requirements of Maven. More precisely, the core classloader
- has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
+ The second classloader down the graph contains the core requirements of Maven. <<It is only used by Maven internally but not by Plugins>>. 
+ The core classloader has the libraries in <<<$\{maven.home\}/lib>>>. In general these are just Maven libraries, e.g. instances of
  <<<{{{/ref/current/apidocs/org/apache/maven/project/MavenProject.html}MavenProject}}>>>
  belong to this classloader.
- We hope to further separate these in the future to just be Maven APIs and have 
- the implementations selected at runtime as required by the system.
  
  You can add elements to this classloader by {{{/ref/current/maven-model/maven.html#class_extension}extensions}}. 
  These are loaded into the same place as <<<$\{maven.home\}/lib>>> and hence are available 
- to the Maven core and all plugins for the current project and subsequent projects (in future, we
- plan to remove it from subsequent projects).
+ to the Maven core and all plugins for the current project (through the API classloader).
+ More information available in {{{./guide-using-extensions.html}Core Extension}}.
+
+* {API Classloader}
+
+ This exposes a filtered view of the Core Classloader by only exposing the exported packages from all Core Extensions.
+ The main API is listed in {{{https://maven.apache.org/ref/3-LATEST/maven-core/core-extensions.html}Maven Core Extensions Reference}}.
+ 
+ This has been introduced with Maven 3.3.1 ({{{https://issues.apache.org/jira/browse/MNG-5771}MNG-5771}}).
+
+* {Build Extension Classloaders}
 
-  
-* 3. {Plugin Classloaders}
+[../../buildExtensionClassRealm.svg] Build Extension Class Realm
 
- After that, each plugin has its own classloader that is a child of Maven's core classloader. 
- The classes in this classloader are taken from the dependencies in the plugin's dependency list.
+ For every plugin which is marked with <<<\<extensions\>true\</extensions\>>>> or a build extension listed in the according section of the POM there is
+ a dedicated classloader. Those are isolated (i.e. one build extension does not have access to other build extensions).
+ It imports everything from API classloader.
+ All JSR 330 or Plexus components declared in the underlying JAR are registered as components in the global Plexus container
+ while creating the classloader.
+ In addition all component references in the plugin descriptor are properly wired from the underlying Plexus container.
+ Build extensions have limited effect as they are loaded late.
+
+* {Project Classloaders}
+
+ There is one project classloader per Maven project (identified through its GAV).

Review Comment:
   GAV --> coordinates



##########
src/plantuml/buildExtensionClassRealm.puml:
##########
@@ -0,0 +1,46 @@
+/*

Review Comment:
   What are these new files doing here? Maybe drawing some sort of diagram or something?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@maven.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org