Skip to content

Commit

Permalink
Maven Archetype 3.3.0 compatibility
Browse files Browse the repository at this point in the history
- Update maven-archetype dependencies to 3.3.0
- Use reflection to work with previous versions (< 3.3.0)
- Remove groovy dependency management
- Upgrade maven-invoker-plugin and maven-invoker to 3.8.0
- Replace use of ProjectInstaller (deprecated) with RepositorySystem (aether)
  • Loading branch information
romain-grecourt committed Oct 2, 2024
1 parent 5791371 commit cbc344b
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 161 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.release>11</maven.compiler.release>
</properties>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import io.helidon.build.common.ansi.AnsiConsoleInstaller;
import io.helidon.build.maven.archetype.config.Validation;

import org.apache.maven.RepositoryUtils;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
Expand All @@ -58,17 +59,17 @@
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.ProjectArtifact;
import org.apache.maven.shared.invoker.DefaultInvocationRequest;
import org.apache.maven.shared.invoker.InvocationOutputHandler;
import org.apache.maven.shared.invoker.InvocationRequest;
import org.apache.maven.shared.invoker.InvocationResult;
import org.apache.maven.shared.invoker.Invoker;
import org.apache.maven.shared.invoker.MavenInvocationException;
import org.apache.maven.shared.transfer.artifact.install.ArtifactInstallerException;
import org.apache.maven.shared.transfer.project.NoFileAssignedException;
import org.apache.maven.shared.transfer.project.install.ProjectInstaller;
import org.apache.maven.shared.transfer.project.install.ProjectInstallerRequest;
import org.codehaus.plexus.PlexusContainer;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.installation.InstallRequest;
import org.eclipse.aether.installation.InstallationException;

import static io.helidon.build.common.FileUtils.ensureDirectory;
import static io.helidon.build.common.FileUtils.unique;
Expand Down Expand Up @@ -107,7 +108,6 @@ public class IntegrationTestMojo extends AbstractMojo {
*/
@Parameter(defaultValue = "${session}", readonly = true, required = true)
private MavenSession session;

/**
* Skip the integration test.
*/
Expand Down Expand Up @@ -244,7 +244,7 @@ public class IntegrationTestMojo extends AbstractMojo {
private Map<String, String> invokerEnvVars;

@Component
private ProjectInstaller installer;
private RepositorySystem repoSystem;

@Component
private PluginContainerManager pluginContainerManager;
Expand Down Expand Up @@ -495,11 +495,13 @@ private void mavenCompatGenerate(String archetypeGroupId,
Path basedir) throws MojoExecutionException {

// pre-install the archetype JAR so that the post-generate script can resolve it
ProjectInstallerRequest projectInstallerRequest = new ProjectInstallerRequest().setProject(project);
try {
installer.install(session.getProjectBuildingRequest(), projectInstallerRequest);
} catch (IOException | ArtifactInstallerException | NoFileAssignedException ex) {
throw new MojoExecutionException("Unable to pre-install archetype artifact", ex);
InstallRequest request = new InstallRequest();
request.addArtifact(RepositoryUtils.toArtifact(new ProjectArtifact(project)));
request.addArtifact(RepositoryUtils.toArtifact(project.getArtifact()));
repoSystem.install(session.getRepositorySession(), request);
} catch (InstallationException ex) {
throw new MojoExecutionException("Unable to pre-install project", ex);
}

PlexusContainer container = pluginContainerManager.create(MAVEN_ARCHETYPE_PLUGIN,
Expand Down Expand Up @@ -529,7 +531,7 @@ private void invokePostArchetypeGenerationGoals(File basedir) throws IOException
.setUserSettingsFile(session.getRequest().getUserSettingsFile())
.setLocalRepositoryDirectory(localRepo)
.setBaseDirectory(basedir)
.setGoals(List.of(testGoal))
.addArgs(List.of(testGoal))
.setProfiles(testProfiles)
.setBatchMode(true)
.setShowErrors(true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2023 Oracle and/or its affiliates.
* Copyright (c) 2023, 2024 Oracle and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -67,7 +67,7 @@ static void generate(PlexusContainer container,
.setPackage(properties.getProperty("package"))
.setOutputDirectory(basedir.toString())
.setProperties(properties)
.setProjectBuildingRequest(session.getProjectBuildingRequest());
.setRepositorySession(session.getRepositorySession());

ArchetypeGenerationResult result = new ArchetypeGenerationResult();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2020, 2022 Oracle and/or its affiliates.
* Copyright (c) 2020, 2024 Oracle and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -18,36 +18,25 @@
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.cli.transfer.Slf4jMavenTransferListener;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Settings;
import org.apache.maven.settings.building.DefaultSettingsBuilder;
import org.apache.maven.settings.building.DefaultSettingsBuilderFactory;
import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsBuildingException;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.providers.http.HttpWagon;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.component.composition.CycleDetectedInComponentGraphException;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.internal.transport.wagon.PlexusWagonProvider;
import org.eclipse.aether.repository.Authentication;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.MirrorSelector;
import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.ProxySelector;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.resolution.ArtifactRequest;
Expand All @@ -59,9 +48,6 @@
import org.eclipse.aether.transport.wagon.WagonProvider;
import org.eclipse.aether.transport.wagon.WagonTransporterFactory;
import org.eclipse.aether.util.filter.DependencyFilterUtils;
import org.eclipse.aether.util.repository.AuthenticationBuilder;
import org.eclipse.aether.util.repository.DefaultMirrorSelector;
import org.eclipse.aether.util.repository.DefaultProxySelector;

import static java.util.stream.Collectors.toList;

Expand All @@ -70,123 +56,29 @@
*/
final class Aether {

private final Settings settings;
private final List<RemoteRepository> remoteRepos;
private final RepositorySystem repoSystem;
private final DefaultRepositorySystemSession repoSession;
private final RepositorySystemSession repoSession;

/**
* Create a new Aether instance.
*
* @param localRepoDir local repository directory
* @param remoteArtifactRepos remote artifacts repositories
* @param activeProfiles list of profile ids to activate
*/
@SuppressWarnings("unchecked")
Aether(File localRepoDir, List<ArtifactRepository> remoteArtifactRepos, List<String> activeProfiles) {
try {
PlexusContainer container = new DefaultPlexusContainer();
container.addComponentDescriptor(plexusDesc(Wagon.class, "http", HttpWagon.class));
container.addComponentDescriptor(plexusDesc(Wagon.class, "https", HttpWagon.class));
repoSystem = MavenRepositorySystemUtils
.newServiceLocator()
.setServices(WagonProvider.class, new PlexusWagonProvider(container))
.addService(TransporterFactory.class, WagonTransporterFactory.class)
.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class)
.getService(RepositorySystem.class);
settings = settings();
if (activeProfiles != null) {
settings.setActiveProfiles(activeProfiles);
}
repoSession = MavenRepositorySystemUtils.newSession();
repoSession.setTransferListener(new Slf4jMavenTransferListener());
repoSession.setProxySelector(proxySelector());
repoSession.setMirrorSelector(mirrorSelector());
repoSession.setLocalRepositoryManager(repoSystem
.newLocalRepositoryManager(repoSession, new LocalRepository(localRepoDir)));
remoteRepos = remoteArtifactRepos.stream().map(this::remoteRepo).collect(toList());
} catch (CycleDetectedInComponentGraphException | PlexusContainerException ex) {
throw new IllegalStateException(ex);
}
}

@SuppressWarnings({"unchecked", "rawtypes", "SameParameterValue"})
private static ComponentDescriptor plexusDesc(Class<?> roleClass, String roleHint, Class<?> implClass) {
ComponentDescriptor desc = new ComponentDescriptor();
desc.setRoleClass(roleClass);
desc.setRoleHint(roleHint);
desc.setImplementationClass(implClass);
desc.setInstantiationStrategy("per-lookup");
return desc;
}

private static Settings settings() {
DefaultSettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance();
DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
String userSettings = System.getProperty("org.apache.maven.user-settings");
if (userSettings == null) {
File userHome = new File(System.getProperty("user.home")).getAbsoluteFile();
request.setUserSettingsFile(new File(userHome, "/.m2/settings.xml"));
} else {
request.setUserSettingsFile(new File(userSettings));
}
String globalSettings = System.getProperty("org.apache.maven.global-settings");
if (globalSettings != null) {
request.setGlobalSettingsFile(new File(globalSettings));
}
try {
return builder.build(request).getEffectiveSettings();
} catch (SettingsBuildingException ex) {
throw new IllegalStateException(ex);
}
}

private MirrorSelector mirrorSelector() {
DefaultMirrorSelector selector = new DefaultMirrorSelector();
List<Mirror> mirrors = settings.getMirrors();
if (mirrors != null) {
for (Mirror mirror : mirrors) {
selector.add(mirror.getId(), mirror.getUrl(), mirror.getLayout(), false,
mirror.getMirrorOf(), mirror.getMirrorOfLayouts());
}
}
return selector;
Aether(RepositorySystemSession repoSession, List<RemoteRepository> remoteRepos) {
this.repoSession = repoSession;
this.repoSystem = repoSystem();
this.remoteRepos = remoteRepos;
}

private ProxySelector proxySelector() {
org.apache.maven.settings.Proxy proxyDef = settings.getActiveProxy();
if (proxyDef != null) {
Authentication auth = null;
if (proxyDef.getUsername() != null) {
auth = new AuthenticationBuilder().addString(proxyDef.getUsername(), proxyDef.getPassword()).build();
}
DefaultProxySelector selector = new DefaultProxySelector();
Proxy proxy = new Proxy(proxyDef.getProtocol(), proxyDef.getHost(), proxyDef.getPort(), auth);
selector.add(proxy, proxyDef.getNonProxyHosts());
return selector;
}
return null;
Aether(RepositorySystemSession repoSession, List<ArtifactRepository> artifactRepos, boolean ignored) {
this.repoSession = repoSession;
this.repoSystem = repoSystem();
this.remoteRepos = artifactRepos.stream().map(this::remoteRepo).collect(Collectors.toList());
}

private RemoteRepository remoteRepo(ArtifactRepository aRepo) {
RemoteRepository.Builder builder = new RemoteRepository.Builder(aRepo.getId(), aRepo.getLayout().getId(),
aRepo.getUrl());
ArtifactRepositoryPolicy releases = aRepo.getReleases();
if (releases != null) {
RepositoryPolicy releasePolicy = new RepositoryPolicy(releases.isEnabled(), releases.getUpdatePolicy(),
releases.getChecksumPolicy());
builder.setReleasePolicy(releasePolicy);
}
ArtifactRepositoryPolicy snapshots = aRepo.getSnapshots();
if (snapshots != null) {
RepositoryPolicy snapshotPolicy = new RepositoryPolicy(snapshots.isEnabled(), snapshots.getUpdatePolicy(),
snapshots.getChecksumPolicy());
builder.setSnapshotPolicy(snapshotPolicy);
}
RemoteRepository repository = builder.build();
return new RemoteRepository.Builder(repository)
.setProxy(repoSession.getProxySelector().getProxy(repository))
.build();
/**
* Get the repository system session.
*
* @return RepositorySystemSession
*/
RepositorySystemSession repoSession() {
return repoSession;
}

/**
Expand Down Expand Up @@ -247,4 +139,52 @@ List<File> resolveDependencies(List<String> coords) {
}
return files;
}

private RemoteRepository remoteRepo(ArtifactRepository repo) {
RemoteRepository.Builder builder = new RemoteRepository.Builder(repo.getId(), repo.getLayout().getId(),
repo.getUrl());
ArtifactRepositoryPolicy releases = repo.getReleases();
if (releases != null) {
RepositoryPolicy releasePolicy = new RepositoryPolicy(releases.isEnabled(), releases.getUpdatePolicy(),
releases.getChecksumPolicy());
builder.setReleasePolicy(releasePolicy);
}
ArtifactRepositoryPolicy snapshots = repo.getSnapshots();
if (snapshots != null) {
RepositoryPolicy snapshotPolicy = new RepositoryPolicy(snapshots.isEnabled(), snapshots.getUpdatePolicy(),
snapshots.getChecksumPolicy());
builder.setSnapshotPolicy(snapshotPolicy);
}
RemoteRepository repository = builder.build();
return new RemoteRepository.Builder(repository)
.setProxy(repoSession.getProxySelector().getProxy(repository))
.build();
}

@SuppressWarnings({"unchecked", "rawtypes", "SameParameterValue"})
private static ComponentDescriptor plexusDesc(Class<?> roleClass, String roleHint, Class<?> implClass) {
ComponentDescriptor desc = new ComponentDescriptor();
desc.setRoleClass(roleClass);
desc.setRoleHint(roleHint);
desc.setImplementationClass(implClass);
desc.setInstantiationStrategy("per-lookup");
return desc;
}

@SuppressWarnings("unchecked")
private static RepositorySystem repoSystem() {
try {
PlexusContainer container = new DefaultPlexusContainer();
container.addComponentDescriptor(plexusDesc(Wagon.class, "http", HttpWagon.class));
container.addComponentDescriptor(plexusDesc(Wagon.class, "https", HttpWagon.class));
return MavenRepositorySystemUtils
.newServiceLocator()
.setServices(WagonProvider.class, new PlexusWagonProvider(container))
.addService(TransporterFactory.class, WagonTransporterFactory.class)
.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class)
.getService(RepositorySystem.class);
} catch (CycleDetectedInComponentGraphException | PlexusContainerException ex) {
throw new IllegalStateException(ex);
}
}
}
Loading

0 comments on commit cbc344b

Please sign in to comment.