Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MNG-8043] Dependency properties should be provided by Maven #1399

Merged
merged 9 commits into from
Feb 7, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public enum DependencyScope {
* System scope.
* <p>
* Important: this scope {@code id} MUST BE KEPT in sync with label in
* {@code org.eclipse.aether.util.artifact.Scopes#SYSTEM}.
* {@code org.eclipse.aether.util.artifact.DependencyScopes#SYSTEM}.
gnodet marked this conversation as resolved.
Show resolved Hide resolved
*/
SYSTEM("system", false);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

import org.apache.maven.api.Type;
import org.apache.maven.api.services.TypeRegistry;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;
import org.eclipse.aether.artifact.ArtifactType;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.apache.maven.artifact.handler.manager.LegacyArtifactHandlerManager;
import org.apache.maven.eventspy.AbstractEventSpy;
import org.apache.maven.execution.ExecutionEvent;
import org.apache.maven.repository.internal.type.DefaultType;

import static org.apache.maven.internal.impl.Utils.nonNull;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(BomTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(EarTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(EjbClientTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(EjbTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(JarTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(JavaSourceTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(JavadocTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(MavenPluginTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(ParTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(PomTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(RarTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(TestJarTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import org.apache.maven.api.Language;
import org.apache.maven.api.Type;
import org.apache.maven.internal.impl.DefaultType;
import org.apache.maven.repository.internal.type.DefaultType;

@Named(WarTypeProvider.NAME)
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,16 @@

import java.util.function.Supplier;

import org.apache.maven.api.Language;
import org.apache.maven.repository.internal.artifact.FatArtifactTraverser;
import org.apache.maven.repository.internal.scopes.MavenDependencyContextRefiner;
import org.apache.maven.repository.internal.scopes.MavenScopeDeriver;
import org.apache.maven.repository.internal.scopes.MavenScopeSelector;
import org.apache.maven.repository.internal.type.DefaultType;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession.CloseableSession;
import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.artifact.DefaultArtifactType;
import org.eclipse.aether.collection.DependencyGraphTransformer;
import org.eclipse.aether.collection.DependencyManager;
import org.eclipse.aether.collection.DependencySelector;
Expand All @@ -43,7 +45,6 @@
import org.eclipse.aether.util.graph.transformer.ConflictResolver;
import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;

import static java.util.Objects.requireNonNull;
Expand Down Expand Up @@ -87,20 +88,27 @@ protected DependencyGraphTransformer getDependencyGraphTransformer() {
new MavenDependencyContextRefiner());
}

/**
* Note: This method produces "surrogate" type registry that is static: it aims users that want to use
* Maven-Resolver without involving Maven Core and related things.
* <p>
* This type registry is NOT used by Maven Core: Maven replaces it during Session creation with a type registry
* that supports extending it (i.e. via Maven Extensions).
*/
protected ArtifactTypeRegistry getArtifactTypeRegistry() {
DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
stereotypes.add(new DefaultArtifactType("pom"));
stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", "java"));
stereotypes.add(new DefaultArtifactType("jar", "jar", "", "java"));
stereotypes.add(new DefaultArtifactType("ejb", "jar", "", "java"));
stereotypes.add(new DefaultArtifactType("ejb-client", "jar", "client", "java"));
stereotypes.add(new DefaultArtifactType("test-jar", "jar", "tests", "java"));
stereotypes.add(new DefaultArtifactType("javadoc", "jar", "javadoc", "java"));
stereotypes.add(new DefaultArtifactType("java-source", "jar", "sources", "java", false, false));
stereotypes.add(new DefaultArtifactType("war", "war", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("ear", "ear", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("rar", "rar", "", "java", false, true));
stereotypes.add(new DefaultArtifactType("par", "par", "", "java", false, true));
stereotypes.add(new DefaultType("pom", Language.NONE, "pom", null, false, false));
stereotypes.add(new DefaultType("maven-plugin", Language.JAVA_FAMILY, "jar", null, true, false));
stereotypes.add(new DefaultType("jar", Language.JAVA_FAMILY, "jar", null, true, false));
stereotypes.add(new DefaultType("ejb", Language.JAVA_FAMILY, "jar", null, true, false));
stereotypes.add(new DefaultType("ejb-client", Language.JAVA_FAMILY, "jar", "client", true, false));
stereotypes.add(new DefaultType("test-jar", Language.JAVA_FAMILY, "jar", "tests", true, false));
stereotypes.add(new DefaultType("javadoc", Language.JAVA_FAMILY, "jar", "javadoc", true, false));
stereotypes.add(new DefaultType("java-source", Language.JAVA_FAMILY, "jar", "sources", false, false));
stereotypes.add(new DefaultType("war", Language.JAVA_FAMILY, "war", null, false, true));
stereotypes.add(new DefaultType("ear", Language.JAVA_FAMILY, "ear", null, false, true));
stereotypes.add(new DefaultType("rar", Language.JAVA_FAMILY, "rar", null, false, true));
stereotypes.add(new DefaultType("par", Language.JAVA_FAMILY, "par", null, false, true));
return stereotypes;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
* 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.
*/
package org.apache.maven.repository.internal.artifact;

import org.eclipse.aether.collection.DependencyCollectionContext;
import org.eclipse.aether.collection.DependencyTraverser;
import org.eclipse.aether.graph.Dependency;

import static java.util.Objects.requireNonNull;

/**
* A dependency traverser that excludes the dependencies of fat artifacts from the traversal. Fat artifacts are
* artifacts that have the property {@link MavenArtifactProperties#INCLUDES_DEPENDENCIES} set to
* {@code true}.
*
* @see org.eclipse.aether.artifact.Artifact#getProperties()
* @see MavenArtifactProperties
* @since 4.0.0
*/
public final class FatArtifactTraverser implements DependencyTraverser {

public FatArtifactTraverser() {}

@Override
public boolean traverseDependency(Dependency dependency) {
requireNonNull(dependency, "dependency cannot be null");
String prop = dependency.getArtifact().getProperty(MavenArtifactProperties.INCLUDES_DEPENDENCIES, "");
return !Boolean.parseBoolean(prop);
}

@Override
public DependencyTraverser deriveChildTraverser(DependencyCollectionContext context) {
requireNonNull(context, "context cannot be null");
return this;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else if (null == obj || !getClass().equals(obj.getClass())) {
return false;
}
return true;
}

@Override
public int hashCode() {
return getClass().hashCode();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* 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.
*/
package org.apache.maven.repository.internal.artifact;

/**
* The keys for Maven specific properties of artifacts. These properties "extend" (or supplement) the Resolver
* core properties defined in {@link org.eclipse.aether.artifact.ArtifactProperties}.
*
* @see org.eclipse.aether.artifact.ArtifactProperties
* @since 4.0.0
*/
public final class MavenArtifactProperties {
/**
* A boolean flag indicating whether the artifact presents some kind of bundle that physically includes its
* dependencies, e.g. a fat WAR.
*/
public static final String INCLUDES_DEPENDENCIES = "includesDependencies";

/**
* A boolean flag indicating whether the artifact is meant to be used for the compile/runtime/test build path of a
* consumer project.
* <p>
* Note: This property is about "build path", whatever it means in the scope of the consumer project. It is NOT
* about Java classpath or anything alike. How artifact is being consumed depends heavily on the consumer project.
* Resolver is and will remain agnostic of consumer project use cases.
*/
public static final String CONSTITUTES_BUILD_PATH = "constitutesBuildPath";

private MavenArtifactProperties() {
// hide constructor
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
*/
public final class MavenDependencyContextRefiner implements DependencyGraphTransformer {

public MavenDependencyContextRefiner() {}

@Override
public DependencyNode transformGraph(DependencyNode node, DependencyGraphTransformationContext context)
throws RepositoryException {
requireNonNull(node, "node cannot be null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,13 @@

/**
* The dependency scopes used for Java dependencies in Maven. This class defines labels only, that are doing pass-thru
* over Resolver.
* over Resolver. The labels are defined in {@link DependencyScope} class, these are here used only for "easier
* reachability" in internal classes.
*
* @since 4.0.0
*/
public final class MavenDependencyScopes {

/**
* Important: keep this label in sync with Resolver.
*/
public static final String SYSTEM = DependencyScope.SYSTEM.id();

public static final String NONE = DependencyScope.NONE.id();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@
*/
public final class MavenScopeDeriver extends ScopeDeriver {

/**
* Creates a new instance of this scope deriver.
*/
public MavenScopeDeriver() {}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@
*/
public final class MavenScopeSelector extends ScopeSelector {

/**
* Creates a new instance of this scope selector.
*/
public MavenScopeSelector() {}

@Override
Expand Down