mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[maven] maven 4 repositories fix
GitOrigin-RevId: c800f1435d40021a440e275fe7d9dc58d2003c90
This commit is contained in:
committed by
intellij-monorepo-bot
parent
fb09e3ca60
commit
f1ea599147
+58
-68
@@ -53,9 +53,9 @@ import org.codehaus.plexus.util.StringUtils;
|
||||
import org.eclipse.aether.RepositorySystem;
|
||||
import org.eclipse.aether.RepositorySystemSession;
|
||||
import org.eclipse.aether.graph.DependencyNode;
|
||||
import org.eclipse.aether.impl.RemoteRepositoryManager;
|
||||
import org.eclipse.aether.repository.RemoteRepository;
|
||||
import org.eclipse.aether.resolution.ArtifactRequest;
|
||||
import org.eclipse.aether.resolution.ArtifactResolutionException;
|
||||
import org.eclipse.aether.resolution.ArtifactResult;
|
||||
import org.eclipse.aether.transfer.ArtifactTransferException;
|
||||
import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator;
|
||||
@@ -695,45 +695,51 @@ public class Maven40ServerEmbedderImpl extends MavenServerEmbeddedBase {
|
||||
MavenServerUtil.checkToken(token);
|
||||
String longRunningTaskId = longRunningTaskInput.getLongRunningTaskId();
|
||||
MavenServerOpenTelemetry telemetry = MavenServerOpenTelemetry.of(longRunningTaskInput);
|
||||
boolean runInParallel = canResolveDependenciesInParallel();
|
||||
|
||||
|
||||
try (LongRunningTask task = newLongRunningTask(longRunningTaskId, pluginResolutionRequests.size(), myConsoleWrapper)) {
|
||||
MavenExecutionRequest request = createRequest(null, null, null);
|
||||
request.setTransferListener(new Maven40TransferListenerAdapter(task.getIndicator()));
|
||||
request.setUpdateSnapshots(myAlwaysUpdateSnapshots || forceUpdateSnapshots);
|
||||
|
||||
DefaultMaven maven = (DefaultMaven)getComponent(Maven.class);
|
||||
RepositorySystemSession session = maven.newRepositorySession(request);
|
||||
myImporterSpy.setIndicator(task.getIndicator());
|
||||
List<PluginResolutionData> resolutions = collectPluginResolutionData(pluginResolutionRequests);
|
||||
List<PluginResolutionResponse> results = new ArrayList<>();
|
||||
executeWithMavenSession(request, MavenWorkspaceMap.empty(), task.getIndicator(), session -> {
|
||||
results.addAll(ParallelRunnerForServer.execute(false, resolutions, resolution ->
|
||||
resolvePlugin(task, resolution.mavenPluginId, resolution.pluginDependencies, resolution.remoteRepos,
|
||||
session.getRepositorySession())));
|
||||
});
|
||||
|
||||
List<PluginResolutionData> resolutions = new ArrayList<>();
|
||||
|
||||
for (PluginResolutionRequest pluginResolutionRequest : pluginResolutionRequests) {
|
||||
MavenId mavenPluginId = pluginResolutionRequest.getMavenPluginId();
|
||||
int nativeMavenProjectId = pluginResolutionRequest.getNativeMavenProjectId();
|
||||
|
||||
String groupId = mavenPluginId.getGroupId();
|
||||
String artifactId = mavenPluginId.getArtifactId();
|
||||
|
||||
MavenProject project = RemoteNativeMaven40ProjectHolder.findProjectById(nativeMavenProjectId);
|
||||
List<RemoteRepository> remoteRepos = project.getRemotePluginRepositories();
|
||||
|
||||
Plugin pluginFromProject = project.getBuild().getPluginsAsMap().get(groupId + ':' + artifactId);
|
||||
List<Dependency> pluginDependencies =
|
||||
null == pluginFromProject ? Collections.emptyList() : pluginFromProject.getDependencies();
|
||||
|
||||
PluginResolutionData resolution = new PluginResolutionData(mavenPluginId, pluginDependencies, remoteRepos);
|
||||
resolutions.add(resolution);
|
||||
}
|
||||
byte[] telemetryTrace = telemetry.shutdown();
|
||||
// IDEA-341451: Parallel plugin resolution hangs in Maven 4.0.0-alpha-9
|
||||
// It worked fine up until Maven 4.0.0-alpha-8
|
||||
List<PluginResolutionResponse> results = ParallelRunnerForServer.execute(false, resolutions, resolution ->
|
||||
resolvePlugin(task, resolution.mavenPluginId, resolution.pluginDependencies, resolution.remoteRepos, session)
|
||||
);
|
||||
byte[] telemetryTrace = telemetry.shutdown();
|
||||
return new MavenServerResponse<>(new ArrayList<>(results), getLongRunningTaskStatus(longRunningTaskId, token), telemetryTrace);
|
||||
}
|
||||
}
|
||||
|
||||
private static @NotNull List<PluginResolutionData> collectPluginResolutionData(@NotNull ArrayList<PluginResolutionRequest> pluginResolutionRequests) {
|
||||
List<PluginResolutionData> resolutions = new ArrayList<>();
|
||||
|
||||
for (PluginResolutionRequest pluginResolutionRequest : pluginResolutionRequests) {
|
||||
MavenId mavenPluginId = pluginResolutionRequest.getMavenPluginId();
|
||||
int nativeMavenProjectId = pluginResolutionRequest.getNativeMavenProjectId();
|
||||
|
||||
String groupId = mavenPluginId.getGroupId();
|
||||
String artifactId = mavenPluginId.getArtifactId();
|
||||
|
||||
MavenProject project = RemoteNativeMaven40ProjectHolder.findProjectById(nativeMavenProjectId);
|
||||
List<RemoteRepository> remoteRepos = project.getRemotePluginRepositories();
|
||||
|
||||
Plugin pluginFromProject = project.getBuild().getPluginsAsMap().get(groupId + ':' + artifactId);
|
||||
List<Dependency> pluginDependencies =
|
||||
null == pluginFromProject ? Collections.emptyList() : pluginFromProject.getDependencies();
|
||||
|
||||
PluginResolutionData resolution = new PluginResolutionData(mavenPluginId, pluginDependencies, remoteRepos);
|
||||
resolutions.add(resolution);
|
||||
}
|
||||
return resolutions;
|
||||
}
|
||||
|
||||
private static class PluginResolutionData {
|
||||
MavenId mavenPluginId;
|
||||
List<Dependency> pluginDependencies;
|
||||
@@ -980,13 +986,33 @@ public class Maven40ServerEmbedderImpl extends MavenServerEmbeddedBase {
|
||||
private ArrayList<MavenArtifact> doResolveArtifacts(@NotNull LongRunningTask task,
|
||||
@NotNull Collection<MavenArtifactResolutionRequest> requests) {
|
||||
try {
|
||||
MavenExecutionRequest executionRequest =
|
||||
createRequest(null, null, null);
|
||||
ArrayList<MavenArtifact> artifacts = new ArrayList<>();
|
||||
Set<MavenRemoteRepository> repos = new LinkedHashSet<>();
|
||||
for (MavenArtifactResolutionRequest request : requests) {
|
||||
if (task.isCanceled()) break;
|
||||
MavenArtifact artifact = doResolveArtifact(request.getArtifactInfo(), request.getRemoteRepositories());
|
||||
artifacts.add(artifact);
|
||||
task.incrementFinishedRequests();
|
||||
repos.addAll(request.getRemoteRepositories());
|
||||
}
|
||||
List<ArtifactRepository> repositories = convertRepositories(new ArrayList<>(repos));
|
||||
repositories.forEach(executionRequest::addRemoteRepository);
|
||||
|
||||
executeWithMavenSession(executionRequest, MavenWorkspaceMap.empty(), task.getIndicator(), mavenSession -> {
|
||||
try {
|
||||
RepositorySystem repositorySystem = getComponent(RepositorySystem.class);
|
||||
for (MavenArtifactResolutionRequest request : requests) {
|
||||
ArtifactResult artifactResult = repositorySystem.resolveArtifact(
|
||||
mavenSession.getRepositorySession(),
|
||||
new ArtifactRequest(RepositoryUtils.toArtifact(createArtifact(request.getArtifactInfo())),
|
||||
RepositoryUtils.toRepos(repositories), null));
|
||||
artifacts.add(
|
||||
Maven40ModelConverter.convertArtifact(RepositoryUtils.toArtifact(artifactResult.getArtifact()), getLocalRepositoryFile()));
|
||||
task.incrementFinishedRequests();
|
||||
}
|
||||
}
|
||||
catch (ArtifactResolutionException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
return artifacts;
|
||||
}
|
||||
catch (Exception e) {
|
||||
@@ -994,42 +1020,6 @@ public class Maven40ServerEmbedderImpl extends MavenServerEmbeddedBase {
|
||||
}
|
||||
}
|
||||
|
||||
private MavenArtifact doResolveArtifact(MavenArtifactInfo info, List<MavenRemoteRepository> remoteRepositories) {
|
||||
Artifact resolved = doResolveArtifact(createArtifact(info), convertRepositories(remoteRepositories));
|
||||
return Maven40ModelConverter.convertArtifact(resolved, getLocalRepositoryFile());
|
||||
}
|
||||
|
||||
private Artifact doResolveArtifact(Artifact artifact, List<ArtifactRepository> remoteRepositories) {
|
||||
try {
|
||||
MavenExecutionRequest request =
|
||||
createRequest(null, null, null);
|
||||
for (ArtifactRepository artifactRepository : remoteRepositories) {
|
||||
request.addRemoteRepository(artifactRepository);
|
||||
}
|
||||
|
||||
DefaultMaven maven = (DefaultMaven)getComponent(Maven.class);
|
||||
RepositorySystemSession repositorySystemSession = maven.newRepositorySession(request);
|
||||
|
||||
initLogging(myConsoleWrapper);
|
||||
|
||||
// do not use request.getRemoteRepositories() here,
|
||||
// it can be broken after DefaultMaven#newRepositorySession => MavenRepositorySystem.injectMirror invocation
|
||||
RemoteRepositoryManager remoteRepositoryManager = getComponent(RemoteRepositoryManager.class);
|
||||
org.eclipse.aether.RepositorySystem repositorySystem = getComponent(org.eclipse.aether.RepositorySystem.class);
|
||||
List<RemoteRepository> repositories = RepositoryUtils.toRepos(remoteRepositories);
|
||||
repositories =
|
||||
remoteRepositoryManager.aggregateRepositories(repositorySystemSession, new ArrayList<>(), repositories, false);
|
||||
|
||||
ArtifactResult artifactResult = repositorySystem.resolveArtifact(
|
||||
repositorySystemSession, new ArtifactRequest(RepositoryUtils.toArtifact(artifact), repositories, null));
|
||||
|
||||
return RepositoryUtils.toArtifact(artifactResult.getArtifact());
|
||||
}
|
||||
catch (Exception e) {
|
||||
MavenServerGlobals.getLogger().info(e);
|
||||
}
|
||||
return artifact;
|
||||
}
|
||||
|
||||
private static void initLogging(Maven40ServerConsoleLogger consoleWrapper) {
|
||||
Maven40Sl4jLoggerWrapper.setCurrentWrapper(consoleWrapper);
|
||||
|
||||
+34
-22
@@ -3,10 +3,12 @@ package com.intellij.maven.server.m40.utils;
|
||||
|
||||
import org.apache.maven.RepositoryUtils;
|
||||
import org.apache.maven.artifact.Artifact;
|
||||
import org.apache.maven.model.Model;
|
||||
import org.apache.maven.model.Parent;
|
||||
import org.apache.maven.project.MavenProject;
|
||||
import org.eclipse.aether.graph.Dependency;
|
||||
import org.eclipse.aether.graph.DependencyNode;
|
||||
import org.eclipse.aether.repository.RemoteRepository;
|
||||
import org.eclipse.aether.repository.RepositoryPolicy;
|
||||
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
|
||||
import org.eclipse.aether.util.graph.transformer.ConflictResolver;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -15,46 +17,56 @@ import org.jetbrains.idea.maven.model.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* {@link Maven40AetherModelConverter} provides adapted methods of {@link Maven40ModelConverter} for aether models conversion
|
||||
*/
|
||||
public final class Maven40AetherModelConverter extends Maven40ModelConverter {
|
||||
@NotNull
|
||||
public static MavenModel convertModelWithAetherDependencyTree(Model model,
|
||||
List<String> sources,
|
||||
List<String> testSources,
|
||||
Collection<? extends Artifact> dependencies,
|
||||
public static MavenModel convertModelWithAetherDependencyTree(MavenProject mavenProject,
|
||||
Collection<? extends DependencyNode> dependencyTree,
|
||||
Collection<? extends Artifact> extensions,
|
||||
File localRepository) {
|
||||
MavenModel result = new MavenModel();
|
||||
result.setMavenId(new MavenId(model.getGroupId(), model.getArtifactId(), model.getVersion()));
|
||||
result.setMavenId(new MavenId(mavenProject.getGroupId(), mavenProject.getArtifactId(), mavenProject.getVersion()));
|
||||
|
||||
Parent parent = model.getParent();
|
||||
Parent parent = mavenProject.getModel().getParent();
|
||||
if (parent != null) {
|
||||
result.setParent(new MavenParent(new MavenId(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()),
|
||||
parent.getRelativePath()));
|
||||
result.setParent(
|
||||
new MavenParent(new MavenId(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()), parent.getRelativePath()));
|
||||
}
|
||||
result.setPackaging(model.getPackaging());
|
||||
result.setName(model.getName());
|
||||
result.setProperties(model.getProperties() == null ? new Properties() : model.getProperties());
|
||||
result.setPlugins(convertPlugins(model));
|
||||
result.setPackaging(mavenProject.getPackaging());
|
||||
result.setName(mavenProject.getName());
|
||||
result.setProperties(mavenProject.getProperties() == null ? new Properties() : mavenProject.getProperties());
|
||||
//noinspection SSBasedInspection
|
||||
result.setPlugins(convertPlugins(mavenProject.getModel()));
|
||||
|
||||
Map<Artifact, MavenArtifact> convertedArtifacts = new HashMap<>();
|
||||
result.setExtensions(convertArtifacts(extensions, convertedArtifacts, localRepository));
|
||||
result.setDependencyTree(
|
||||
convertAetherDependencyNodes(null, dependencyTree, convertedArtifacts, localRepository));
|
||||
result.setDependencies(convertArtifacts(dependencies, convertedArtifacts, localRepository));
|
||||
result.setExtensions(convertArtifacts(mavenProject.getExtensionArtifacts(), convertedArtifacts, localRepository));
|
||||
result.setDependencyTree(convertAetherDependencyNodes(null, dependencyTree, convertedArtifacts, localRepository));
|
||||
result.setDependencies(convertArtifacts(mavenProject.getArtifacts(), convertedArtifacts, localRepository));
|
||||
|
||||
result.setRemoteRepositories(convertRepositories(model.getRepositories()));
|
||||
result.setProfiles(convertProfiles(model.getProfiles()));
|
||||
result.setModules(model.getModules());
|
||||
result.setRemoteRepositories(convertAetherRepositories(mavenProject.getRemoteProjectRepositories()));
|
||||
result.setProfiles(convertProfiles(mavenProject.getModel().getProfiles()));
|
||||
result.setModules(mavenProject.getModules());
|
||||
|
||||
convertBuild(result.getBuild(), model.getBuild(), sources, testSources);
|
||||
convertBuild(result.getBuild(), mavenProject.getModel().getBuild(), mavenProject.getCompileSourceRoots(),
|
||||
mavenProject.getTestCompileSourceRoots());
|
||||
return result;
|
||||
}
|
||||
|
||||
@SuppressWarnings("SSBasedInspection")
|
||||
private static List<MavenRemoteRepository> convertAetherRepositories(List<RemoteRepository> repositories) {
|
||||
return repositories.stream().map(
|
||||
r -> new MavenRemoteRepository(r.getId(), r.getId(), r.getUrl(), "default", convertPolicy(r.getPolicy(false)),
|
||||
convertPolicy(r.getPolicy(true)))).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private static MavenRemoteRepository.@Nullable Policy convertPolicy(RepositoryPolicy policy) {
|
||||
return policy != null ? new MavenRemoteRepository.Policy(policy.isEnabled(), policy.getArtifactUpdatePolicy(),
|
||||
policy.getChecksumPolicy()) : null;
|
||||
}
|
||||
|
||||
public static List<MavenArtifactNode> convertAetherDependencyNodes(MavenArtifactNode parent,
|
||||
Collection<? extends DependencyNode> nodes,
|
||||
Map<Artifact, MavenArtifact> nativeToConvertedMap,
|
||||
|
||||
+2
-2
@@ -73,7 +73,7 @@ public class Maven40ModelConverter {
|
||||
return result;
|
||||
}
|
||||
|
||||
private static MavenPlugin convertPlugin(Plugin plugin) {
|
||||
public static MavenPlugin convertPlugin(Plugin plugin) {
|
||||
List<MavenPlugin.Execution> executions = new ArrayList<>(plugin.getExecutions().size());
|
||||
for (PluginExecution each : plugin.getExecutions()) {
|
||||
executions.add(convertExecution(each));
|
||||
@@ -202,7 +202,7 @@ public class Maven40ModelConverter {
|
||||
}
|
||||
|
||||
|
||||
private static MavenRemoteRepository.Policy convertPolicy(RepositoryPolicy policy) {
|
||||
public static MavenRemoteRepository.Policy convertPolicy(RepositoryPolicy policy) {
|
||||
return policy != null
|
||||
? new MavenRemoteRepository.Policy(policy.isEnabled(), policy.getUpdatePolicy(), policy.getChecksumPolicy())
|
||||
: null;
|
||||
|
||||
+1
-5
@@ -284,12 +284,8 @@ public class Maven40ProjectResolver {
|
||||
|
||||
List<DependencyNode> dependencyNodes = dependencyGraph != null ? dependencyGraph.getChildren() : Collections.emptyList();
|
||||
model = Maven40AetherModelConverter.convertModelWithAetherDependencyTree(
|
||||
mavenProject.getModel(),
|
||||
mavenProject.getCompileSourceRoots(),
|
||||
mavenProject.getTestCompileSourceRoots(),
|
||||
mavenProject.getArtifacts(),
|
||||
mavenProject,
|
||||
dependencyNodes,
|
||||
Collections.emptyList(), //mavenProject.getExtensionArtifacts(),
|
||||
myLocalRepositoryFile);
|
||||
}
|
||||
catch (Exception e) {
|
||||
|
||||
+16
@@ -3,11 +3,27 @@ package org.jetbrains.idea.maven.importing
|
||||
|
||||
import com.intellij.jarRepository.RemoteRepositoriesConfiguration
|
||||
import com.intellij.maven.testFramework.MavenMultiVersionImportingTestCase
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.testFramework.UsefulTestCase
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.junit.Test
|
||||
|
||||
class RepositoriesImportingTest : MavenMultiVersionImportingTestCase() {
|
||||
|
||||
|
||||
@Test
|
||||
fun importSimpleProject() = runBlocking {
|
||||
importProjectAsync("""
|
||||
<groupId>test</groupId>
|
||||
<artifactId>project</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<version>1</version>
|
||||
""".trimIndent())
|
||||
val mavenProject = projectsManager.findProject(projectPom)
|
||||
assertNotNull(mavenProject)
|
||||
UsefulTestCase.assertSameElements(mavenProject!!.remoteRepositories.map { it.url }, "https://repo.maven.apache.org/maven2")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testMirrorCentralImport() = runBlocking {
|
||||
val oldSettingsFile = mavenGeneralSettings.userSettingsFile
|
||||
|
||||
Reference in New Issue
Block a user