From 1e01c8660cffb88cc8af84c28e9b55fc9f71e0ea Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Fri, 17 Jan 2025 18:09:26 +0800 Subject: [PATCH] [MNG-8578]add exclusion scope to repo, allow exclude dependencies from build(including parent, dependencies, etc) --- api/maven-api-model/src/main/mdo/maven.mdo | 20 +++++ .../org/apache/maven/RepositoryUtils.java | 87 ++++++++++++------- .../DefaultProjectDependenciesResolver.java | 7 ++ .../apache/maven/project/MavenProject.java | 5 ++ pom.xml | 2 +- 5 files changed, 90 insertions(+), 31 deletions(-) diff --git a/api/maven-api-model/src/main/mdo/maven.mdo b/api/maven-api-model/src/main/mdo/maven.mdo index 1ba9e93a1f1a..c4ff0384a0be 100644 --- a/api/maven-api-model/src/main/mdo/maven.mdo +++ b/api/maven-api-model/src/main/mdo/maven.mdo @@ -603,6 +603,16 @@ * + + exclusions + 4.0.0+ + Lists a set of artifacts that should be excluded from this repo's + dependency list when it comes to calculating transitive dependencies. + + Exclusion + * + + repositories 4.0.0+ @@ -1810,6 +1820,16 @@ String + + exclusions + 4.0.0+ + Lists a set of artifacts that should be excluded from this repo's + dependency list when it comes to calculating transitive dependencies. + + Exclusion + * + + diff --git a/impl/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java b/impl/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java index a093e4d90933..908b433e8e9c 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java +++ b/impl/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java @@ -29,6 +29,8 @@ import java.util.Optional; import java.util.stream.Collectors; +import org.apache.maven.api.annotations.Nonnull; +import org.apache.maven.api.annotations.Nullable; import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; @@ -65,11 +67,13 @@ */ public class RepositoryUtils { - private static String nullify(String string) { + @Nullable + private static String nullify(@Nullable String string) { return (string == null || string.isEmpty()) ? null : string; } - public static org.apache.maven.artifact.Artifact toArtifact(Dependency dependency) { + @Nullable + public static org.apache.maven.artifact.Artifact toArtifact(@Nullable Dependency dependency) { if (dependency == null) { return null; } @@ -81,7 +85,8 @@ public static org.apache.maven.artifact.Artifact toArtifact(Dependency dependenc return result; } - public static org.apache.maven.artifact.Artifact toArtifact(Artifact artifact) { + @Nullable + public static org.apache.maven.artifact.Artifact toArtifact(@Nullable Artifact artifact) { if (artifact == null) { return null; } @@ -112,10 +117,10 @@ public static org.apache.maven.artifact.Artifact toArtifact(Artifact artifact) { } public static void toArtifacts( - Collection artifacts, - Collection nodes, - List trail, - DependencyFilter filter) { + @Nonnull Collection artifacts, + @Nonnull Collection nodes, + @Nonnull List trail, + @Nullable DependencyFilter filter) { for (DependencyNode node : nodes) { org.apache.maven.artifact.Artifact artifact = toArtifact(node.getDependency()); @@ -132,7 +137,8 @@ public static void toArtifacts( } } - public static Artifact toArtifact(org.apache.maven.artifact.Artifact artifact) { + @Nullable + public static Artifact toArtifact(@Nullable org.apache.maven.artifact.Artifact artifact) { if (artifact == null) { return null; } @@ -162,7 +168,8 @@ public static Artifact toArtifact(org.apache.maven.artifact.Artifact artifact) { } public static Dependency toDependency( - org.apache.maven.artifact.Artifact artifact, Collection exclusions) { + @Nullable org.apache.maven.artifact.Artifact artifact, + @Nullable Collection exclusions) { if (artifact == null) { return null; } @@ -175,13 +182,15 @@ public static Dependency toDependency( return new Dependency(result, artifact.getScope(), artifact.isOptional(), excl); } - public static List toRepos(List repos) { + @Nonnull + public static List toRepos(@Nullable List repos) { return Optional.ofNullable(repos).orElse(Collections.emptyList()).stream() .map(RepositoryUtils::toRepo) .collect(Collectors.toList()); } - public static RemoteRepository toRepo(ArtifactRepository repo) { + @Nullable + public static RemoteRepository toRepo(@Nullable ArtifactRepository repo) { RemoteRepository result = null; if (repo != null) { RemoteRepository.Builder builder = @@ -197,7 +206,8 @@ public static RemoteRepository toRepo(ArtifactRepository repo) { return result; } - public static String getLayout(ArtifactRepository repo) { + @Nonnull + public static String getLayout(@Nonnull ArtifactRepository repo) { try { return repo.getLayout().getId(); } catch (LinkageError e) { @@ -216,7 +226,8 @@ public static String getLayout(ArtifactRepository repo) { } } - private static RepositoryPolicy toPolicy(ArtifactRepositoryPolicy policy) { + @Nullable + private static RepositoryPolicy toPolicy(@Nullable ArtifactRepositoryPolicy policy) { RepositoryPolicy result = null; if (policy != null) { result = new RepositoryPolicy(policy.isEnabled(), policy.getUpdatePolicy(), policy.getChecksumPolicy()); @@ -224,7 +235,8 @@ private static RepositoryPolicy toPolicy(ArtifactRepositoryPolicy policy) { return result; } - private static Authentication toAuthentication(org.apache.maven.artifact.repository.Authentication auth) { + @Nullable + private static Authentication toAuthentication(@Nullable org.apache.maven.artifact.repository.Authentication auth) { Authentication result = null; if (auth != null) { AuthenticationBuilder authBuilder = new AuthenticationBuilder(); @@ -235,7 +247,8 @@ private static Authentication toAuthentication(org.apache.maven.artifact.reposit return result; } - private static Proxy toProxy(org.apache.maven.repository.Proxy proxy) { + @Nullable + private static Proxy toProxy(@Nullable org.apache.maven.repository.Proxy proxy) { Proxy result = null; if (proxy != null) { AuthenticationBuilder authBuilder = new AuthenticationBuilder(); @@ -245,7 +258,8 @@ private static Proxy toProxy(org.apache.maven.repository.Proxy proxy) { return result; } - public static ArtifactHandler newHandler(Artifact artifact) { + @Nonnull + public static ArtifactHandler newHandler(@Nonnull Artifact artifact) { String type = artifact.getProperty(ArtifactProperties.TYPE, artifact.getExtension()); return new DefaultArtifactHandler( type, @@ -258,7 +272,8 @@ public static ArtifactHandler newHandler(Artifact artifact) { Boolean.parseBoolean(artifact.getProperty(MavenArtifactProperties.CONSTITUTES_BUILD_PATH, ""))); } - public static ArtifactType newArtifactType(String id, ArtifactHandler handler) { + @Nonnull + public static ArtifactType newArtifactType(@Nonnull String id, @Nonnull ArtifactHandler handler) { return new DefaultArtifactType( id, handler.getExtension(), @@ -268,8 +283,9 @@ public static ArtifactType newArtifactType(String id, ArtifactHandler handler) { handler.isIncludesDependencies()); } + @Nonnull public static Dependency toDependency( - org.apache.maven.model.Dependency dependency, ArtifactTypeRegistry stereotypes) { + @Nonnull org.apache.maven.model.Dependency dependency, @Nonnull ArtifactTypeRegistry stereotypes) { ArtifactType stereotype = stereotypes.get(dependency.getType()); if (stereotype == null) { stereotype = new DefaultArtifactType(dependency.getType()); @@ -303,38 +319,46 @@ public static Dependency toDependency( exclusions); } - private static Exclusion toExclusion(org.apache.maven.model.Exclusion exclusion) { + @Nonnull + public static Exclusion toExclusion(@Nonnull org.apache.maven.model.Exclusion exclusion) { return new Exclusion(exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*"); } - public static ArtifactTypeRegistry newArtifactTypeRegistry(ArtifactHandlerManager handlerManager) { + @Nonnull + public static ArtifactTypeRegistry newArtifactTypeRegistry(@Nonnull ArtifactHandlerManager handlerManager) { return new MavenArtifactTypeRegistry(handlerManager); } static class MavenArtifactTypeRegistry implements ArtifactTypeRegistry { + @Nonnull private final ArtifactHandlerManager handlerManager; - MavenArtifactTypeRegistry(ArtifactHandlerManager handlerManager) { + MavenArtifactTypeRegistry(@Nonnull ArtifactHandlerManager handlerManager) { this.handlerManager = handlerManager; } - public ArtifactType get(String stereotypeId) { + @Nullable + @Override + public ArtifactType get(@Nonnull String stereotypeId) { ArtifactHandler handler = handlerManager.getArtifactHandler(stereotypeId); return newArtifactType(stereotypeId, handler); } } - public static Collection toArtifacts(Collection artifactsToConvert) { + @Nonnull + public static Collection toArtifacts( + @Nonnull Collection artifactsToConvert) { return artifactsToConvert.stream().map(RepositoryUtils::toArtifact).collect(Collectors.toList()); } - public static WorkspaceRepository getWorkspace(RepositorySystemSession session) { + @Nullable + public static WorkspaceRepository getWorkspace(@Nonnull RepositorySystemSession session) { WorkspaceReader reader = session.getWorkspaceReader(); return (reader != null) ? reader.getRepository() : null; } - public static boolean repositoriesEquals(List r1, List r2) { + public static boolean repositoriesEquals(@Nonnull List r1, @Nonnull List r2) { if (r1.size() != r2.size()) { return false; } @@ -348,7 +372,7 @@ public static boolean repositoriesEquals(List r1, List repositories) { + public static int repositoriesHashCode(@Nonnull List repositories) { int result = 17; for (RemoteRepository repository : repositories) { result = 31 * result + repositoryHashCode(repository); @@ -356,8 +380,11 @@ public static int repositoriesHashCode(List repositories) { return result; } + @Nullable public static RepositorySystemSession overlay( - ArtifactRepository repository, RepositorySystemSession session, RepositorySystem system) { + @Nullable ArtifactRepository repository, + @Nullable RepositorySystemSession session, + @Nonnull RepositorySystem system) { if (repository == null || repository.getBasedir() == null) { return session; } @@ -379,14 +406,14 @@ public static RepositorySystemSession overlay( return newSession; } - private static int repositoryHashCode(RemoteRepository repository) { + private static int repositoryHashCode(@Nonnull RemoteRepository repository) { int result = 17; Object obj = repository.getUrl(); result = 31 * result + (obj != null ? obj.hashCode() : 0); return result; } - private static boolean policyEquals(RepositoryPolicy p1, RepositoryPolicy p2) { + private static boolean policyEquals(@Nonnull RepositoryPolicy p1, @Nonnull RepositoryPolicy p2) { if (p1 == p2) { return true; } @@ -394,7 +421,7 @@ private static boolean policyEquals(RepositoryPolicy p1, RepositoryPolicy p2) { return p1.isEnabled() == p2.isEnabled() && Objects.equals(p1.getChecksumPolicy(), p2.getChecksumPolicy()); } - private static boolean repositoryEquals(RemoteRepository r1, RemoteRepository r2) { + private static boolean repositoryEquals(@Nonnull RemoteRepository r1, @Nonnull RemoteRepository r2) { if (r1 == r2) { return true; } diff --git a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java index ab8407e6257d..c52063403de5 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java +++ b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java @@ -148,6 +148,13 @@ public DependencyResolutionResult resolve(DependencyResolutionRequest request) } } + List exclusions = project.getExclusions(); + if (exclusions != null) { + for (Exclusion exclusion : exclusions) { + collect.addExclusion(RepositoryUtils.toExclusion(exclusion)); + } + } + DependencyRequest depRequest = new DependencyRequest(collect, filter); depRequest.setTrace(trace); diff --git a/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java b/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java index aa682b9858a1..279c8b59c532 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java +++ b/impl/maven-core/src/main/java/org/apache/maven/project/MavenProject.java @@ -58,6 +58,7 @@ import org.apache.maven.model.DependencyManagement; import org.apache.maven.model.Developer; import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.Exclusion; import org.apache.maven.model.Extension; import org.apache.maven.model.IssueManagement; import org.apache.maven.model.License; @@ -312,6 +313,10 @@ public DependencyManagement getDependencyManagement() { return getModel().getDependencyManagement(); } + public List getExclusions() { + return getModel().getExclusions(); + } + // ---------------------------------------------------------------------- // Test and compile source roots. // ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 4325013012d5..480bc3f22a2f 100644 --- a/pom.xml +++ b/pom.xml @@ -162,7 +162,7 @@ under the License. 1.27 1.4.0 4.0.4 - 2.0.6 + 2.0.7.exclusion 4.1.0 0.9.0.M3 2.0.16