*
* @param originalRepository to compare for a match.
* @param pattern used for match. Currently only '*' is supported.
@@ -782,6 +795,12 @@ else if ( EXTERNAL_WILDCARD.equals( repo ) && isExternalRepo( originalRepository
result = true;
// don't stop processing in case a future segment explicitly excludes this repo
}
+ // check for external:http:*
+ else if ( EXTERNAL_HTTP_WILDCARD.equals( repo ) && isExternalHttpRepo( originalRepository ) )
+ {
+ result = true;
+ // don't stop processing in case a future segment explicitly excludes this repo
+ }
else if ( WILDCARD.equals( repo ) )
{
result = true;
@@ -803,8 +822,34 @@ static boolean isExternalRepo( ArtifactRepository originalRepository )
try
{
URL url = new URL( originalRepository.getUrl() );
- return !( url.getHost().equals( "localhost" ) || url.getHost().equals( "127.0.0.1" )
- || url.getProtocol().equals( "file" ) );
+ return !( isLocal( url.getHost() ) || url.getProtocol().equals( "file" ) );
+ }
+ catch ( MalformedURLException e )
+ {
+ // bad url just skip it here. It should have been validated already, but the wagon lookup will deal with it
+ return false;
+ }
+ }
+
+ private static boolean isLocal( String host )
+ {
+ return "localhost".equals( host ) || "127.0.0.1".equals( host );
+ }
+
+ /**
+ * Checks the URL to see if this repository refers to a non-localhost repository using HTTP.
+ *
+ * @param originalRepository
+ * @return true if external.
+ */
+ static boolean isExternalHttpRepo( ArtifactRepository originalRepository )
+ {
+ try
+ {
+ URL url = new URL( originalRepository.getUrl() );
+ return ( "http".equalsIgnoreCase( url.getProtocol() ) || "dav".equalsIgnoreCase( url.getProtocol() )
+ || "dav:http".equalsIgnoreCase( url.getProtocol() )
+ || "dav+http".equalsIgnoreCase( url.getProtocol() ) ) && !isLocal( url.getHost() );
}
catch ( MalformedURLException e )
{
diff --git a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
index a4835fdd473b..996eb193dcf6 100644
--- a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
+++ b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
@@ -37,7 +37,7 @@
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.classrealm.ClassRealmRequest.RealmType;
-import org.apache.maven.extension.internal.CoreExportsProvider;
+import org.apache.maven.extension.internal.CoreExports;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.codehaus.plexus.MutablePlexusContainer;
@@ -92,20 +92,20 @@ public class DefaultClassRealmManager
@Inject
public DefaultClassRealmManager( Logger logger, PlexusContainer container,
- List delegates, CoreExportsProvider exports )
+ List delegates, CoreExports exports )
{
this.logger = logger;
this.world = ( (MutablePlexusContainer) container ).getClassWorld();
this.containerRealm = container.getContainerRealm();
this.delegates = delegates;
- Map foreignImports = exports.get().getExportedPackages();
+ Map foreignImports = exports.getExportedPackages();
this.mavenApiRealm =
createRealm( API_REALMID, RealmType.Core, null /* parent */, null /* parentImports */,
foreignImports, null /* artifacts */ );
- this.providedArtifacts = exports.get().getExportedArtifacts();
+ this.providedArtifacts = exports.getExportedArtifacts();
}
private ClassRealm newRealm( String id )
diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
index 5b56df36d003..5e6f1b99f274 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
+++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
@@ -54,7 +54,7 @@ public class MavenSession
private Properties executionProperties;
- private MavenProject currentProject;
+ private ThreadLocal currentProject = new ThreadLocal<>();
/**
* These projects have already been topologically sorted in the {@link org.apache.maven.Maven} component before
@@ -83,20 +83,15 @@ public void setProjects( List projects )
{
if ( !projects.isEmpty() )
{
- this.currentProject = projects.get( 0 );
- this.topLevelProject = currentProject;
- for ( MavenProject project : projects )
- {
- if ( project.isExecutionRoot() )
- {
- topLevelProject = project;
- break;
- }
- }
+ MavenProject first = projects.get( 0 );
+ this.currentProject = ThreadLocal.withInitial( () -> first );
+ this.topLevelProject =
+ projects.stream().filter( project -> project.isExecutionRoot() ).findFirst()
+ .orElse( first );
}
else
{
- this.currentProject = null;
+ this.currentProject = new ThreadLocal<>();
this.topLevelProject = null;
}
this.projects = projects;
@@ -157,12 +152,12 @@ public MavenExecutionRequest getRequest()
public void setCurrentProject( MavenProject currentProject )
{
- this.currentProject = currentProject;
+ this.currentProject.set( currentProject );
}
public MavenProject getCurrentProject()
{
- return currentProject;
+ return currentProject.get();
}
public ProjectBuildingRequest getProjectBuildingRequest()
@@ -239,7 +234,12 @@ public MavenSession clone()
{
try
{
- return (MavenSession) super.clone();
+ MavenSession clone = (MavenSession) super.clone();
+ // the default must become the current project of the thread that clones this
+ MavenProject current = getCurrentProject();
+ // we replace the thread local of the clone to prevent write through and enforce the new default value
+ clone.currentProject = ThreadLocal.withInitial( () -> current );
+ return clone;
}
catch ( CloneNotSupportedException e )
{
diff --git a/maven-core/src/main/java/org/apache/maven/execution/infoproviders/DefaultPluginsMetadataInfoProvider.java b/maven-core/src/main/java/org/apache/maven/execution/infoproviders/DefaultPluginsMetadataInfoProvider.java
new file mode 100644
index 000000000000..616a3a88a4bf
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/execution/infoproviders/DefaultPluginsMetadataInfoProvider.java
@@ -0,0 +1,137 @@
+package org.apache.maven.execution.infoproviders;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.Objects;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Plugin;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.repository.internal.PluginsMetadataInfoProvider;
+import org.apache.maven.repository.legacy.metadata.ArtifactMetadata;
+import org.eclipse.aether.artifact.Artifact;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Default implementation of {@link PluginsMetadataInfoProvider}.
+ */
+@Named
+@Singleton
+public class DefaultPluginsMetadataInfoProvider
+ implements PluginsMetadataInfoProvider
+{
+ private final Provider mavenSessionProvider;
+
+ @Inject
+ public DefaultPluginsMetadataInfoProvider( final Provider mavenSessionProvider )
+ {
+ this.mavenSessionProvider = requireNonNull( mavenSessionProvider );
+ }
+
+ @Override
+ public PluginInfo getPluginInfo( final Artifact artifact )
+ {
+ MavenSession mavenSession = mavenSessionProvider.get();
+ if ( mavenSession != null )
+ {
+ MavenProject mavenProject = searchForProject( mavenSession, artifact );
+ if ( mavenProject != null && "maven-plugin".equals( mavenProject.getPackaging() ) )
+ {
+ Plugin plugin = searchForPluginGroupLevelRepositoryMetadata( mavenProject );
+
+ if ( plugin != null )
+ {
+ return new PluginInfo()
+ {
+ @Override
+ public String getPluginGroupId()
+ {
+ return artifact.getGroupId();
+ }
+
+ @Override
+ public String getPluginArtifactId()
+ {
+ return artifact.getArtifactId();
+ }
+
+ @Override
+ public String getPluginPrefix()
+ {
+ return plugin.getPrefix();
+ }
+
+ @Override
+ public String getPluginName()
+ {
+ return plugin.getName();
+ }
+ };
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private MavenProject searchForProject( MavenSession mavenSession, Artifact artifact )
+ {
+ for ( MavenProject mavenProject : mavenSession.getProjects() )
+ {
+ if ( mavenProject.getArtifact() != null
+ && Objects.equals( mavenProject.getGroupId(), artifact.getGroupId() )
+ && Objects.equals( mavenProject.getArtifactId(), artifact.getArtifactId() ) )
+ {
+ return mavenProject;
+ }
+ }
+ return null;
+ }
+
+ private Plugin searchForPluginGroupLevelRepositoryMetadata( MavenProject mavenProject )
+ {
+ org.apache.maven.artifact.Artifact projectArtifact = mavenProject.getArtifact();
+ for ( ArtifactMetadata artifactMetadata : projectArtifact.getMetadataList() )
+ {
+ if ( artifactMetadata instanceof RepositoryMetadata )
+ {
+ RepositoryMetadata repositoryMetadata = (RepositoryMetadata) artifactMetadata;
+ Metadata metadata = repositoryMetadata.getMetadata();
+
+ for ( Plugin plugin : metadata.getPlugins() )
+ {
+ if ( Objects.equals( plugin.getArtifactId(), mavenProject.getArtifactId() ) )
+ {
+ return plugin;
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExports.java b/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExports.java
index 331617cfa232..b769c386788c 100644
--- a/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExports.java
+++ b/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExports.java
@@ -20,14 +20,16 @@
*/
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.toMap;
+
/**
* Provides information about artifacts (identified by groupId:artifactId string key) and classpath elements exported by
* Maven core itself and loaded Maven core extensions.
@@ -47,13 +49,9 @@ public CoreExports( CoreExtensionEntry entry )
public CoreExports( ClassRealm realm, Set exportedArtifacts, Set exportedPackages )
{
- Map packages = new LinkedHashMap<>();
- for ( String pkg : exportedPackages )
- {
- packages.put( pkg, realm );
- }
this.artifacts = Collections.unmodifiableSet( new HashSet<>( exportedArtifacts ) );
- this.packages = Collections.unmodifiableMap( new HashMap<>( packages ) );
+ this.packages = exportedPackages.stream().collect(
+ collectingAndThen( toMap( identity(), v -> realm ), Collections::unmodifiableMap ) );
}
/**
diff --git a/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java b/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java
index 3e6f9f7b6710..b1a30fe3c3aa 100644
--- a/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java
+++ b/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java
@@ -19,34 +19,34 @@
* under the License.
*/
+import java.util.Objects;
+
import javax.inject.Inject;
import javax.inject.Named;
+import javax.inject.Provider;
import javax.inject.Singleton;
import org.codehaus.plexus.PlexusContainer;
-import org.eclipse.sisu.Nullable;
/**
* CoreExportsProvider
*/
@Named
@Singleton
-public class CoreExportsProvider
+public class CoreExportsProvider implements Provider
{
private final CoreExports exports;
@Inject
- public CoreExportsProvider( PlexusContainer container, @Nullable CoreExports exports )
+ public CoreExportsProvider( PlexusContainer container )
+ {
+ this( new CoreExports( CoreExtensionEntry.discoverFrom( container.getContainerRealm() ) ) );
+ }
+
+ public CoreExportsProvider( CoreExports exports )
{
- if ( exports == null )
- {
- this.exports = new CoreExports( CoreExtensionEntry.discoverFrom( container.getContainerRealm() ) );
- }
- else
- {
- this.exports = exports;
- }
+ this.exports = Objects.requireNonNull( exports );
}
public CoreExports get()
diff --git a/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java b/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
index e0067f1fe4ae..7804312c9f90 100644
--- a/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
+++ b/maven-core/src/main/java/org/apache/maven/graph/DefaultProjectDependencyGraph.java
@@ -22,8 +22,11 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -42,9 +45,13 @@ public class DefaultProjectDependencyGraph
implements ProjectDependencyGraph
{
- private ProjectSorter sorter;
+ private final ProjectSorter sorter;
- private List allProjects;
+ private final List allProjects;
+
+ private final Map order;
+
+ private final Map projects;
/**
* Creates a new project dependency graph based on the specified projects.
@@ -59,6 +66,16 @@ public DefaultProjectDependencyGraph( Collection projects )
super();
this.allProjects = Collections.unmodifiableList( new ArrayList<>( projects ) );
this.sorter = new ProjectSorter( projects );
+ List sorted = this.sorter.getSortedProjects();
+ this.order = new HashMap<>( sorted.size() );
+ this.projects = new HashMap<>( sorted.size() );
+ int index = 0;
+ for ( MavenProject project : sorted )
+ {
+ String id = ProjectSorter.getId( project );
+ this.projects.put( id, project );
+ this.order.put( project, index++ );
+ }
}
/**
@@ -78,6 +95,16 @@ public DefaultProjectDependencyGraph( final List allProjects,
super();
this.allProjects = Collections.unmodifiableList( new ArrayList<>( allProjects ) );
this.sorter = new ProjectSorter( projects );
+ List sorted = this.sorter.getSortedProjects();
+ this.order = new HashMap<>( sorted.size() );
+ this.projects = new HashMap<>( sorted.size() );
+ int index = 0;
+ for ( MavenProject project : sorted )
+ {
+ String id = ProjectSorter.getId( project );
+ this.projects.put( id, project );
+ this.order.put( project, index++ );
+ }
}
/**
@@ -140,15 +167,13 @@ private void getUpstreamProjects( String projectId, Collection projectId
private List getSortedProjects( Set projectIds )
{
List result = new ArrayList<>( projectIds.size() );
-
- for ( MavenProject mavenProject : sorter.getSortedProjects() )
+ for ( String projectId : projectIds )
{
- if ( projectIds.contains( ProjectSorter.getId( mavenProject ) ) )
- {
- result.add( mavenProject );
- }
+ result.add( projects.get( projectId ) );
}
+ Collections.sort( result, new MavenProjectComparator() );
+
return result;
}
@@ -158,4 +183,12 @@ public String toString()
return sorter.getSortedProjects().toString();
}
+ private class MavenProjectComparator implements Comparator
+ {
+ @Override
+ public int compare( MavenProject o1, MavenProject o2 )
+ {
+ return order.get( o1 ) - order.get( o2 );
+ }
+ }
}
diff --git a/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java b/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java
new file mode 100644
index 000000000000..da158295ba81
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/internal/MultilineMessageHelper.java
@@ -0,0 +1,91 @@
+package org.apache.maven.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper class to format multiline messages to the console
+ */
+public class MultilineMessageHelper
+{
+
+ private static final int DEFAULT_MAX_SIZE = 65;
+ private static final char BOX_CHAR = '*';
+
+ public static String separatorLine()
+ {
+ StringBuilder sb = new StringBuilder( DEFAULT_MAX_SIZE );
+ repeat( sb, '*', DEFAULT_MAX_SIZE );
+ return sb.toString();
+ }
+
+ public static List format( String... lines )
+ {
+ int size = DEFAULT_MAX_SIZE;
+ int remainder = size - 4; // 4 chars = 2 box_char + 2 spaces
+ List result = new ArrayList<>();
+ StringBuilder sb = new StringBuilder( size );
+ // first line
+ sb.setLength( 0 );
+ repeat( sb, BOX_CHAR, size );
+ result.add( sb.toString() );
+ // lines
+ for ( String line : lines )
+ {
+ sb.setLength( 0 );
+ String[] words = line.split( "\\s+" );
+ for ( String word : words )
+ {
+ if ( sb.length() >= remainder - word.length() - ( sb.length() > 0 ? 1 : 0 ) )
+ {
+ repeat( sb, ' ', remainder - sb.length() );
+ result.add( BOX_CHAR + " " + sb + " " + BOX_CHAR );
+ sb.setLength( 0 );
+ }
+ if ( sb.length() > 0 )
+ {
+ sb.append( ' ' );
+ }
+ sb.append( word );
+ }
+
+ while ( sb.length() < remainder )
+ {
+ sb.append( ' ' );
+ }
+ result.add( BOX_CHAR + " " + sb + " " + BOX_CHAR );
+ }
+ // last line
+ sb.setLength( 0 );
+ repeat( sb, BOX_CHAR, size );
+ result.add( sb.toString() );
+ return result;
+ }
+
+ private static void repeat( StringBuilder sb, char c, int nb )
+ {
+ for ( int i = 0; i < nb; i++ )
+ {
+ sb.append( c );
+ }
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
index 248a3b6dd120..40f3592a5923 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
@@ -25,6 +25,7 @@
import org.apache.maven.eventspy.internal.EventSpyDispatcher;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.apache.maven.rtinfo.RuntimeInformation;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
@@ -53,11 +54,8 @@
import javax.inject.Inject;
import javax.inject.Named;
-import java.io.IOException;
-import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
-import java.util.Properties;
/**
* @since 3.3.0
@@ -65,6 +63,24 @@
@Named
public class DefaultRepositorySystemSessionFactory
{
+ private static final String MAVEN_RESOLVER_TRANSPORT_KEY = "maven.resolver.transport";
+
+ private static final String MAVEN_RESOLVER_TRANSPORT_DEFAULT = "default";
+
+ private static final String MAVEN_RESOLVER_TRANSPORT_WAGON = "wagon";
+
+ private static final String MAVEN_RESOLVER_TRANSPORT_NATIVE = "native";
+
+ private static final String MAVEN_RESOLVER_TRANSPORT_AUTO = "auto";
+
+ private static final String WAGON_TRANSPORTER_PRIORITY_KEY = "aether.priority.WagonTransporterFactory";
+
+ private static final String NATIVE_HTTP_TRANSPORTER_PRIORITY_KEY = "aether.priority.HttpTransporterFactory";
+
+ private static final String NATIVE_FILE_TRANSPORTER_PRIORITY_KEY = "aether.priority.FileTransporterFactory";
+
+ private static final String RESOLVER_MAX_PRIORITY = String.valueOf( Float.MAX_VALUE );
+
@Inject
private Logger logger;
@@ -93,6 +109,10 @@ public class DefaultRepositorySystemSessionFactory
@Inject
MavenRepositorySystem mavenRepositorySystem;
+ @Inject
+ private RuntimeInformation runtimeInformation;
+
+ @SuppressWarnings( "checkstyle:methodlength" )
public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
{
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
@@ -102,6 +122,7 @@ public DefaultRepositorySystemSession newRepositorySession( MavenExecutionReques
Map
- org.sonatype.plexus
+ org.codehaus.plexusplexus-sec-dispatcher${securityDispatcherVersion}
diff --git a/maven-core/src/test/projects/plugin-manager/project-with-inheritance/pom.xml b/maven-core/src/test/projects/plugin-manager/project-with-inheritance/pom.xml
index c19061ad9661..7d0850e48382 100644
--- a/maven-core/src/test/projects/plugin-manager/project-with-inheritance/pom.xml
+++ b/maven-core/src/test/projects/plugin-manager/project-with-inheritance/pom.xml
@@ -53,7 +53,7 @@ under the License.
-->
1.0-alpha-91.2_Java1.3
- 3.8.1
+ 4.131.0-beta-3.0.71.0-alpha-61.1
@@ -473,7 +473,7 @@ under the License.
${mercuryMp3Version}
- org.sonatype.plexus
+ org.codehaus.plexusplexus-sec-dispatcher${securityDispatcherVersion}
diff --git a/maven-core/src/test/projects/project-builder/MNG-6983/parent-pom.xml b/maven-core/src/test/projects/project-builder/MNG-6983/parent-pom.xml
new file mode 100644
index 000000000000..3aed9678e56a
--- /dev/null
+++ b/maven-core/src/test/projects/project-builder/MNG-6983/parent-pom.xml
@@ -0,0 +1,38 @@
+
+ 4.0.0
+
+ org.example
+ parent
+ 0.0.1-SNAPSHOT
+ pom
+
+
+ org.codehaus.mojo
+
+
+
+
+
+
+ ${codehaus.groupId}
+ build-helper-maven-plugin
+ 3.2.0
+
+
+ add-source-config
+ generate-sources
+
+ add-source
+
+
+
+ .
+
+
+
+
+
+
+
+
+
diff --git a/maven-core/src/test/projects/project-builder/MNG-6983/pom.xml b/maven-core/src/test/projects/project-builder/MNG-6983/pom.xml
new file mode 100644
index 000000000000..648f7fc9e936
--- /dev/null
+++ b/maven-core/src/test/projects/project-builder/MNG-6983/pom.xml
@@ -0,0 +1,22 @@
+
+ 4.0.0
+
+
+ org.example
+ parent
+ 0.0.1-SNAPSHOT
+ ./parent-pom.xml
+
+
+ child
+ jar
+
+
+
+
+ ${codehaus.groupId}
+ build-helper-maven-plugin
+
+
+
+
diff --git a/maven-core/src/test/projects/project-builder/it0063/jdk/jre/placeholder.txt b/maven-core/src/test/projects/project-builder/it0063/jdk/jre/placeholder.txt
index e26e86087ce3..4a9eb145a1e3 100644
--- a/maven-core/src/test/projects/project-builder/it0063/jdk/jre/placeholder.txt
+++ b/maven-core/src/test/projects/project-builder/it0063/jdk/jre/placeholder.txt
@@ -1 +1 @@
-need it so that empty folder does not get deleted
\ No newline at end of file
+need it so that empty directory does not get deleted
diff --git a/maven-core/src/test/projects/project-dependencies-resolver/it0063/jdk/jre/placeholder.txt b/maven-core/src/test/projects/project-dependencies-resolver/it0063/jdk/jre/placeholder.txt
index e26e86087ce3..4a9eb145a1e3 100644
--- a/maven-core/src/test/projects/project-dependencies-resolver/it0063/jdk/jre/placeholder.txt
+++ b/maven-core/src/test/projects/project-dependencies-resolver/it0063/jdk/jre/placeholder.txt
@@ -1 +1 @@
-need it so that empty folder does not get deleted
\ No newline at end of file
+need it so that empty directory does not get deleted
diff --git a/maven-core/src/test/resources-project-builder/dependency-inheritance/pom.xml b/maven-core/src/test/resources-project-builder/dependency-inheritance/pom.xml
index 736b793c8e87..8f9c028e3823 100644
--- a/maven-core/src/test/resources-project-builder/dependency-inheritance/pom.xml
+++ b/maven-core/src/test/resources-project-builder/dependency-inheritance/pom.xml
@@ -33,7 +33,7 @@ under the License.
pom
- 3.8.1
+ 4.13
diff --git a/maven-core/src/test/resources-project-builder/dependency-inheritance/sub/pom.xml b/maven-core/src/test/resources-project-builder/dependency-inheritance/sub/pom.xml
index aaf8e8e5ab58..832f49e321ff 100644
--- a/maven-core/src/test/resources-project-builder/dependency-inheritance/sub/pom.xml
+++ b/maven-core/src/test/resources-project-builder/dependency-inheritance/sub/pom.xml
@@ -25,7 +25,7 @@
junitjunit
- 4.4
+ 4.13test
diff --git a/maven-core/src/test/resources-project-builder/micromailer/pom.xml b/maven-core/src/test/resources-project-builder/micromailer/pom.xml
index a1329545bb0a..0e875a7a1d4c 100644
--- a/maven-core/src/test/resources-project-builder/micromailer/pom.xml
+++ b/maven-core/src/test/resources-project-builder/micromailer/pom.xml
@@ -48,7 +48,7 @@
org.codehaus.plexusplexus-utils
- 1.5.5
+ 3.3.0jarcompile
@@ -97,7 +97,7 @@
junitjunit
- 3.8.2
+ 4.13jartest
diff --git a/maven-core/src/test/resources/org/apache/maven/lifecycle/pom.xml b/maven-core/src/test/resources/org/apache/maven/lifecycle/pom.xml
index cd0a3d81712e..5caaac1ba285 100644
--- a/maven-core/src/test/resources/org/apache/maven/lifecycle/pom.xml
+++ b/maven-core/src/test/resources/org/apache/maven/lifecycle/pom.xml
@@ -53,7 +53,7 @@ under the License.
-->
1.0-alpha-91.2_Java1.3
- 3.8.1
+ 4.131.0-beta-3.0.7-SNAPSHOT1.0-alpha-61.1
@@ -473,7 +473,7 @@ under the License.
${mercuryMp3Version}
- org.sonatype.plexus
+ org.codehaus.plexusplexus-sec-dispatcher${securityDispatcherVersion}
diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml
new file mode 100644
index 000000000000..b37e54a9a987
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml
@@ -0,0 +1,12 @@
+
+ 4.0.0
+
+ org.apache
+ apache
+ [1,1]
+
+ child
+
+ ${pom.parent.version}
+ pom
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml
similarity index 69%
rename from maven-core/src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml
rename to maven-core/src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml
index d07ad6eb565e..bd30a9af8e8d 100644
--- a/maven-core/src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml
+++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml
@@ -6,7 +6,7 @@
[1,1]child
-
- ${some.property}
+
+ ${project.version}pom
diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml
new file mode 100644
index 000000000000..a8cf950fa2d9
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml
@@ -0,0 +1,12 @@
+
+ 4.0.0
+
+ org.apache
+ apache
+ [1,1]
+
+ child
+
+ ${project.parent.version}
+ pom
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml
new file mode 100644
index 000000000000..bd30a9af8e8d
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml
@@ -0,0 +1,12 @@
+
+ 4.0.0
+
+ org.apache
+ apache
+ [1,1]
+
+ child
+
+ ${project.version}
+ pom
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml
new file mode 100644
index 000000000000..aa724d854a05
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml
@@ -0,0 +1,14 @@
+
+ 4.0.0
+
+ org.apache
+ apache
+ [1,1]
+
+ child
+ ${revision}
+ pom
+
+ 1.0-SNAPSHOT
+
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml
new file mode 100644
index 000000000000..ac42c932b52d
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml
@@ -0,0 +1,12 @@
+
+ 4.0.0
+
+ parent-version-range-local
+ parent
+ [1,10]
+
+ child
+
+ ${project.parent.version}
+ pom
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/pom.xml
new file mode 100644
index 000000000000..858cf1c3f014
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/pom.xml
@@ -0,0 +1,7 @@
+
+ 4.0.0
+ parent-version-range-local
+ parent
+ 1
+ pom
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml
similarity index 70%
rename from maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml
rename to maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml
index 066a11ecdb6c..1435070a8b96 100644
--- a/maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml
+++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml
@@ -6,7 +6,7 @@
[1,10]child
-
- ${some.property}
+
+ ${project.version}pom
diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml
new file mode 100644
index 000000000000..858cf1c3f014
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml
@@ -0,0 +1,7 @@
+
+ 4.0.0
+ parent-version-range-local
+ parent
+ 1
+ pom
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml
new file mode 100644
index 000000000000..b29b5d23bfc8
--- /dev/null
+++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml
@@ -0,0 +1,14 @@
+
+ 4.0.0
+
+ parent-version-range-local
+ parent
+ [1,10]
+
+ child
+ ${revision}
+ pom
+
+ 1.0-SNAPSHOT
+
+
diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/pom.xml
similarity index 100%
rename from maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/pom.xml
rename to maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/pom.xml
diff --git a/maven-embedder/pom.xml b/maven-embedder/pom.xml
index 7af181714fa0..ab7f45b44585 100644
--- a/maven-embedder/pom.xml
+++ b/maven-embedder/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3
+ 3.9.0-SNAPSHOTmaven-embedder
@@ -75,44 +75,32 @@ under the License.
maven-shared-utils
- com.google.inject
- guice
- no_aop
-
-
- aopalliance
- aopalliance
-
-
-
- com.google.code.findbugs
- jsr305
-
-
- org.checkerframework
- checker-compat-qual
-
-
- com.google.errorprone
- error_prone_annotations
-
-
- com.google.j2objc
- j2objc-annotations
-
-
- org.codehaus.mojo
- animal-sniffer-annotations
-
-
-
+ com.google.inject
+ guice
+
+
+
+ com.google.guava
+ guava
+
+
+
+
+ com.google.guava
+ guava
+
+
+ com.google.guava
+ failureaccess
+ javax.injectjavax.inject
+
javax.annotation
- jsr250-api
+ javax.annotation-apiorg.codehaus.plexus
@@ -127,13 +115,17 @@ under the License.
org.eclipse.sisu.plexus
- org.sonatype.plexus
+ org.codehaus.plexusplexus-sec-dispatcher
- org.sonatype.plexus
+ org.codehaus.plexusplexus-cipher
+
+ org.codehaus.plexus
+ plexus-interpolation
+ org.slf4jslf4j-api
@@ -153,6 +145,11 @@ under the License.
commons-clicommons-cli
+
+ commons-io
+ commons-io
+ test
+ org.apache.commonscommons-lang3
@@ -170,12 +167,6 @@ under the License.
-
-
- src/main/resources
- true
-
-
@@ -201,7 +192,7 @@ under the License.
org.codehaus.modellomodello-maven-plugin
- 1.0.0
+ 1.1.0src/main/mdo/core-extensions.mdo
diff --git a/maven-embedder/src/examples/simple-project/pom.xml b/maven-embedder/src/examples/simple-project/pom.xml
index 62de37aac1be..843b38e32b52 100644
--- a/maven-embedder/src/examples/simple-project/pom.xml
+++ b/maven-embedder/src/examples/simple-project/pom.xml
@@ -29,7 +29,7 @@ under the License.
junitjunit
- 3.8.1
+ 4.13test
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java
index 1e950106907f..8a8b04d9cfa2 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIManager.java
@@ -103,9 +103,11 @@ public class CLIManager
public static final String NO_TRANSFER_PROGRESS = "ntp";
+ public static final String COLOR = "color";
+
protected Options options;
- @SuppressWarnings( { "static-access", "checkstyle:linelength" } )
+ @SuppressWarnings( "checkstyle:linelength" )
public CLIManager()
{
options = new Options();
@@ -139,7 +141,7 @@ public CLIManager()
options.addOption( Option.builder( Character.toString( SHOW_VERSION ) ).longOpt( "show-version" ).desc( "Display version information WITHOUT stopping build" ).build() );
options.addOption( Option.builder( ENCRYPT_MASTER_PASSWORD ).longOpt( "encrypt-master-password" ).hasArg().optionalArg( true ).desc( "Encrypt master security password" ).build() );
options.addOption( Option.builder( ENCRYPT_PASSWORD ).longOpt( "encrypt-password" ).hasArg().optionalArg( true ).desc( "Encrypt server password" ).build() );
- options.addOption( Option.builder( THREADS ).longOpt( "threads" ).hasArg().desc( "Thread count, for instance 2.0C where C is core multiplied" ).build() );
+ options.addOption( Option.builder( THREADS ).longOpt( "threads" ).hasArg().desc( "Thread count, for instance 4 (int) or 2C/2.5C (int/float) where C is core multiplied" ).build() );
options.addOption( Option.builder( LEGACY_LOCAL_REPOSITORY ).longOpt( "legacy-local-repository" ).desc( "Use Maven 2 Legacy Local Repository behaviour, ie no use of _remote.repositories. Can also be activated by using -Dmaven.legacyLocalRepo=true" ).build() );
options.addOption( Option.builder( BUILDER ).longOpt( "builder" ).hasArg().desc( "The id of the build strategy to use" ).build() );
options.addOption( Option.builder( NO_TRANSFER_PROGRESS ).longOpt( "no-transfer-progress" ).desc( "Do not display transfer progress when downloading or uploading" ).build() );
@@ -149,6 +151,8 @@ public CLIManager()
options.addOption( Option.builder( "cpu" ).longOpt( "check-plugin-updates" ).desc( "Ineffective, only kept for backward compatibility" ).build() );
options.addOption( Option.builder( "up" ).longOpt( "update-plugins" ).desc( "Ineffective, only kept for backward compatibility" ).build() );
options.addOption( Option.builder( "npu" ).longOpt( "no-plugin-updates" ).desc( "Ineffective, only kept for backward compatibility" ).build() );
+
+ options.addOption( Option.builder().longOpt( COLOR ).hasArg().optionalArg( true ).desc( "Defines the color mode of the output. Supported are 'auto', 'always', 'never'." ).build() );
}
public CommandLine parse( String[] args )
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
index fb7823923309..57be1963295f 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
@@ -55,7 +55,7 @@ public final class CLIReportingUtils
public static String showVersion()
{
- final String ls = System.getProperty( "line.separator" );
+ final String ls = System.lineSeparator();
Properties properties = getBuildProperties();
StringBuilder version = new StringBuilder( 256 );
version.append( buffer().strong( createMavenVersionString( properties ) ) ).append( ls );
@@ -75,6 +75,13 @@ public static String showVersion()
return version.toString();
}
+ public static String showVersionMinimal()
+ {
+ Properties properties = getBuildProperties();
+ String version = reduce( properties.getProperty( BUILD_VERSION_PROPERTY ) );
+ return ( version != null ? version : "" );
+ }
+
/**
* Create a human readable string containing the Maven version, buildnumber, and time of build
*
@@ -96,7 +103,7 @@ static String createMavenVersionString( Properties buildProperties )
msg += ( rev != null ? rev : "" );
if ( StringUtils.isNotBlank( timestamp ) )
{
- String ts = formatTimestamp( Long.valueOf( timestamp ) );
+ String ts = formatTimestamp( Long.parseLong( timestamp ) );
msg += ( rev != null ? "; " : "" ) + ts;
}
msg += ")";
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
index 7d17e187d25d..6aded69b7e02 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
@@ -24,6 +24,7 @@
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.UnrecognizedOptionException;
+import org.apache.commons.lang3.math.NumberUtils;
import org.apache.maven.BuildAbort;
import org.apache.maven.InternalErrorException;
import org.apache.maven.Maven;
@@ -113,6 +114,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import static org.apache.maven.cli.CLIManager.COLOR;
import static org.apache.maven.cli.ResolveFile.resolveFile;
import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
@@ -166,6 +168,8 @@ public class MavenCli
private Map configurationProcessors;
+ private CLIManager cliManager;
+
public MavenCli()
{
this( null );
@@ -278,6 +282,7 @@ public int doMain( CliRequest cliRequest )
cli( cliRequest );
properties( cliRequest );
logging( cliRequest );
+ informativeCommands( cliRequest );
version( cliRequest );
localContainer = container( cliRequest );
commands( cliRequest );
@@ -367,7 +372,7 @@ void cli( CliRequest cliRequest )
//
slf4jLogger = new Slf4jStdoutLogger();
- CLIManager cliManager = new CLIManager();
+ cliManager = new CLIManager();
List args = new ArrayList<>();
CommandLine mavenConfig = null;
@@ -417,7 +422,10 @@ void cli( CliRequest cliRequest )
cliManager.displayHelp( System.out );
throw e;
}
+ }
+ private void informativeCommands( CliRequest cliRequest ) throws ExitException
+ {
if ( cliRequest.commandLine.hasOption( CLIManager.HELP ) )
{
cliManager.displayHelp( System.out );
@@ -426,7 +434,14 @@ void cli( CliRequest cliRequest )
if ( cliRequest.commandLine.hasOption( CLIManager.VERSION ) )
{
- System.out.println( CLIReportingUtils.showVersion() );
+ if ( cliRequest.commandLine.hasOption( CLIManager.QUIET ) )
+ {
+ System.out.println( CLIReportingUtils.showVersionMinimal() );
+ }
+ else
+ {
+ System.out.println( CLIReportingUtils.showVersion() );
+ }
throw new ExitException( 0 );
}
}
@@ -498,18 +513,19 @@ else if ( cliRequest.quiet )
// LOG COLOR
String styleColor = cliRequest.getUserProperties().getProperty( STYLE_COLOR_PROPERTY, "auto" );
- if ( "always".equals( styleColor ) )
+ styleColor = cliRequest.commandLine.getOptionValue( COLOR, styleColor );
+ if ( "always".equals( styleColor ) || "yes".equals( styleColor ) || "force".equals( styleColor ) )
{
MessageUtils.setColorEnabled( true );
}
- else if ( "never".equals( styleColor ) )
+ else if ( "never".equals( styleColor ) || "no".equals( styleColor ) || "none".equals( styleColor ) )
{
MessageUtils.setColorEnabled( false );
}
- else if ( !"auto".equals( styleColor ) )
+ else if ( !"auto".equals( styleColor ) && !"tty".equals( styleColor ) && !"if-tty".equals( styleColor ) )
{
- throw new IllegalArgumentException( "Invalid color configuration option [" + styleColor
- + "]. Supported values are (auto|always|never)." );
+ throw new IllegalArgumentException( "Invalid color configuration value '" + styleColor
+ + "'. Supported are 'auto', 'always', 'never'." );
}
else if ( cliRequest.commandLine.hasOption( CLIManager.BATCH_MODE )
|| cliRequest.commandLine.hasOption( CLIManager.LOG_FILE ) )
@@ -690,6 +706,7 @@ protected void configure()
private List loadCoreExtensions( CliRequest cliRequest, ClassRealm containerRealm,
Set providedArtifacts )
+ throws Exception
{
if ( cliRequest.multiModuleProjectDirectory == null )
{
@@ -702,75 +719,62 @@ private List loadCoreExtensions( CliRequest cliRequest, Clas
return Collections.emptyList();
}
- try
+ List extensions = readCoreExtensionsDescriptor( extensionsFile );
+ if ( extensions.isEmpty() )
{
- List extensions = readCoreExtensionsDescriptor( extensionsFile );
- if ( extensions.isEmpty() )
- {
- return Collections.emptyList();
- }
+ return Collections.emptyList();
+ }
- ContainerConfiguration cc = new DefaultContainerConfiguration() //
- .setClassWorld( cliRequest.classWorld ) //
- .setRealm( containerRealm ) //
- .setClassPathScanning( PlexusConstants.SCANNING_INDEX ) //
- .setAutoWiring( true ) //
- .setJSR250Lifecycle( true ) //
- .setName( "maven" );
+ ContainerConfiguration cc = new DefaultContainerConfiguration() //
+ .setClassWorld( cliRequest.classWorld ) //
+ .setRealm( containerRealm ) //
+ .setClassPathScanning( PlexusConstants.SCANNING_INDEX ) //
+ .setAutoWiring( true ) //
+ .setJSR250Lifecycle( true ) //
+ .setName( "maven" );
- DefaultPlexusContainer container = new DefaultPlexusContainer( cc, new AbstractModule()
+ DefaultPlexusContainer container = new DefaultPlexusContainer( cc, new AbstractModule()
+ {
+ @Override
+ protected void configure()
{
- @Override
- protected void configure()
- {
- bind( ILoggerFactory.class ).toInstance( slf4jLoggerFactory );
- }
- } );
+ bind( ILoggerFactory.class ).toInstance( slf4jLoggerFactory );
+ }
+ } );
- try
- {
- container.setLookupRealm( null );
+ try
+ {
+ container.setLookupRealm( null );
- container.setLoggerManager( plexusLoggerManager );
+ container.setLoggerManager( plexusLoggerManager );
- container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() );
+ container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() );
- Thread.currentThread().setContextClassLoader( container.getContainerRealm() );
+ Thread.currentThread().setContextClassLoader( container.getContainerRealm() );
- executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class );
+ executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class );
- configurationProcessors = container.lookupMap( ConfigurationProcessor.class );
+ configurationProcessors = container.lookupMap( ConfigurationProcessor.class );
- configure( cliRequest );
+ configure( cliRequest );
- MavenExecutionRequest request = DefaultMavenExecutionRequest.copy( cliRequest.request );
+ MavenExecutionRequest request = DefaultMavenExecutionRequest.copy( cliRequest.request );
- request = populateRequest( cliRequest, request );
+ request = populateRequest( cliRequest, request );
- request = executionRequestPopulator.populateDefaults( request );
+ request = executionRequestPopulator.populateDefaults( request );
- BootstrapCoreExtensionManager resolver = container.lookup( BootstrapCoreExtensionManager.class );
+ BootstrapCoreExtensionManager resolver = container.lookup( BootstrapCoreExtensionManager.class );
- return Collections.unmodifiableList( resolver.loadCoreExtensions( request, providedArtifacts,
- extensions ) );
+ return Collections.unmodifiableList( resolver.loadCoreExtensions( request, providedArtifacts,
+ extensions ) );
- }
- finally
- {
- executionRequestPopulator = null;
- container.dispose();
- }
- }
- catch ( RuntimeException e )
- {
- // runtime exceptions are most likely bugs in maven, let them bubble up to the user
- throw e;
}
- catch ( Exception e )
+ finally
{
- slf4jLogger.warn( "Failed to read extensions descriptor {}: {}", extensionsFile, e.getMessage() );
+ executionRequestPopulator = null;
+ container.dispose();
}
- return Collections.emptyList();
}
private List readCoreExtensionsDescriptor( File extensionsFile )
@@ -1581,18 +1585,11 @@ else if ( commandLine.hasOption( CLIManager.ALSO_MAKE ) && commandLine.hasOption
if ( threadConfiguration != null )
{
- //
- // Default to the standard multithreaded builder
- //
- request.setBuilderId( "multithreaded" );
-
- if ( threadConfiguration.contains( "C" ) )
+ int degreeOfConcurrency = calculateDegreeOfConcurrency( threadConfiguration );
+ if ( degreeOfConcurrency > 1 )
{
- request.setDegreeOfConcurrency( calculateDegreeOfConcurrencyWithCoreMultiplier( threadConfiguration ) );
- }
- else
- {
- request.setDegreeOfConcurrency( Integer.valueOf( threadConfiguration ) );
+ request.setBuilderId( "multithreaded" );
+ request.setDegreeOfConcurrency( degreeOfConcurrency );
}
}
@@ -1607,10 +1604,56 @@ else if ( commandLine.hasOption( CLIManager.ALSO_MAKE ) && commandLine.hasOption
return request;
}
- int calculateDegreeOfConcurrencyWithCoreMultiplier( String threadConfiguration )
+ int calculateDegreeOfConcurrency( String threadConfiguration )
{
- int procs = Runtime.getRuntime().availableProcessors();
- return (int) ( Float.valueOf( threadConfiguration.replace( "C", "" ) ) * procs );
+ if ( threadConfiguration.endsWith( "C" ) )
+ {
+ threadConfiguration = threadConfiguration.substring( 0, threadConfiguration.length() - 1 );
+
+ if ( !NumberUtils.isParsable( threadConfiguration ) )
+ {
+ throw new IllegalArgumentException( "Invalid threads core multiplier value: '" + threadConfiguration
+ + "C'. Supported are int and float values ending with C." );
+ }
+
+ float coreMultiplier = Float.parseFloat( threadConfiguration );
+
+ if ( coreMultiplier <= 0.0f )
+ {
+ throw new IllegalArgumentException( "Invalid threads core multiplier value: '" + threadConfiguration
+ + "C'. Value must be positive." );
+ }
+
+ int procs = Runtime.getRuntime().availableProcessors();
+ int threads = (int) ( coreMultiplier * procs );
+ return threads == 0 ? 1 : threads;
+ }
+ else
+ {
+ if ( !NumberUtils.isParsable( threadConfiguration ) )
+ {
+ throw new IllegalArgumentException( "Invalid threads value: '" + threadConfiguration
+ + "'. Supported are int values." );
+ }
+
+ try
+ {
+ int threads = Integer.parseInt( threadConfiguration );
+
+ if ( threads <= 0 )
+ {
+ throw new IllegalArgumentException( "Invalid threads value: '" + threadConfiguration
+ + "'. Value must be positive." );
+ }
+
+ return threads;
+ }
+ catch ( NumberFormatException e )
+ {
+ throw new IllegalArgumentException( "Invalid threads value: '" + threadConfiguration
+ + "'. Supported are integer values." );
+ }
+ }
}
// ----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/ResolveFile.java b/maven-embedder/src/main/java/org/apache/maven/cli/ResolveFile.java
index 8622ce342962..7a1652e249c3 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/ResolveFile.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/ResolveFile.java
@@ -20,6 +20,7 @@
*/
import java.io.File;
+import java.nio.file.Paths;
/**
* Resolve relative file path against the given base directory
@@ -43,7 +44,7 @@ else if ( file.getPath().startsWith( File.separator ) )
}
else
{
- return new File( baseDirectory, file.getPath() ).getAbsoluteFile();
+ return Paths.get( baseDirectory, file.getPath() ).normalize().toFile();
}
}
}
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java b/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
index 17da65548a79..6b1c80bdcd42 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/event/ExecutionEventLogger.java
@@ -23,6 +23,7 @@
import static org.apache.maven.cli.CLIReportingUtils.formatTimestamp;
import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
+import java.io.File;
import java.util.List;
import java.util.Objects;
@@ -333,6 +334,15 @@ public void projectStarted( ExecutionEvent event )
infoMain( building + ( ( pad > 0 ) ? chars( ' ', pad ) : "" ) + progress );
}
+ // path to pom.xml
+ File currentPom = project.getFile();
+ if ( currentPom != null )
+ {
+ MavenSession session = event.getSession();
+ File rootBasedir = session.getTopLevelProject().getBasedir();
+ logger.info( " from " + rootBasedir.toPath().relativize( currentPom.toPath() ) );
+ }
+
// ----------[ packaging ]----------
prefix = chars( '-', Math.max( 0, ( LINE_LENGTH - project.getPackaging().length() - 4 ) / 2 ) );
suffix = chars( '-', Math.max( 0, LINE_LENGTH - project.getPackaging().length() - 4 - prefix.length() ) );
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
index 9fada05db83b..1d1e4989c1d2 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java
@@ -31,6 +31,7 @@
import org.apache.maven.RepositoryUtils;
import org.apache.maven.cli.internal.extension.model.CoreExtension;
import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.extension.internal.CoreExports;
import org.apache.maven.extension.internal.CoreExtensionEntry;
import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory;
import org.apache.maven.model.Plugin;
@@ -40,6 +41,10 @@
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.interpolation.InterpolationException;
+import org.codehaus.plexus.interpolation.Interpolator;
+import org.codehaus.plexus.interpolation.MapBasedValueSource;
+import org.codehaus.plexus.interpolation.StringSearchInterpolator;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
@@ -55,12 +60,18 @@
@Named
public class BootstrapCoreExtensionManager
{
+ public static final String STRATEGY_PARENT_FIRST = "parent-first";
+ public static final String STRATEGY_PLUGIN = "plugin";
+ public static final String STRATEGY_SELF_FIRST = "self-first";
+
private final Logger log;
private final DefaultPluginDependenciesResolver pluginDependenciesResolver;
private final DefaultRepositorySystemSessionFactory repositorySystemSessionFactory;
+ private final CoreExports coreExports;
+
private final ClassWorld classWorld;
private final ClassRealm parentRealm;
@@ -68,11 +79,13 @@ public class BootstrapCoreExtensionManager
@Inject
public BootstrapCoreExtensionManager( Logger log, DefaultPluginDependenciesResolver pluginDependenciesResolver,
DefaultRepositorySystemSessionFactory repositorySystemSessionFactory,
+ CoreExports coreExports,
PlexusContainer container )
{
this.log = log;
this.pluginDependenciesResolver = pluginDependenciesResolver;
this.repositorySystemSessionFactory = repositorySystemSessionFactory;
+ this.coreExports = coreExports;
this.classWorld = ( (DefaultPlexusContainer) container ).getClassWorld();
this.parentRealm = container.getContainerRealm();
}
@@ -82,15 +95,24 @@ public List loadCoreExtensions( MavenExecutionRequest reques
throws Exception
{
RepositorySystemSession repoSession = repositorySystemSessionFactory.newRepositorySession( request );
- List repositories = RepositoryUtils.toRepos( request.getPluginArtifactRepositories() );
+ try
+ {
+ List repositories = RepositoryUtils.toRepos( request.getPluginArtifactRepositories() );
+ Interpolator interpolator = createInterpolator( request );
- return resolveCoreExtensions( repoSession, repositories, providedArtifacts, extensions );
+ return resolveCoreExtensions( repoSession, repositories, providedArtifacts, extensions, interpolator );
+ }
+ finally
+ {
+ repoSession.close();
+ }
}
private List resolveCoreExtensions( RepositorySystemSession repoSession,
List repositories,
Set providedArtifacts,
- List configuration )
+ List configuration,
+ Interpolator interpolator )
throws Exception
{
List extensions = new ArrayList<>();
@@ -99,7 +121,8 @@ private List resolveCoreExtensions( RepositorySystemSession
for ( CoreExtension extension : configuration )
{
- List artifacts = resolveExtension( extension, repoSession, repositories, dependencyFilter );
+ List artifacts = resolveExtension( extension, repoSession, repositories,
+ dependencyFilter, interpolator );
if ( !artifacts.isEmpty() )
{
extensions.add( createExtension( extension, artifacts ) );
@@ -114,33 +137,86 @@ private CoreExtensionEntry createExtension( CoreExtension extension, List providedArtifacts = Collections.emptySet();
+ String classLoadingStrategy = extension.getClassLoadingStrategy();
+ if ( STRATEGY_PARENT_FIRST.equals( classLoadingStrategy ) )
+ {
+ realm.importFrom( parentRealm, "" );
+ }
+ else if ( STRATEGY_PLUGIN.equals( classLoadingStrategy ) )
+ {
+ coreExports.getExportedPackages().forEach( ( p, cl ) -> realm.importFrom( cl, p ) );
+ providedArtifacts = coreExports.getExportedArtifacts();
+ }
+ else if ( STRATEGY_SELF_FIRST.equals( classLoadingStrategy ) )
+ {
+ realm.setParentRealm( parentRealm );
+ }
+ else
+ {
+ throw new IllegalArgumentException( "Unsupported class-loading strategy '"
+ + classLoadingStrategy + "'. Supported values are: " + STRATEGY_PARENT_FIRST
+ + ", " + STRATEGY_PLUGIN + " and " + STRATEGY_SELF_FIRST );
+ }
log.debug( "Populating class realm " + realm.getId() );
- realm.setParentRealm( parentRealm );
for ( Artifact artifact : artifacts )
{
- File file = artifact.getFile();
- log.debug( " Included " + file );
- realm.addURL( file.toURI().toURL() );
+ String id = artifact.getGroupId() + ":" + artifact.getArtifactId();
+ if ( providedArtifacts.contains( id ) )
+ {
+ log.debug( " Excluded " + id );
+ }
+ else
+ {
+ File file = artifact.getFile();
+ log.debug( " Included " + id + " located at " + file );
+ realm.addURL( file.toURI().toURL() );
+ }
}
return CoreExtensionEntry.discoverFrom( realm, Collections.singleton( artifacts.get( 0 ).getFile() ) );
}
private List resolveExtension( CoreExtension extension, RepositorySystemSession repoSession,
- List repositories, DependencyFilter dependencyFilter )
- throws PluginResolutionException
+ List repositories, DependencyFilter dependencyFilter,
+ Interpolator interpolator )
+ throws ExtensionResolutionException
+ {
+ try
+ {
+ /* TODO: Enhance the PluginDependenciesResolver to provide a
+ * resolveCoreExtension method which uses a CoreExtension
+ * object instead of a Plugin as this makes no sense.
+ */
+ Plugin plugin = new Plugin();
+ plugin.setGroupId( interpolator.interpolate( extension.getGroupId() ) );
+ plugin.setArtifactId( interpolator.interpolate( extension.getArtifactId() ) );
+ plugin.setVersion( interpolator.interpolate( extension.getVersion() ) );
+
+ DependencyNode root = pluginDependenciesResolver
+ .resolveCoreExtension( plugin, dependencyFilter, repositories, repoSession );
+ PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
+ root.accept( nlg );
+ List artifacts = nlg.getArtifacts( false );
+
+ return artifacts;
+ }
+ catch ( PluginResolutionException e )
+ {
+ throw new ExtensionResolutionException( extension, e.getCause() );
+ }
+ catch ( InterpolationException e )
+ {
+ throw new ExtensionResolutionException( extension, e );
+ }
+ }
+
+ private static Interpolator createInterpolator( MavenExecutionRequest request )
{
- Plugin plugin = new Plugin();
- plugin.setGroupId( extension.getGroupId() );
- plugin.setArtifactId( extension.getArtifactId() );
- plugin.setVersion( extension.getVersion() );
-
- DependencyNode root =
- pluginDependenciesResolver.resolveCoreExtension( plugin, dependencyFilter, repositories, repoSession );
- PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
- root.accept( nlg );
- List artifacts = nlg.getArtifacts( false );
-
- return artifacts;
+ StringSearchInterpolator interpolator = new StringSearchInterpolator();
+ interpolator.addValueSource( new MapBasedValueSource( request.getUserProperties() ) );
+ interpolator.addValueSource( new MapBasedValueSource( request.getSystemProperties() ) );
+ return interpolator;
}
+
}
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java
new file mode 100644
index 000000000000..4f8cff9cb346
--- /dev/null
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/ExtensionResolutionException.java
@@ -0,0 +1,47 @@
+package org.apache.maven.cli.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.cli.internal.extension.model.CoreExtension;
+
+/**
+ * Exception occurring trying to resolve a plugin.
+ *
+ * @author Brett Porter
+ */
+public class ExtensionResolutionException
+ extends Exception
+{
+
+ private final CoreExtension extension;
+
+ public ExtensionResolutionException( CoreExtension extension, Throwable cause )
+ {
+ super( "Extension " + extension.getId() + " or one of its dependencies could not be resolved: "
+ + cause.getMessage(), cause );
+ this.extension = extension;
+ }
+
+ public CoreExtension getExtension()
+ {
+ return extension;
+ }
+
+}
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/UnsupportedSlf4jBindingConfiguration.java b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/UnsupportedSlf4jBindingConfiguration.java
index 4757cffabf42..222ab4d3f0ac 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/UnsupportedSlf4jBindingConfiguration.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/logging/impl/UnsupportedSlf4jBindingConfiguration.java
@@ -54,7 +54,7 @@ public void activate()
logger.warn( "The SLF4J binding actually used is not supported by Maven: {}", slf4jBinding );
logger.warn( "Maven supported bindings are:" );
- String ls = System.getProperty( "line.separator" );
+ String ls = System.lineSeparator();
for ( Map.Entry> entry : supported.entrySet() )
{
diff --git a/maven-embedder/src/main/mdo/core-extensions.mdo b/maven-embedder/src/main/mdo/core-extensions.mdo
index e523d5abf325..968258d21dac 100644
--- a/maven-embedder/src/main/mdo/core-extensions.mdo
+++ b/maven-embedder/src/main/mdo/core-extensions.mdo
@@ -82,7 +82,41 @@
trueString
+
+ classLoadingStrategy
+ The class loading strategy: 'self-first' (the default), 'parent-first' (loads classes from the parent, then from the extension) or 'plugin' (follows the rules from extensions defined as plugins).
+ 1.1.0+
+ self-first
+ false
+ String
+
+
+
+ 1.0.0+
+
+ ::}, never {@code null}.
+ */
+ public String getId()
+ {
+ StringBuilder id = new StringBuilder( 128 );
+
+ id.append( ( getGroupId() == null ) ? "[unknown-group-id]" : getGroupId() );
+ id.append( ":" );
+ id.append( ( getArtifactId() == null ) ? "[unknown-artifact-id]" : getArtifactId() );
+ id.append( ":" );
+ id.append( ( getVersion() == null ) ? "[unknown-version]" : getVersion() );
+
+ return id.toString();
+ }
+ ]]>
+
+
+
diff --git a/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java b/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java
index 3a78f335cf7f..7b136066e496 100644
--- a/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java
+++ b/maven-embedder/src/test/java/org/apache/maven/cli/CLIManagerDocumentationTest.java
@@ -39,14 +39,16 @@
public class CLIManagerDocumentationTest
extends TestCase
{
- private final static String LS = System.getProperty( "line.separator" );
+ private final static String LS = System.lineSeparator();
private static class OptionComparator
implements Comparator
-
-
- all-models
-
-
-
- org.codehaus.modello
- modello-maven-plugin
-
-
- v3
-
- java
- xpp3-writer
- xpp3-reader
- xsd
-
-
- 3.0.0
- true
-
-
-
-
-
- maven-jar-plugin
-
-
- package
-
- jar
-
-
- all
-
-
-
-
-
-
-
-
diff --git a/maven-model/src/main/java/org/apache/maven/model/merge/ModelMerger.java b/maven-model/src/main/java/org/apache/maven/model/merge/ModelMerger.java
index dbd548b6c3c4..7b7ed4dd48f8 100644
--- a/maven-model/src/main/java/org/apache/maven/model/merge/ModelMerger.java
+++ b/maven-model/src/main/java/org/apache/maven/model/merge/ModelMerger.java
@@ -19,6 +19,7 @@
* under the License.
*/
+import java.io.ObjectStreamException;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
@@ -2870,8 +2871,9 @@ private static List merge( List tgt, List src, KeyComputer compu
* Merging list
* @param
*/
- private static class MergingList extends AbstractList
+ private static class MergingList extends AbstractList implements java.io.Serializable
{
+
private final KeyComputer keyComputer;
private Map map;
private List list;
@@ -2882,6 +2884,11 @@ private static class MergingList extends AbstractList
this.keyComputer = keyComputer;
}
+ Object writeReplace() throws ObjectStreamException
+ {
+ return new ArrayList<>( this );
+ }
+
@Override
public Iterator iterator()
{
diff --git a/maven-model/src/main/mdo/maven.mdo b/maven-model/src/main/mdo/maven.mdo
index 1f1f9d1864d9..00bf3d51adef 100644
--- a/maven-model/src/main/mdo/maven.mdo
+++ b/maven-model/src/main/mdo/maven.mdo
@@ -43,8 +43,8 @@
| definition of these types
|
-->
-maven
@@ -642,11 +642,11 @@
-
+ BuildBase3.0.0+PluginConfiguration
- Generic informations for a build.
+ Build configuration in a profile.defaultGoal
@@ -1191,16 +1191,16 @@
- artifactId
+ groupId4.0.0+
- The artifact ID of the project to exclude.
+ The group ID of the project to exclude.Stringtrue
- groupId
+ artifactId4.0.0+
- The group ID of the project to exclude.
+ The artifact ID of the project to exclude.Stringtrue
@@ -1937,12 +1937,12 @@
-
+ DeploymentRepositoryRepository4.0.0+
- Repository contains the information needed for deploying to the remote
- repository.
+ Deployment repository contains the information needed for deploying to the remote
+ repository, which adds uniqueVersion property to usual repositories for download.uniqueVersion
@@ -2314,18 +2314,12 @@
return id.toString();
}
- //TODO we shall reset key variable when groupId/artifactId change
- private String key = null;
/**
* @return the key of the plugin, ie groupId:artifactId
*/
public String getKey()
{
- if ( key == null )
- {
- key = constructKey( groupId, artifactId );
- }
- return key;
+ return constructKey( groupId, artifactId );
}
/**
@@ -2813,13 +2807,13 @@
-->
-
+ ReportPlugin4.0.0+ConfigurationContainer
<plugin> element contains informations required for a report plugin.
+ The <plugin> element in <reporting><plugins> contains informations required for a report plugin.
]]>
@@ -2841,7 +2835,12 @@
version4.0.0+
- The version of the reporting plugin to be used.
+
+ build/plugins then in build/pluginManagement.
+ ]]>
+ String
diff --git a/maven-model/src/test/java/org/apache/maven/model/merge/ModelMergerTest.java b/maven-model/src/test/java/org/apache/maven/model/merge/ModelMergerTest.java
new file mode 100644
index 000000000000..c347cf63ce96
--- /dev/null
+++ b/maven-model/src/test/java/org/apache/maven/model/merge/ModelMergerTest.java
@@ -0,0 +1,49 @@
+package org.apache.maven.model.merge;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+
+import org.apache.maven.model.License;
+import org.apache.maven.model.Model;
+import org.junit.Test;
+
+public class ModelMergerTest {
+
+ @Test
+ public void testMergedModelSerialization() throws Exception {
+ Model target = new Model();
+ Model source = new Model();
+ target.setLicenses(new ArrayList());
+ License lic1 = new License();
+ License lic2 = new License();
+ target.getLicenses().add(lic1);
+ source.setLicenses(new ArrayList());
+ source.getLicenses().add(lic2);
+
+ new ModelMerger().mergeModel(target, source, false, null);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(target);
+ }
+}
\ No newline at end of file
diff --git a/maven-plugin-api/pom.xml b/maven-plugin-api/pom.xml
index 8abe7430d673..4f94861ff4c4 100644
--- a/maven-plugin-api/pom.xml
+++ b/maven-plugin-api/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3
+ 3.9.0-SNAPSHOTmaven-plugin-api
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/AbstractMojoExecutionException.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/AbstractMojoExecutionException.java
index 52aded3d654d..e8df3095f212 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/AbstractMojoExecutionException.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/AbstractMojoExecutionException.java
@@ -41,6 +41,18 @@ public AbstractMojoExecutionException( String message, Throwable cause )
super( message, cause );
}
+ /**
+ * Constructs a new {@code AbstractMojoExecutionException} exception wrapping an underlying {@code Throwable}.
+ *
+ * @param cause the cause which is saved for later retrieval by the {@link #getCause()} method.
+ * A {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.
+ * @since 3.8.3
+ */
+ public AbstractMojoExecutionException( Throwable cause )
+ {
+ super( cause );
+ }
+
public String getLongMessage()
{
return longMessage;
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoExecutionException.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoExecutionException.java
index 4d8c416e077d..6d089898600c 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoExecutionException.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoExecutionException.java
@@ -76,4 +76,17 @@ public MojoExecutionException( String message )
{
super( message );
}
+
+ /**
+ * Constructs a new {@code MojoExecutionException} exception wrapping an underlying {@code Throwable}.
+ *
+ * @param cause the cause which is saved for later retrieval by the {@link #getCause()} method.
+ * A {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.
+ * @since 3.8.3
+ */
+ public MojoExecutionException( Throwable cause )
+ {
+ super( cause );
+ }
+
}
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoFailureException.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoFailureException.java
index 342d081f00b2..72faec679eb9 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoFailureException.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/MojoFailureException.java
@@ -65,4 +65,17 @@ public MojoFailureException( String message, Throwable cause )
{
super( message, cause );
}
+
+ /**
+ * Constructs a new {@code MojoFailureException} exception wrapping an underlying {@code Throwable}.
+ *
+ * @param cause the cause which is saved for later retrieval by the {@link #getCause()} method.
+ * A {@code null} value is permitted, and indicates that the cause is nonexistent or unknown.
+ * @since 3.8.3
+ */
+ public MojoFailureException( Throwable cause )
+ {
+ super( cause );
+ }
+
}
diff --git a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
index a15bdcf0c36e..35d574bc17bf 100644
--- a/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
+++ b/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
@@ -89,8 +89,8 @@ public class MojoDescriptor
private String executeLifecycle;
/**
- * Specify the version when the Mojo was deprecated to the API. Similar to Javadoc deprecated. This will trigger a
- * warning when a user tries to configure a parameter marked as deprecated.
+ * Description with reason of Mojo deprecation. Similar to Javadoc {@code @deprecated}.
+ * This will trigger a warning when a user tries to use a Mojo marked as deprecated.
*/
private String deprecated;
@@ -170,7 +170,7 @@ public void setLanguage( String language )
}
/**
- * @return true if the Mojo is deprecated, false otherwise.
+ * @return Description with reason of a Mojo deprecation.
*/
public String getDeprecated()
{
@@ -178,7 +178,7 @@ public String getDeprecated()
}
/**
- * @param deprecated true to deprecate the Mojo, false otherwise.
+ * @param deprecated Description with reason of a Mojo deprecation.
*/
public void setDeprecated( String deprecated )
{
diff --git a/maven-plugin-api/src/main/mdo/plugin.mdo b/maven-plugin-api/src/main/mdo/plugin.mdo
index 0bb1b511eb56..c1e579604215 100644
--- a/maven-plugin-api/src/main/mdo/plugin.mdo
+++ b/maven-plugin-api/src/main/mdo/plugin.mdo
@@ -289,10 +289,10 @@ under the License.
deprecated1.0.0String
-
- Specify the version when the Mojo was deprecated to the API. Similar to Javadoc deprecated. This will
- trigger a warning when a user tries to configure a parameter marked as deprecated.
-
+ @deprecated
+ This will trigger a warning when a user tries to use a Mojo marked as deprecated.
+ ]]>configurator
@@ -422,10 +422,10 @@ under the License.
deprecated1.0.0String
-
- Specify the version when the parameter was deprecated to the API. Similar to Javadoc deprecated.
+ @deprecated
This will trigger a warning when a user tries to configure a parameter marked as deprecated.
-
+ ]]>
diff --git a/maven-repository-metadata/pom.xml b/maven-repository-metadata/pom.xml
index 07a0a177c5a8..7567df5f6b82 100644
--- a/maven-repository-metadata/pom.xml
+++ b/maven-repository-metadata/pom.xml
@@ -25,7 +25,7 @@ under the License.
org.apache.mavenmaven
- 3.6.3
+ 3.9.0-SNAPSHOTmaven-repository-metadata
@@ -38,6 +38,11 @@ under the License.
org.codehaus.plexusplexus-utils
+
+ org.apache.maven.resolver
+ maven-resolver-api
+ test
+
diff --git a/maven-repository-metadata/src/main/mdo/metadata.mdo b/maven-repository-metadata/src/main/mdo/metadata.mdo
index e2d07533972d..6ce381d4a830 100644
--- a/maven-repository-metadata/src/main/mdo/metadata.mdo
+++ b/maven-repository-metadata/src/main/mdo/metadata.mdo
@@ -20,15 +20,13 @@ under the License.
+ xml.schemaLocation="https://maven.apache.org/xsd/repository-metadata-${version}.xsd">
repository-metadataMetadataPer-directory repository metadata, for directories representing un-versioned artifact, snapshot artifact
- or a group containing Maven plugins.
-
Notice that most metadata content has a meaning when the directory represents
- an artifact (groupId, artifactId, versioning), but
- plugins is used when the directory represents a group.