diff --git a/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/TychoConstants.java b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/TychoConstants.java index ac7480d14d..c95299c6b0 100644 --- a/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/TychoConstants.java +++ b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/TychoConstants.java @@ -23,6 +23,7 @@ public interface TychoConstants { // static final String CTX_TARGET_PLATFORM -> moved to TargetPlatform.FINAL_TARGET_PLATFORM_KEY; static final String CTX_DEPENDENCY_ARTIFACTS = CTX_BASENAME + "/dependencyArtifacts"; + static final String CTX_REPOSITORY_REFERENCE = CTX_BASENAME + "/repositoryReference"; /** * Stores test-specific dependencies (usually derived from .classpath) */ diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java index e9cd9893bc..f2d46e8d98 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerImpl.java @@ -9,7 +9,7 @@ * * Contributors: * SAP SE - initial API and implementation - * Christoph Läubrich - Adjust to new API + * Christoph Läubrich - Issue #697 - Failed to resolve dependencies with Tycho 2.7.0 for custom repositories *******************************************************************************/ package org.eclipse.tycho.p2.manager; @@ -17,6 +17,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.eclipse.equinox.internal.p2.core.helpers.FileUtils; import org.eclipse.equinox.p2.core.IProvisioningAgent; @@ -24,11 +25,14 @@ import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ReactorProjectIdentities; +import org.eclipse.tycho.TychoConstants; import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration; +import org.eclipse.tycho.core.shared.MavenArtifactRepositoryReference; import org.eclipse.tycho.p2.resolver.facade.P2ResolverFactory; import org.eclipse.tycho.p2.target.PreliminaryTargetPlatformImpl; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; +import org.eclipse.tycho.p2.target.facade.TargetDefinition.MavenGAVLocation; import org.eclipse.tycho.p2.target.facade.TargetPlatformConfigurationStub; import org.eclipse.tycho.p2.target.facade.TargetPlatformFactory; import org.eclipse.tycho.repository.module.PublishingRepositoryImpl; @@ -85,6 +89,12 @@ public TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, // at this point, there is only incomplete ("dependency-only") metadata for the reactor projects TargetPlatform result = tpFactory.createTargetPlatform(tpConfiguration, eeConfiguration, reactorProjects); project.setContextValue(PRELIMINARY_TARGET_PLATFORM_KEY, result); + + List repositoryReferences = tpConfiguration.getTargetDefinitions().stream() + .flatMap(definition -> definition.getLocations().stream()).filter(MavenGAVLocation.class::isInstance) + .map(MavenGAVLocation.class::cast).flatMap(location -> location.getRepositoryReferences().stream()) + .collect(Collectors.toList()); + project.setContextValue(TychoConstants.CTX_REPOSITORY_REFERENCE, repositoryReferences); return result; } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java index 6f81548a94..9e9757be19 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java @@ -9,22 +9,29 @@ * Sonatype Inc. - initial API and implementation * SAP AG - inject nested class path elements into maven model (TYCHO-483) * Christoph Läubrich - Issue #443 - Use regular Maven coordinates -when possible- for dependencies - * - Issue #581 - Use the correct scope when injecting dependencies into the maven model + * - Issue #581 - Use the correct scope when injecting dependencies into the maven model + * - Issue #697 - Failed to resolve dependencies with Tycho 2.7.0 for custom repositories *******************************************************************************/ package org.eclipse.tycho.core.maven; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.Function; +import java.util.stream.Collectors; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.project.MavenProject; +import org.apache.maven.repository.RepositorySystem; import org.codehaus.plexus.logging.Logger; import org.eclipse.tycho.ArtifactDescriptor; import org.eclipse.tycho.ArtifactKey; @@ -35,6 +42,8 @@ import org.eclipse.tycho.TychoConstants; import org.eclipse.tycho.artifacts.DependencyArtifacts; import org.eclipse.tycho.core.osgitools.BundleReader; +import org.eclipse.tycho.core.osgitools.DefaultReactorProject; +import org.eclipse.tycho.core.shared.MavenArtifactRepositoryReference; public final class MavenDependencyInjector { @@ -49,7 +58,8 @@ public final class MavenDependencyInjector { */ public static void injectMavenDependencies(MavenProject project, DependencyArtifacts dependencies, DependencyArtifacts testDependencies, BundleReader bundleReader, - Function descriptorMapping, Logger logger) { + Function descriptorMapping, Logger logger, + RepositorySystem repositorySystem) { MavenDependencyInjector generator = new MavenDependencyInjector(project, bundleReader, descriptorMapping, logger); for (ArtifactDescriptor artifact : dependencies.getArtifacts()) { @@ -60,6 +70,44 @@ public static void injectMavenDependencies(MavenProject project, DependencyArtif .filter(testDep -> dependencies.getArtifact(testDep.getKey()) == null) // .forEach(descriptor -> generator.addDependency(descriptor, Artifact.SCOPE_TEST)); } + ReactorProject reactorProject = DefaultReactorProject.adapt(project); + @SuppressWarnings("unchecked") + Collection repositoryReferences = (Collection) reactorProject + .getContextValue(TychoConstants.CTX_REPOSITORY_REFERENCE); + if (repositoryReferences != null && !repositoryReferences.isEmpty()) { + Map repositoryMap = project.getRemoteArtifactRepositories().stream() + .collect(Collectors.toMap(MavenDependencyInjector::getId, Function.identity(), (a, b) -> a, + LinkedHashMap::new)); + for (MavenArtifactRepositoryReference reference : repositoryReferences) { + String id = getId(reference); + ArtifactRepository artifactRepository = repositoryMap.get(id); + if (artifactRepository == null) { + repositoryMap.put(id, + repositorySystem.createArtifactRepository(id, reference.getUrl(), null, null, null)); + } else if (!artifactRepository.getUrl().equals(reference.getUrl())) { + logger.warn("Target defines an artifact repository with the ID " + id + + " but there is already a repository for that ID mapped to a different URL! (target URL = " + + reference.getUrl() + ", existing URL = " + artifactRepository.getUrl()); + } + } + project.setRemoteArtifactRepositories(new ArrayList(repositoryMap.values())); + } + } + + private static String getId(MavenArtifactRepositoryReference reference) { + String id = reference.getId(); + if (id == null || id.isBlank()) { + return reference.getUrl(); + } + return id; + } + + private static String getId(ArtifactRepository repository) { + String id = repository.getId(); + if (id == null || id.isBlank()) { + return repository.getUrl(); + } + return id; } private final BundleReader bundleReader; diff --git a/tycho-its/projects/issue697/bundle1/META-INF/MANIFEST.MF b/tycho-its/projects/issue697/bundle1/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..1cb3837628 --- /dev/null +++ b/tycho-its/projects/issue697/bundle1/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: bundle +Bundle-SymbolicName: bundle +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: bundle +Require-Bundle: wrapped.de.monticore.monticore-runtime;bundle-version="7.2.0" diff --git a/tycho-its/projects/issue697/bundle1/build.properties b/tycho-its/projects/issue697/bundle1/build.properties new file mode 100644 index 0000000000..b107977f4e --- /dev/null +++ b/tycho-its/projects/issue697/bundle1/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +bin.includes = META-INF/,\ + . diff --git a/tycho-its/projects/issue697/bundle1/pom.xml b/tycho-its/projects/issue697/bundle1/pom.xml new file mode 100644 index 0000000000..ff79bb7f0e --- /dev/null +++ b/tycho-its/projects/issue697/bundle1/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + tycho-its-project + issue697 + 0.0.1-SNAPSHOT + + bundle + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/tycho-its/projects/issue697/bundle2/META-INF/MANIFEST.MF b/tycho-its/projects/issue697/bundle2/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..5c3eb0aace --- /dev/null +++ b/tycho-its/projects/issue697/bundle2/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: bundle2 +Bundle-SymbolicName: bundle2 +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: bundle2 +Require-Bundle: dsltool-api;bundle-version="0.0.1" diff --git a/tycho-its/projects/issue697/bundle2/build.properties b/tycho-its/projects/issue697/bundle2/build.properties new file mode 100644 index 0000000000..b107977f4e --- /dev/null +++ b/tycho-its/projects/issue697/bundle2/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +bin.includes = META-INF/,\ + . diff --git a/tycho-its/projects/issue697/bundle2/pom.xml b/tycho-its/projects/issue697/bundle2/pom.xml new file mode 100644 index 0000000000..d47405bdbf --- /dev/null +++ b/tycho-its/projects/issue697/bundle2/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + tycho-its-project + issue697 + 0.0.1-SNAPSHOT + + bundle2 + 1.0.0-SNAPSHOT + eclipse-plugin + diff --git a/tycho-its/projects/issue697/pom.xml b/tycho-its/projects/issue697/pom.xml new file mode 100644 index 0000000000..93d9575890 --- /dev/null +++ b/tycho-its/projects/issue697/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + tycho-its-project + issue697 + 0.0.1-SNAPSHOT + pom + + + target-platform + bundle1 + bundle2 + + + + 11 + 11 + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + tycho-versions-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + + + tycho-its-project + target-platform + 0.0.1-SNAPSHOT + + + + + + + \ No newline at end of file diff --git a/tycho-its/projects/issue697/target-platform/pom.xml b/tycho-its/projects/issue697/target-platform/pom.xml new file mode 100644 index 0000000000..882dc3626c --- /dev/null +++ b/tycho-its/projects/issue697/target-platform/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + tycho-its-project + issue697 + 0.0.1-SNAPSHOT + + target-platform + 0.0.1-SNAPSHOT + eclipse-target-definition + diff --git a/tycho-its/projects/issue697/target-platform/target-platform.target b/tycho-its/projects/issue697/target-platform/target-platform.target new file mode 100644 index 0000000000..8c41c08c7d --- /dev/null +++ b/tycho-its/projects/issue697/target-platform/target-platform.target @@ -0,0 +1,28 @@ + + + + + + + + de.monticore + dsltool-api + 0.0.1 + jar + + + de.monticore + monticore-runtime + 7.2.0 + jar + + + + + rwth + https://nexus.se.rwth-aachen.de/repository/monticore/ + + + + + \ No newline at end of file diff --git a/tycho-its/src/test/java/org/eclipse/tycho/test/issue697/Issue697Test.java b/tycho-its/src/test/java/org/eclipse/tycho/test/issue697/Issue697Test.java new file mode 100644 index 0000000000..342b3bf599 --- /dev/null +++ b/tycho-its/src/test/java/org/eclipse/tycho/test/issue697/Issue697Test.java @@ -0,0 +1,18 @@ +package org.eclipse.tycho.test.issue697; + +import java.util.List; + +import org.apache.maven.it.Verifier; +import org.eclipse.tycho.test.AbstractTychoIntegrationTest; +import org.junit.Test; + +public class Issue697Test extends AbstractTychoIntegrationTest { + + @Test + public void test() throws Exception { + Verifier verifier = getVerifier("issue697"); + + verifier.executeGoals(List.of("clean", "verify")); + verifier.verifyErrorFreeLog(); + } +} diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java index 1434facf5d..d53b3380d2 100644 --- a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java +++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2DependencyResolver.java @@ -498,6 +498,6 @@ public void initialize() throws InitializationException { public void injectDependenciesIntoMavenModel(MavenProject project, AbstractTychoProject projectType, DependencyArtifacts dependencyArtifacts, DependencyArtifacts testDependencyArtifacts, Logger logger) { MavenDependencyInjector.injectMavenDependencies(project, dependencyArtifacts, testDependencyArtifacts, - bundleReader, resolverFactory::resolveDependencyDescriptor, logger); + bundleReader, resolverFactory::resolveDependencyDescriptor, logger, repositorySystem); } }