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

This PR makes Shrinkwrap be buildable with latest Maven4 #375

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,16 @@
import eu.maveniverse.maven.mima.context.Runtime;
import eu.maveniverse.maven.mima.context.Runtimes;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;

import org.apache.maven.model.Model;
import org.apache.maven.model.Profile;
Expand All @@ -44,19 +39,16 @@
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.ModelBuilder;
import org.apache.maven.model.building.ModelBuildingException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.building.ModelBuildingResult;
import org.apache.maven.model.building.ModelProblem;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.collection.DependencyCollectionException;
import org.eclipse.aether.collection.DependencySelector;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RemoteRepository.Builder;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.resolution.DependencyResolutionException;
Expand Down Expand Up @@ -159,7 +151,9 @@ public MavenWorkingSession loadPomFromFile(File pomFile, Properties userProperti
final DefaultModelBuildingRequest request = new DefaultModelBuildingRequest()
.setSystemProperties(SecurityActions.getProperties()).setProfiles(this.getSettingsDefinedProfiles())
.setPomFile(pomFile).setActiveProfileIds(SettingsXmlProfileSelector.explicitlyActivatedProfiles(profiles))
.setInactiveProfileIds(SettingsXmlProfileSelector.explicitlyDisabledProfiles(profiles));
.setInactiveProfileIds(SettingsXmlProfileSelector.explicitlyDisabledProfiles(profiles))
.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL)
.setProcessPlugins(false);

if (userProperties != null){
request.setUserProperties(userProperties);
Expand Down Expand Up @@ -197,95 +191,6 @@ public MavenWorkingSession loadPomFromFile(File pomFile, Properties userProperti
return this;
}

private Collection<ArtifactResult> resolveProjectLocal(final List<MavenDependency> depsForResolution,
Set<MavenDependency> additionalDependencies) {
Collection<ArtifactResult> projectLocalDependencies = new ArrayList<>(depsForResolution.size());
for (MavenDependency dependency : depsForResolution) {
Path resolved = resolveProjectLocal(dependency.getGroupId(), dependency.getArtifactId(),
dependency.getVersion(), Optional.ofNullable(dependency.getClassifier()),
Optional.ofNullable(dependency.getPackaging().getExtension()), additionalDependencies);
if (resolved != null && resolved.toFile().exists()) {
Artifact artifact = new DefaultArtifact(dependency.getGroupId(), dependency.getArtifactId(),
dependency.getClassifier(), dependency.getPackaging().getExtension(), dependency.getVersion(),
null, resolved.toFile());
ArtifactResult result = new ArtifactResult(new ArtifactRequest()
.setDependencyNode(new DefaultDependencyNode(
new Dependency(artifact, dependency.getScope().name(), dependency.isOptional()))));
result.setArtifact(artifact);
projectLocalDependencies.add(result);
}
}
return projectLocalDependencies;
}

private Path resolveProjectLocal(String groupId, String artifactId, String version,
Optional<String> classifier, Optional<String> extension,
Set<MavenDependency> additionalDependencies) {
Path projectLocalRepository = findProjectLocalRepository();
if (projectLocalRepository == null) {
return null;
}

Predicate<String> isNotEmpty = s -> !s.isEmpty();
processAdditionalDependencies(projectLocalRepository, groupId, artifactId, version,
additionalDependencies);

return projectLocalRepository.resolve(groupId).resolve(artifactId).resolve(version)
.resolve(toVersionedArtifact(artifactId, version)
+ classifier.filter(isNotEmpty).map(c -> "-" + c).orElse("")
+ "." + extension.filter(isNotEmpty).orElse("jar"));
}

private static String toVersionedArtifact(String artifactId, String version) {
return artifactId + "-" + version;
}

private void processAdditionalDependencies(Path projectLocalRepository, String groupId,
String artifactId, String version,
Set<MavenDependency> additionalDependencies) {
Path directory = projectLocalRepository.resolve(groupId).resolve(artifactId).resolve(version);
File pom = directory.resolve(toVersionedArtifact(artifactId, version) + "-consumer.pom").toFile();
if (!pom.exists()) {
pom = directory.resolve(toVersionedArtifact(artifactId, version) + ".pom").toFile();
}
if (pom.exists()) {
Set<MavenDependency> transitiveDependencies = loadPomFromFile(pom).getParsedPomFile().getDependencies();
transitiveDependencies.removeAll(additionalDependencies);
if (!transitiveDependencies.isEmpty()) {
additionalDependencies.addAll(transitiveDependencies);
transitiveDependencies.forEach(dependency -> processAdditionalDependencies(projectLocalRepository,
dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion(), additionalDependencies));
}
}
}

private List<MavenDependency> filterFromLocal(final List<MavenDependency> depsForResolution,
final Collection<ArtifactResult> projectLocalDependencies) {
return depsForResolution.stream()
.filter(dependency -> projectLocalDependencies.stream()
.noneMatch(result -> MavenConverter.asArtifact(dependency,
getSession().getArtifactTypeRegistry())
.setProperties(Collections.EMPTY_MAP)
.equals(result.getArtifact().setFile(null))))
.collect(Collectors.toList());
}

/**
* @return absolute path to the project-local repository or null if not found
*/
private Path findProjectLocalRepository() {
Path targetPath = Paths.get("target/project-local-repo");
Path currentPath = Paths.get("").toAbsolutePath();
while (currentPath != null) {
Path path = currentPath.resolve(targetPath);
if (path.toFile().exists()) {
return path;
}
currentPath = currentPath.getParent();
}
return null;
}

@Override
public Collection<MavenResolvedArtifact> resolveDependencies(final MavenResolutionStrategy strategy)
throws ResolutionException {
Expand All @@ -296,18 +201,7 @@ public Collection<MavenResolvedArtifact> resolveDependencies(final MavenResoluti

final List<RemoteRepository> repos = this.getRemoteRepositories();

List<MavenDependency> resolveFromRepository;
Collection<ArtifactResult> projectLocalDependencies = Collections.emptyList();
if (Boolean.getBoolean("org.jboss.shrinkwrap.resolver.maven.disableProjectLocal")) {
resolveFromRepository = depsForResolution;
} else {
Set<MavenDependency> allDependencies = new LinkedHashSet<>(depsForResolution);
projectLocalDependencies = resolveProjectLocal(depsForResolution, allDependencies);
resolveFromRepository = filterFromLocal(
allDependencies.stream().collect(Collectors.toList()), projectLocalDependencies);
}

final CollectRequest request = new CollectRequest(MavenConverter.asDependencies(resolveFromRepository,
final CollectRequest request = new CollectRequest(MavenConverter.asDependencies(depsForResolution,
getSession().getArtifactTypeRegistry()),
MavenConverter.asDependencies(depManagement, getSession().getArtifactTypeRegistry()), repos);

Expand Down Expand Up @@ -340,12 +234,7 @@ public Collection<MavenResolvedArtifact> resolveDependencies(final MavenResoluti
throw wrapException(e);
}

final Collection<MavenResolvedArtifact> resolvedArtifacts = new ArrayList<>(results.size() + projectLocalDependencies.size());

for (final ArtifactResult result : projectLocalDependencies) {
resolvedArtifacts.add(MavenResolvedArtifactImpl.fromArtifactResult(result));
}

final Collection<MavenResolvedArtifact> resolvedArtifacts = new ArrayList<>(results.size());
for (final ArtifactResult result : results) {
resolvedArtifacts.add(MavenResolvedArtifactImpl.fromArtifactResult(result));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public MavenRepositorySystem() {
* @return A working session spawned from the repository system.
*/
public DefaultRepositorySystemSession getSession(final Settings settings, boolean legacyLocalRepository) {
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession(context.repositorySystemSession());

MavenManagerBuilder builder = new MavenManagerBuilder(context.repositorySystem(), settings);

Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-tree
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-tree -e
Original file line number Diff line number Diff line change
@@ -1 +1 @@
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-tree
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-tree -e
Original file line number Diff line number Diff line change
@@ -1 +1 @@
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-tree
invoker.goals = ${project.groupId}:${project.artifactId}:${project.version}:dependency-tree -e
Loading