Hi,
Unfortunately Maven 3 didn’t define a proper API. In effect everything somehow 
exposed through class loaders was considered API by plugin/extension developers.
For Maven 4 a completely separate API was established in package 
“org.apache.maven.api”, but what about the old packages used and exported in 
Maven 3?

For example in the context of https://issues.apache.org/jira/browse/MNG-7588 
<https://issues.apache.org/jira/browse/MNG-7588> I want to evolve the package 
“org.apache.maven.plugin.descriptor”.
We already figured out that this particular package (although not part of the 
Maven 4 API) is used from both Maven Core as well as Maven Plugin Tools, 
therefore this probably needs to stay backwards compatible.
What about others like 
https://github.com/apache/maven/blob/master/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java?
 
<https://github.com/apache/maven/blob/master/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java?>
This interface should IMHO never been implemented outside Maven Core but in 
fact it was exposed to all plugins/extensions (via 
https://github.com/apache/maven/blob/a6b1ebb1cd40ca4b288fdeb30c6d2460323aa25b/maven-core/src/main/resources/META-INF/maven/extension.xml#L40
 
<https://github.com/apache/maven/blob/a6b1ebb1cd40ca4b288fdeb30c6d2460323aa25b/maven-core/src/main/resources/META-INF/maven/extension.xml#L40>).

There are three options coming to my mind:

1. Deprecate the interfaces we don’t consider API and create new ones for Maven 
4 which are not exported!
2. Modify the existing interfaces in a backwards compatible way (but somehow 
add a marker that they should not be implemented outside core)
3. Modify the existing  interfaces in a backwards compatible way (but somehow 
add a marker that they should not be implemented outside core)

For all three options we somehow need to come up with a list of 
classes/interfaces currently being exported through the API class loader, which 
should be considered private and agree on an Annotation/Javadoc for that 
(something like 
https://github.com/mulesoft/api-annotations/blob/40b258afeff6560241dee5001ed00f1deb392e47/src/main/java/org/mule/api/annotation/NoImplement.java#L29
 
<https://github.com/mulesoft/api-annotations/blob/40b258afeff6560241dee5001ed00f1deb392e47/src/main/java/org/mule/api/annotation/NoImplement.java#L29>
 or https://wiki.eclipse.org/API_Javadoc_tags#The_New_Solution 
<https://wiki.eclipse.org/API_Javadoc_tags#The_New_Solution>

WDYT?

Konrad

Reply via email to