diff --git a/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java b/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java index 34fac3b860..9f5a41e46c 100644 --- a/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java +++ b/target-platform-configuration/src/main/java/org/eclipse/tycho/target/TargetPlatformMojo.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013 SAP AG and others. + * Copyright (c) 2013, 2021 SAP AG and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP AG - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.target; @@ -19,7 +20,9 @@ import java.util.List; import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.LegacySupport; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; @@ -30,9 +33,12 @@ import org.eclipse.sisu.equinox.EquinoxServiceFactory; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ReactorProjectIdentities; +import org.eclipse.tycho.core.DependencyResolver; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; +import org.eclipse.tycho.core.resolver.DefaultDependencyResolverFactory; import org.eclipse.tycho.p2.repository.GAV; import org.eclipse.tycho.p2.repository.RepositoryLayoutHelper; +import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; import org.eclipse.tycho.repository.registry.facade.ReactorRepositoryManagerFacade; @Mojo(name = "target-platform", threadSafe = true) @@ -49,13 +55,24 @@ public class TargetPlatformMojo extends AbstractMojo { @Component private Logger logger; + @Component + private LegacySupport legacySupport; + + @Component + private DefaultDependencyResolverFactory dependencyResolverLocator; + @Override public void execute() throws MojoExecutionException, MojoFailureException { synchronized (LOCK) { ReactorRepositoryManagerFacade repositoryManager = osgiServices .getService(ReactorRepositoryManagerFacade.class); List upstreamProjects = getReferencedTychoProjects(); - repositoryManager.computeFinalTargetPlatform(DefaultReactorProject.adapt(project), upstreamProjects); + ReactorProject reactorProject = DefaultReactorProject.adapt(project); + MavenSession session = legacySupport.getSession(); + DependencyResolver dependencyResolver = dependencyResolverLocator.lookupDependencyResolver(project); + PomDependencyCollector pomDependenciesCollector = dependencyResolver.resolvePomDependencies(session, + project); + repositoryManager.computeFinalTargetPlatform(reactorProject, upstreamProjects, pomDependenciesCollector); } } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java index 53709fa479..1a583a6ed9 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/manager/ReactorRepositoryManagerTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2020 SAP SE and others. + * Copyright (c) 2013, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -84,12 +84,12 @@ public void testTargetPlatformComputationInIntegration() throws Exception { tpConfig.addP2Repository( new MavenRepositoryLocation(null, ResourceUtil.resourceFile("repositories/launchers").toURI())); subject.computePreliminaryTargetPlatform(currentProject, tpConfig, - new ExecutionEnvironmentConfigurationStub("JavaSE-1.7"), null, pomDependencyCollector); + new ExecutionEnvironmentConfigurationStub("JavaSE-1.7"), null); ReactorProjectIdentities upstreamProject = new ReactorProjectIdentitiesStub( ResourceUtil.resourceFile("projectresult")); - subject.computeFinalTargetPlatform(currentProject, Arrays.asList(upstreamProject)); + subject.computeFinalTargetPlatform(currentProject, Arrays.asList(upstreamProject), pomDependencyCollector); P2TargetPlatform finalTP = (P2TargetPlatform) currentProject .getContextValue("org.eclipse.tycho.core.TychoConstants/targetPlatform"); diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java index 12b29e7e05..d16045499e 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/resolver/P2ResolverTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2020 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -506,11 +506,11 @@ public void testResolveWithoutProject() throws Exception { } private P2TargetPlatform getTargetPlatform() { - return tpFactory.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects, pomDependencies); + return tpFactory.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects); } private P2TargetPlatform getTargetPlatform(ExecutionEnvironmentResolutionHandler eeResolutionHandler) { - return tpFactory.createTargetPlatform(tpConfig, eeResolutionHandler, reactorProjects, pomDependencies); + return tpFactory.createTargetPlatform(tpConfig, eeResolutionHandler, reactorProjects); } private static P2ResolutionResult singleEnv(Map map) { diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java index 83e932da49..aee78cbca1 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/PomDependencyCollectorTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2020 Sonatype Inc. and others. + * Copyright (c) 2011, 2021 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -103,7 +103,7 @@ static ArtifactMock existingMetadata() { private Collection getTargetPlatformUnits() { TestResolverFactory resolverFactory = new TestResolverFactory(logVerifier.getLogger()); P2TargetPlatform platform = resolverFactory.getTargetPlatformFactoryImpl() - .createTargetPlatform(new TargetPlatformConfigurationStub(), NOOP_EE_RESOLUTION_HANDLER, null, subject); + .createTargetPlatform(new TargetPlatformConfigurationStub(), NOOP_EE_RESOLUTION_HANDLER, null); return platform.getInstallableUnits(); } } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java index c614f3051e..14d1c90309 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2020 SAP SE and others. + * Copyright (c) 2008, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -98,11 +98,11 @@ public void setUpSubjectAndContext() throws Exception { public void testFinalTargetPlatformNotContainsPreliminaryReactorIU() throws Exception { List preliminaryReactor = Arrays.asList(createReactorProject("artifactId", "reactor.id", null)); P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, - preliminaryReactor, pomDependencyCollector); + preliminaryReactor); // final TP without any reactor content P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), not(hasItem(unitWithId("reactor.id")))); } @@ -110,11 +110,10 @@ public void testFinalTargetPlatformNotContainsPreliminaryReactorIU() throws Exce @Test public void testFinalTargetPlatformContainsExternalRepoIU() throws Exception { tpConfig.addP2Repository(ResourceUtil.resourceFile("repositories/launchers").toURI()); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unitWithId("org.eclipse.equinox.launcher"))); } @@ -122,11 +121,10 @@ public void testFinalTargetPlatformContainsExternalRepoIU() throws Exception { @Test public void testFinalTargetPlatformContainsTargetFileIU() { tpConfig.addTargetDefinition(targetDefinition(TestRepositories.V1_AND_V2, MAIN_BUNDLE)); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit(MAIN_BUNDLE.getId(), MAIN_BUNDLE.getVersion().toString()))); @@ -136,11 +134,10 @@ public void testFinalTargetPlatformContainsTargetFileIU() { public void testFinalTargetPlatformContainsPomDependencyIU() throws Exception { pomDependencyCollector.addArtifactWithExistingMetadata(PomDependencyCollectorTest.artifactWithClassifier(null), PomDependencyCollectorTest.existingMetadata()); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unitWithId("test.unit"))); } @@ -148,24 +145,22 @@ public void testFinalTargetPlatformContainsPomDependencyIU() throws Exception { @Test public void testFinalTargetPlatformContainsExecutionEnvironmentIU() throws Exception { P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, ExecutionEnvironmentTestUtils - .standardEEResolutionHintProvider(new ExecutionEnvironmentStub("J2SE-1.4")), null, - pomDependencyCollector); + .standardEEResolutionHintProvider(new ExecutionEnvironmentStub("J2SE-1.4")), null); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit("a.jre.j2se", "1.4.0"))); } @Test public void testFinalTargetPlatformContainsFinalReactorIU() throws Exception { - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); Map finalUnits = Collections .singletonMap(InstallableUnitUtil.createIU("bundle", "1.2.0"), DUMMY_PROJECT); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, finalUnits, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit("bundle", "1.2.0"))); } @@ -180,7 +175,7 @@ public void testConfiguredFiltersOnReactorIUsInPreliminaryTP() throws Exception ReactorProject reactorProject = createReactorProject("artifactId", "test.feature.feature.group", "iu.p2.inf"); P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, - Collections.singletonList(reactorProject), pomDependencyCollector); + Collections.singletonList(reactorProject)); assertThat(preliminaryTP.getInstallableUnits(), hasItem(unitWithId("test.feature.feature.group"))); assertThat(preliminaryTP.getInstallableUnits(), not(hasItem(unitWithId("iu.p2.inf")))); @@ -191,14 +186,13 @@ public void testConfiguredFiltersOnReactorIUsInFinalTP() throws Exception { TargetPlatformFilter filter = TargetPlatformFilter.removeAllFilter( CapabilityPattern.patternWithoutVersion(CapabilityType.P2_INSTALLABLE_UNIT, "iu.p2.inf")); tpConfig.addFilters(Arrays.asList(filter)); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); Map finalUnits = new HashMap<>(); finalUnits.put(InstallableUnitUtil.createIU("test.feature.feature.group"), DUMMY_PROJECT); finalUnits.put(InstallableUnitUtil.createIU("iu.p2.inf"), DUMMY_PROJECT); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, finalUnits, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unitWithId("test.feature.feature.group"))); assertThat(finalTP.getInstallableUnits(), not(hasItem(unitWithId("iu.p2.inf")))); @@ -213,12 +207,11 @@ public void testConfiguredFiltersOnPomDependencies() throws Exception { CapabilityPattern.patternWithoutVersion(CapabilityType.P2_INSTALLABLE_UNIT, "test.unit")); tpConfig.addFilters(Arrays.asList(filter)); - P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); assertThat(preliminaryTP.getInstallableUnits(), not(hasItem(unitWithId("test.unit")))); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, null, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), not(hasItem(unitWithId("test.unit")))); } @@ -230,7 +223,7 @@ public void testOtherVersionsOfReactorIUsAreFilteredFromExternalContent() throws // reactor artifact produces a unit with same ID ReactorProject reactorProject = createReactorProject("artifactId", "trt.bundle/1.5.5.qualifier", null); P2TargetPlatform preliminaryTP = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, - Collections.singletonList(reactorProject), pomDependencyCollector); + Collections.singletonList(reactorProject)); assertThat(preliminaryTP.getInstallableUnits(), hasItem(unit("trt.bundle", "1.5.5.qualifier"))); assertThat(preliminaryTP.getInstallableUnits(), not(hasItem(unit("trt.bundle", "1.0.0.201108051343")))); @@ -238,7 +231,7 @@ public void testOtherVersionsOfReactorIUsAreFilteredFromExternalContent() throws Map finalUnits = Collections.singletonMap( InstallableUnitUtil.createIU("trt.bundle", "1.5.5.20140216"), reactorProject.getIdentities()); P2TargetPlatform finalTP = subject.createTargetPlatformWithUpdatedReactorUnits(preliminaryTP, finalUnits, - REACTOR_ARTIFACTS); + REACTOR_ARTIFACTS, pomDependencyCollector); assertThat(finalTP.getInstallableUnits(), hasItem(unit("trt.bundle", "1.5.5.20140216"))); assertThat(finalTP.getInstallableUnits(), not(hasItem(unit("trt.bundle", "1.0.0.201108051343")))); @@ -253,12 +246,10 @@ public void testIncludeLocalMavenRepo() throws Exception { new GAV("test", "foo", "1.0.0")); subject = factory.getTargetPlatformFactoryImpl(); Collection iusIncludingLocalRepo = subject - .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, pomDependencyCollector) - .getInstallableUnits(); + .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null).getInstallableUnits(); tpConfig.setForceIgnoreLocalArtifacts(true); Collection iusWithoutLocalRepo = subject - .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, pomDependencyCollector) - .getInstallableUnits(); + .createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null).getInstallableUnits(); Set retainedIUs = new HashSet<>(iusIncludingLocalRepo); retainedIUs.removeAll(iusWithoutLocalRepo); assertEquals(1, retainedIUs.size()); @@ -269,8 +260,7 @@ public void testIncludeLocalMavenRepo() throws Exception { public void testMultipleIndependentlyResolvedTargetFiles() throws Exception { tpConfig.addTargetDefinition(plannerTargetDefinition(TestRepositories.V1, REFERENCED_BUNDLE_V1)); tpConfig.addTargetDefinition(plannerTargetDefinition(TestRepositories.V2, REFERENCED_BUNDLE_V2)); - P2TargetPlatform tp = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null, - pomDependencyCollector); + P2TargetPlatform tp = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, null); // platforms must have been resolved in two planner calls because otherwise the singleton bundles would have collided assertThat(tp.getInstallableUnits(), hasItem(unitWithIdAndVersion(REFERENCED_BUNDLE_V1))); @@ -282,7 +272,7 @@ public void testDuplicateReactorUnits() throws Exception { List reactorProjects = new ArrayList<>(); reactorProjects.add(createReactorProject("project1", "unit.a", "unit.b")); reactorProjects.add(createReactorProject("project2", "unit.b", null)); - subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects, pomDependencyCollector); + subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects); } private static TargetDefinition plannerTargetDefinition(TestRepositories repository, IVersionedId unit) { diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java index 225a26fba6..784cee5a27 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl.test/src/test/java/org/eclipse/tycho/p2/target/ee/CustomEEResolutionHandlerTest.java @@ -76,7 +76,7 @@ public void testReadFullSpecificationFromTargetPlatform() throws Exception { * (which is wrapped around the eeConfigurationCapture argument by the called method) * correctly reads the custom profile specification from the target platform. */ - tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null, pomDependencyCollector); + tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null); List result = eeConfigurationCapture.capturedSystemCapabilities; @@ -95,7 +95,7 @@ public void testMissingSpecificationInTargetPlatform() throws Exception { "MissingProfile-1.2.3"); Exception e = assertThrows(Exception.class, - () -> tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null, pomDependencyCollector)); + () -> tpFactory.createTargetPlatform(tpConfig, eeConfigurationCapture, null)); assertTrue(e.getMessage().contains( "Could not find specification for custom execution environment profile 'MissingProfile-1.2.3'")); } 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 407b5d3f8d..e9cd9893bc 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2015 SAP SE and others. + * Copyright (c) 2012, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP SE - initial API and implementation + * Christoph Läubrich - Adjust to new API *******************************************************************************/ package org.eclipse.tycho.p2.manager; @@ -26,9 +27,7 @@ import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration; import org.eclipse.tycho.p2.resolver.facade.P2ResolverFactory; -import org.eclipse.tycho.p2.target.P2TargetPlatform; import org.eclipse.tycho.p2.target.PreliminaryTargetPlatformImpl; -import org.eclipse.tycho.p2.target.TargetPlatformFactoryImpl; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; import org.eclipse.tycho.p2.target.facade.TargetPlatformConfigurationStub; import org.eclipse.tycho.p2.target.facade.TargetPlatformFactory; @@ -81,26 +80,25 @@ public PublishingRepository getPublishingRepository(ReactorProjectIdentities pro @Override public TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfiguration, - List reactorProjects, PomDependencyCollector pomDependencies) { + List reactorProjects) { + // // at this point, there is only incomplete ("dependency-only") metadata for the reactor projects - TargetPlatform result = tpFactory.createTargetPlatform(tpConfiguration, eeConfiguration, reactorProjects, - pomDependencies); + TargetPlatform result = tpFactory.createTargetPlatform(tpConfiguration, eeConfiguration, reactorProjects); project.setContextValue(PRELIMINARY_TARGET_PLATFORM_KEY, result); return result; } @Override public void computeFinalTargetPlatform(ReactorProject project, - List upstreamProjects) { + List upstreamProjects, PomDependencyCollector pomDependencyCollector) { PreliminaryTargetPlatformImpl preliminaryTargetPlatform = getRegisteredPreliminaryTargetPlatform(project); if (preliminaryTargetPlatform == null) { // project doesn't seem to use resolver=p2 return; } - List upstreamProjectResults = getBuildResults(upstreamProjects); - P2TargetPlatform result = ((TargetPlatformFactoryImpl) tpFactory) - .createTargetPlatformWithUpdatedReactorContent(preliminaryTargetPlatform, upstreamProjectResults); + TargetPlatform result = tpFactory.createTargetPlatformWithUpdatedReactorContent(preliminaryTargetPlatform, + upstreamProjectResults, pomDependencyCollector); project.setContextValue(FINAL_TARGET_PLATFORM_KEY, result); } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java index 0657a6d5ba..b1ed7d66e3 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2021 Sonatype Inc. and others. + * Copyright (c) 2008, 2022 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -11,7 +11,8 @@ * Sonatype Inc. - initial API and implementation * Rapicorp, Inc. - add support for IU type (428310) * Christoph Läubrich - Bug 572481 - Tycho does not understand "additional.bundles" directive in build.properties - * #82 Support resolving of non-project IUs in P2Resolver + * - Issue #82 - Support resolving of non-project IUs in P2Resolver + * - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.resolver; @@ -58,6 +59,7 @@ import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration; import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfigurationStub; +import org.eclipse.tycho.core.resolver.shared.PomDependencies; import org.eclipse.tycho.core.shared.MavenLogger; import org.eclipse.tycho.core.shared.MultiLineLogger; import org.eclipse.tycho.core.shared.TargetEnvironment; @@ -94,6 +96,8 @@ public class P2ResolverImpl implements P2Resolver { private Set usedTargetPlatformUnits; + private PomDependencies pomDependencies = PomDependencies.ignore; + public P2ResolverImpl(TargetPlatformFactoryImpl targetPlatformFactory, MavenLogger logger) { this.targetPlatformFactory = targetPlatformFactory; this.logger = logger; @@ -167,8 +171,7 @@ public P2ResolutionResult collectProjectDependencies(TargetPlatform context, Rea @Override public P2ResolutionResult resolveMetadata(TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfig) { - P2TargetPlatform contextImpl = targetPlatformFactory.createTargetPlatform(tpConfiguration, eeConfig, null, - null); + P2TargetPlatform contextImpl = targetPlatformFactory.createTargetPlatform(tpConfiguration, eeConfig, null); ResolutionDataImpl data = new ResolutionDataImpl(contextImpl.getEEResolutionHints()); data.setAvailableIUs(contextImpl.getInstallableUnits()); @@ -196,7 +199,7 @@ public P2ResolutionResult resolveMetadata(TargetPlatformConfigurationStub tpConf public P2ResolutionResult getTargetPlatformAsResolutionResult(TargetPlatformConfigurationStub tpConfiguration, String eeName) { P2TargetPlatform targetPlatform = targetPlatformFactory.createTargetPlatform(tpConfiguration, - new ExecutionEnvironmentConfigurationStub(eeName), null, null); + new ExecutionEnvironmentConfigurationStub(eeName), null); MetadataOnlyP2ResolutionResult result = new MetadataOnlyP2ResolutionResult(); for (IInstallableUnit iu : targetPlatform.getInstallableUnits()) { @@ -229,7 +232,18 @@ protected P2ResolutionResult resolveDependencies(Collection ro strategy.setData(data); Collection newState; try { + data.setFailOnMissing(pomDependencies == PomDependencies.ignore); newState = strategy.resolve(environment, monitor); + if (pomDependencies != PomDependencies.ignore) { + Collection missingRequirements = data.getMissingRequirements(); + if (missingRequirements.size() > 0) { + logger.info( + "The following requirements are not satisfied yet and must be provided through pom dependencies:"); + for (IRequirement requirement : missingRequirements) { + logger.info(" - " + requirement); + } + } + } } catch (ResolverException e) { logger.info(e.getSelectionContext()); logger.error("Cannot resolve project dependencies:"); @@ -524,4 +538,9 @@ private static void addDependenciesForTests(Consumer requirementsC requirementsConsumer.accept(optionalGreedyRequirementTo("org.eclipse.ui.ide.application")); } + @Override + public void setPomDependencies(PomDependencies pomDependencies) { + this.pomDependencies = pomDependencies; + } + } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java index 926459293a..d07bfc16d6 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PreliminaryTargetPlatformImpl.java @@ -15,6 +15,7 @@ package org.eclipse.tycho.p2.target; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; @@ -25,7 +26,6 @@ import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; import org.eclipse.tycho.ReactorProjectIdentities; import org.eclipse.tycho.core.shared.MavenLogger; -import org.eclipse.tycho.p2.metadata.IArtifactFacade; import org.eclipse.tycho.p2.target.filters.TargetPlatformFilterEvaluator; import org.eclipse.tycho.p2.util.resolution.ExecutionEnvironmentResolutionHints; import org.eclipse.tycho.repository.local.LocalArtifactRepository; @@ -53,12 +53,12 @@ public class PreliminaryTargetPlatformImpl extends TargetPlatformBaseImpl { private final boolean includeLocalRepo; public PreliminaryTargetPlatformImpl(Map reactorProjectIUs, - Collection externalIUs, Map mavenArtifactIUs, - ExecutionEnvironmentResolutionHints executionEnvironment, TargetPlatformFilterEvaluator filter, - LocalMetadataRepository localMetadataRepository, IRawArtifactFileProvider externalArtifacts, - LocalArtifactRepository localArtifactRepository, boolean includeLocalRepo, MavenLogger logger) { + Collection externalIUs, ExecutionEnvironmentResolutionHints executionEnvironment, + TargetPlatformFilterEvaluator filter, LocalMetadataRepository localMetadataRepository, + IRawArtifactFileProvider externalArtifacts, LocalArtifactRepository localArtifactRepository, + boolean includeLocalRepo, MavenLogger logger) { super(collectAllInstallableUnits(reactorProjectIUs, externalIUs, executionEnvironment), executionEnvironment, - externalArtifacts, localArtifactRepository, reactorProjectIUs, mavenArtifactIUs); + externalArtifacts, localArtifactRepository, reactorProjectIUs, new HashMap<>()); this.externalIUs = externalIUs; this.filter = filter; this.localMetadataRepository = localMetadataRepository; diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java index e5216d092d..978c5bbe2a 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformFactoryImpl.java @@ -14,11 +14,13 @@ * Christoph Läubrich - [Bug 538144] Support other target locations (Directory, Features, Installations) * - [Bug 533747] Target file is read and parsed over and over again * - [Bug 567098] pomDependencies=consider should wrap non-osgi jars + * - [Issue #462] Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.target; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -122,10 +124,25 @@ public TargetPlatformFactoryImpl(MavenContext mavenContext, IProvisioningAgent r @Override public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpConfiguration, - ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects, - PomDependencyCollector pomDependencies) { + ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects) { return createTargetPlatform(tpConfiguration, ExecutionEnvironmentResolutionHandler.adapt(eeConfiguration), - reactorProjects, pomDependencies); + reactorProjects); + } + + @SuppressWarnings("unchecked") + @Override + public P2TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, + List results, PomDependencyCollector pomDependencies) { + PomDependencyCollectorImpl pomDependenciesContent; + if (pomDependencies instanceof PomDependencyCollectorImpl) { + pomDependenciesContent = (PomDependencyCollectorImpl) pomDependencies; + } else { + logger.debug("Using empty PomDependencyCollector instead of given = " + pomDependencies); + pomDependenciesContent = new PomDependencyCollectorImpl(mavenContext, null); + } + return createTargetPlatformWithUpdatedReactorUnits(baseTargetPlatform, + extractProjectResultIUs((List) results), + getProjectArtifactProviders((List) results), pomDependenciesContent); } /** @@ -149,31 +166,17 @@ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpC * ExecutionEnvironmentConfiguration, List, PomDependencyCollector) */ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpConfiguration, - ExecutionEnvironmentResolutionHandler eeResolutionHandler, List reactorProjects, - PomDependencyCollector pomDependencies) { - if (pomDependencies == null) { - pomDependencies = new PomDependencyCollectorImpl(mavenContext, null); - } + ExecutionEnvironmentResolutionHandler eeResolutionHandler, List reactorProjects) { + List targetFileContent = resolveTargetDefinitions(tpConfiguration, eeResolutionHandler.getResolutionHints()); - - PomDependencyCollectorImpl pomDependenciesContent = (PomDependencyCollectorImpl) pomDependencies; - - // TODO 372780 get rid of this special handling of pomDependency artifacts: there should be one p2 artifact repo view on the target platform - IRawArtifactFileProvider pomDependencyArtifactRepo = pomDependenciesContent.getArtifactRepoOfPublishedBundles(); - RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey - .forResolutionContextArtifacts(pomDependenciesContent.getProjectLocation()); - ArtifactRepositoryBlackboard.putRepository(blackboardKey, new ProviderOnlyArtifactRepository( - pomDependencyArtifactRepo, Activator.getProvisioningAgent(), blackboardKey.toURI())); - logger.debug("Registered artifact repository " + blackboardKey); - Set completeRepositories = tpConfiguration.getP2Repositories(); registerRepositoryIDs(completeRepositories); // collect & process metadata boolean includeLocalMavenRepo = shouldIncludeLocallyInstalledUnits(tpConfiguration); LinkedHashSet externalUIs = gatherExternalInstallableUnits(completeRepositories, - targetFileContent, pomDependenciesContent, includeLocalMavenRepo); + targetFileContent, includeLocalMavenRepo); Map reactorProjectUIs = getPreliminaryReactorProjectUIs( reactorProjects); @@ -188,11 +191,10 @@ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpC PreliminaryTargetPlatformImpl targetPlatform = new PreliminaryTargetPlatformImpl(reactorProjectUIs, // externalUIs, // - pomDependenciesContent.getMavenInstallableUnits(), // eeResolutionHandler.getResolutionHints(), // filter, // localMetadataRepository, // - createExternalArtifactProvider(completeRepositories, targetFileContent, pomDependencyArtifactRepo, + createExternalArtifactProvider(completeRepositories, targetFileContent, tpConfiguration.getIncludePackedArtifacts()), // localArtifactRepository, // includeLocalMavenRepo, // @@ -260,7 +262,7 @@ private boolean shouldIncludeLocallyInstalledUnits(TargetPlatformConfigurationSt */ private LinkedHashSet gatherExternalInstallableUnits( Set completeRepositories, List targetDefinitionsContent, - PomDependencyCollectorImpl pomDependenciesContent, boolean includeLocalMavenRepo) { + boolean includeLocalMavenRepo) { LinkedHashSet result = new LinkedHashSet<>(); for (TargetDefinitionContent targetDefinitionContent : targetDefinitionsContent) { @@ -281,8 +283,6 @@ private LinkedHashSet gatherExternalInstallableUnits( result.addAll(matches.toUnmodifiableSet()); } - result.addAll(pomDependenciesContent.gatherMavenInstallableUnits()); - if (includeLocalMavenRepo && logger.isDebugEnabled()) { IQueryResult locallyInstalledIUs = localMetadataRepository.query(QueryUtil.ALL_UNITS, null); @@ -311,16 +311,14 @@ private IMetadataRepository loadMetadataRepository(MavenRepositoryLocation locat * Provider for all target platform artifacts from outside the reactor. */ private IRawArtifactFileProvider createExternalArtifactProvider(Set completeRepositories, - List targetDefinitionsContent, - IRawArtifactFileProvider pomDependencyArtifactRepository, boolean includePackedArtifacts) { + List targetDefinitionsContent, boolean includePackedArtifacts) { RepositoryArtifactProvider remoteArtifactProvider = createRemoteArtifactProvider(completeRepositories, targetDefinitionsContent); MirroringArtifactProvider remoteArtifactCache = MirroringArtifactProvider .createInstance(localArtifactRepository, remoteArtifactProvider, includePackedArtifacts, logger); - IRawArtifactFileProvider jointArtifactsProvider = new CompositeArtifactProvider(pomDependencyArtifactRepository, - remoteArtifactCache); + IRawArtifactFileProvider jointArtifactsProvider = new CompositeArtifactProvider(remoteArtifactCache); return jointArtifactsProvider; } @@ -426,27 +424,26 @@ static int countElements(Iterator iterator) { return result; } - public P2TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, - List upstreamProjectResults) { - return createTargetPlatformWithUpdatedReactorUnits(baseTargetPlatform, - extractProjectResultIUs(upstreamProjectResults), getProjectArtifactProviders(upstreamProjectResults)); - } - P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(TargetPlatform baseTargetPlatform, Map reactorUnits, - List reactorArtifacts) { + List reactorArtifacts, PomDependencyCollector pomDependencyCollector) { if (!(baseTargetPlatform instanceof PreliminaryTargetPlatformImpl)) { throw new IllegalArgumentException( "Base target platform must be an instance of PreliminaryTargetPlatformImpl; was: " + baseTargetPlatform); } + if (!(pomDependencyCollector instanceof PomDependencyCollectorImpl)) { + throw new IllegalArgumentException( + "PomDependencyCollector must be an instance of PomDependencyCollectorImpl; was: " + + pomDependencyCollector); + } return createTargetPlatformWithUpdatedReactorUnits((PreliminaryTargetPlatformImpl) baseTargetPlatform, - reactorUnits, reactorArtifacts); + reactorUnits, reactorArtifacts, (PomDependencyCollectorImpl) pomDependencyCollector); } - P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(PreliminaryTargetPlatformImpl preliminaryTP, + private P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(PreliminaryTargetPlatformImpl preliminaryTP, Map reactorUnitsMap, - List reactorArtifacts) { + List reactorArtifacts, PomDependencyCollectorImpl pomDependencyCollector) { LinkedHashSet allUnits = preliminaryTP.getExternalUnits(); @@ -461,17 +458,26 @@ P2TargetPlatform createTargetPlatformWithUpdatedReactorUnits(PreliminaryTargetPl allUnits.addAll(reactorUnits); } + // TODO 372780 get rid of this special handling of pomDependency artifacts: there should be one p2 artifact repo view on the target platform + IRawArtifactFileProvider pomDependencyArtifactRepo = pomDependencyCollector.getArtifactRepoOfPublishedBundles(); + RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey + .forResolutionContextArtifacts(pomDependencyCollector.getProjectLocation()); + ArtifactRepositoryBlackboard.putRepository(blackboardKey, new ProviderOnlyArtifactRepository( + pomDependencyArtifactRepo, Activator.getProvisioningAgent(), blackboardKey.toURI())); + logger.debug("Registered artifact repository " + blackboardKey); + allUnits.addAll(pomDependencyCollector.gatherMavenInstallableUnits()); IRawArtifactFileProvider jointArtifacts = createJointArtifactProvider(reactorArtifacts, - preliminaryTP.getExternalArtifacts()); + preliminaryTP.getExternalArtifacts(), pomDependencyArtifactRepo); return new FinalTargetPlatformImpl(allUnits, preliminaryTP.getEEResolutionHints(), jointArtifacts, - localArtifactRepository, preliminaryTP.getOriginalMavenArtifactMap(), reactorUnitsMap); + localArtifactRepository, pomDependencyCollector.getMavenInstallableUnits(), reactorUnitsMap); } private CompositeArtifactProvider createJointArtifactProvider(List reactorArtifacts, - IRawArtifactFileProvider externalArtifacts) { + IRawArtifactFileProvider externalArtifacts, IRawArtifactFileProvider pomDependencyArtifactRepo) { // prefer artifacts from the reactor - return new CompositeArtifactProvider(reactorArtifacts, Collections.singletonList(externalArtifacts)); + return new CompositeArtifactProvider(reactorArtifacts, + Arrays.asList(externalArtifacts, pomDependencyArtifactRepo)); } private static Map extractProjectResultIUs( diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/resolver/facade/P2Resolver.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/resolver/facade/P2Resolver.java index 9caa029014..b026b5f304 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/resolver/facade/P2Resolver.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/resolver/facade/P2Resolver.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2021 Sonatype Inc. and others. + * Copyright (c) 2008, 2022 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -10,7 +10,8 @@ * Contributors: * Sonatype Inc. - initial API and implementation * Christoph Läubrich - Bug 572481 - Tycho does not understand "additional.bundles" directive in build.properties - * #82 Support resolving of non-project IUs in P2Resolver + * - Issue #82 - Support resolving of non-project IUs in P2Resolver + * - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.resolver.facade; @@ -23,6 +24,7 @@ import org.eclipse.tycho.artifacts.IllegalArtifactReferenceException; import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.ee.shared.ExecutionEnvironmentConfiguration; +import org.eclipse.tycho.core.resolver.shared.PomDependencies; import org.eclipse.tycho.core.shared.TargetEnvironment; import org.eclipse.tycho.p2.target.facade.TargetPlatformConfigurationStub; @@ -41,6 +43,8 @@ public interface P2Resolver { public void addAdditionalBundleDependency(String bundle); + void setPomDependencies(PomDependencies pomDependencies); + /** * Returns list ordered of resolution result, one per requested TargetEnvironment. * diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java index 2df205a87c..cec1089b98 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/p2/target/facade/TargetPlatformFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013 SAP AG and others. + * Copyright (c) 2013, 2021 SAP AG and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP AG - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.target.facade; @@ -22,7 +23,9 @@ public interface TargetPlatformFactory { public TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpConfiguration, - ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects, - PomDependencyCollector pomDependencies); + ExecutionEnvironmentConfiguration eeConfiguration, List reactorProjects); + + public TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, + List upstreamProjectResults, PomDependencyCollector pomDependencies); } diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java index 3af77334bb..7cbfaa18dd 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.shared/src/main/java/org/eclipse/tycho/repository/registry/facade/ReactorRepositoryManagerFacade.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2015 SAP SE and others. + * Copyright (c) 2012, 2021 SAP SE and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * * Contributors: * SAP SE - initial API and implementation + * Christoph Läubrich - Adjust to new API *******************************************************************************/ package org.eclipse.tycho.repository.registry.facade; @@ -37,7 +38,7 @@ public interface ReactorRepositoryManagerFacade { */ TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfiguration, - List reactorProjects, PomDependencyCollector pomDependencies); + List reactorProjects); /** * Computes the (immutable) target platform with final p2 metadata and attaches it to the given @@ -49,7 +50,8 @@ TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, * Other projects in the reactor which have already been built and may be referenced * by the given project. */ - void computeFinalTargetPlatform(ReactorProject project, List upstreamProjects); + void computeFinalTargetPlatform(ReactorProject project, List upstreamProjects, + PomDependencyCollector pomDependencyCollector); /** * Returns the target platform with final p2 metadata for the given project. diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java index 0f9d90e8f4..9aa9c36b15 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/DependencyResolver.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2014 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Sonatype Inc. - initial API and implementation + * Christoph Läubrich - Issue #462 - Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.core; @@ -19,6 +20,7 @@ import org.eclipse.tycho.artifacts.DependencyArtifacts; import org.eclipse.tycho.artifacts.TargetPlatform; import org.eclipse.tycho.core.osgitools.AbstractTychoProject; +import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; /** * Resolves project dependencies against the content of the target platform. @@ -27,6 +29,8 @@ public interface DependencyResolver { public void setupProjects(MavenSession session, MavenProject project, ReactorProject reactorProject); + PomDependencyCollector resolvePomDependencies(MavenSession session, MavenProject project); + public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, MavenProject project, List reactorProjects); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java index 2f122d0b91..cf87ca7328 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/targetplatform/LocalDependencyResolver.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 Sonatype Inc. and others. + * Copyright (c) 2008, 2021 Sonatype Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -53,6 +53,7 @@ import org.eclipse.tycho.core.osgitools.OsgiManifestParserException; import org.eclipse.tycho.core.resolver.shared.PomDependencies; import org.eclipse.tycho.model.Feature; +import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; /** * Creates target platform based on local Eclipse installation. @@ -254,4 +255,9 @@ public void injectDependenciesIntoMavenModel(MavenProject project, AbstractTycho MavenDependencyCollector dependencyCollector = new MavenDependencyCollector(project, bundleReader, logger); projectType.getDependencyWalker(reactorProject).walk(dependencyCollector); } + + @Override + public PomDependencyCollector resolvePomDependencies(MavenSession session, MavenProject project) { + return null; + } } diff --git a/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java b/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java index 308820f3ce..6415626698 100644 --- a/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java +++ b/tycho-extras/tycho-eclipserun-plugin/src/main/java/org/eclipse/tycho/extras/eclipserun/EclipseRunMojo.java @@ -306,7 +306,7 @@ private EquinoxInstallation createEclipseInstallation() throws MojoFailureExcept ExecutionEnvironmentConfiguration eeConfiguration = new ExecutionEnvironmentConfigurationImpl(logger, false, toolchainManager, session); TargetPlatform targetPlatform = resolverFactory.getTargetPlatformFactory().createTargetPlatform(tpConfiguration, - eeConfiguration, null, null); + eeConfiguration, null); P2Resolver resolver = resolverFactory.createResolver(new MavenLoggerAdapter(logger, false)); for (Dependency dependency : dependencies) { try { diff --git a/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java b/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java index b71fe31b89..09067d9e69 100644 --- a/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java +++ b/tycho-extras/tycho-p2-extras-plugin/src/main/java/org/eclipse/tycho/plugins/p2/extras/CompareWithBaselineMojo.java @@ -133,7 +133,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { baselineTPStub.addP2Repository(toRepoURI(baselineRepo)); } TargetPlatform baselineTP = resolverFactory.getTargetPlatformFactory().createTargetPlatform(baselineTPStub, - TychoProjectUtils.getExecutionEnvironmentConfiguration(reactorProject), null, null); + TychoProjectUtils.getExecutionEnvironmentConfiguration(reactorProject), null); for (Object item : dependencyMetadata) { try { 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 291ab8f300..106fe2477b 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2019 Sonatype Inc. and others. + * Copyright (c) 2008, 2022 Sonatype Inc. and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -12,6 +12,7 @@ * Christoph Läubrich - Bug 551739, Bug 538144, Bug 533747 * - [Bug 567098] pomDependencies=consider should wrap non-osgi jars * - [Bug 572481] Tycho does not understand "additional.bundles" directive in build.properties + * - [Issue #462] Delay Pom considered items to the final Target Platform calculation *******************************************************************************/ package org.eclipse.tycho.p2.resolver; @@ -22,6 +23,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -75,6 +77,7 @@ import org.eclipse.tycho.core.osgitools.BundleReader; import org.eclipse.tycho.core.osgitools.DebugUtils; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; +import org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection; import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; import org.eclipse.tycho.core.osgitools.targetplatform.MultiEnvironmentDependencyArtifacts; import org.eclipse.tycho.core.p2.P2ArtifactRepositoryLayout; @@ -89,6 +92,7 @@ import org.eclipse.tycho.osgi.adapters.MavenLoggerAdapter; import org.eclipse.tycho.p2.facade.internal.AttachedArtifact; import org.eclipse.tycho.p2.metadata.DependencyMetadataGenerator; +import org.eclipse.tycho.p2.metadata.IArtifactFacade; import org.eclipse.tycho.p2.metadata.PublisherOptions; import org.eclipse.tycho.p2.repository.LocalRepositoryP2Indices; import org.eclipse.tycho.p2.resolver.facade.P2ResolutionResult; @@ -208,9 +212,6 @@ public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, Mav TargetPlatformConfigurationStub tpConfiguration = new TargetPlatformConfigurationStub(); tpConfiguration.setIncludePackedArtifacts(configuration.isIncludePackedArtifacts()); - - PomDependencyCollector pomDependencies = collectPomDependencies(project, reactorProjects, session, - configuration.getPomDependencies()); for (ArtifactRepository repository : project.getRemoteArtifactRepositories()) { addEntireP2RepositoryToTargetPlatform(repository, tpConfiguration); } @@ -224,7 +225,7 @@ public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, Mav tpConfiguration.setIncludeSourceMode(configuration.getTargetDefinitionIncludeSourceMode()); return reactorRepositoryManager.computePreliminaryTargetPlatform(reactorProject, tpConfiguration, ee, - reactorProjects, pomDependencies); + reactorProjects); } private ReactorProject getThisReactorProject(MavenSession session, MavenProject project, @@ -266,16 +267,27 @@ public void setContextValue(String key, Object value) { return reactorProjet; } - private PomDependencyCollector collectPomDependencies(MavenProject project, List reactorProjects, - MavenSession session, PomDependencies pomDependencies) { + @SuppressWarnings("deprecation") + @Override + public PomDependencyCollector resolvePomDependencies(MavenSession session, MavenProject project) { + + ReactorProject reactorProject = DefaultReactorProject.adapt(project); + TargetPlatformConfiguration configuration = TychoProjectUtils.getTargetPlatformConfiguration(reactorProject); + PomDependencies pomDependencies = configuration.getPomDependencies(); if (pomDependencies == PomDependencies.ignore) { - return resolverFactory.newPomDependencyCollector(DefaultReactorProject.adapt(project)); + return resolverFactory.newPomDependencyCollector(reactorProject); } + List reactorProjects = DefaultReactorProject.adapt(session); + Set projectIds = new HashSet<>(); for (ReactorProject p : reactorProjects) { - String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion()); - projectIds.add(key); + if (PackagingType.TYPE_ECLIPSE_PLUGIN.equals(p.getPackaging())) { + String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion()); + projectIds.add(key); + } else { + //TODO handling of non-tycho reactor projects + } } ArrayList scopes = new ArrayList<>(); @@ -314,8 +326,22 @@ private PomDependencyCollector collectPomDependencies(MavenProject project, List } PomDependencyProcessor pomDependencyProcessor = new PomDependencyProcessor(session, repositorySystem, resolverFactory, equinox.getService(LocalRepositoryP2Indices.class), getLogger()); - return pomDependencyProcessor.collectPomDependencies(project, externalArtifacts, - pomDependencies == PomDependencies.wrapAsBundle); + PomDependencyCollector dependencyCollector = pomDependencyProcessor.collectPomDependencies(project, + externalArtifacts, pomDependencies == PomDependencies.wrapAsBundle); + DependencyArtifacts dependencyArtifacts = TychoProjectUtils.getDependencyArtifacts(reactorProject); + if (dependencyArtifacts instanceof ArtifactCollection) { + //enhance the dependency set + ArtifactCollection collection = (ArtifactCollection) dependencyArtifacts; + Map mavenInstallableUnits = dependencyCollector.getMavenInstallableUnits(); + for (var entry : mavenInstallableUnits.entrySet()) { + Object key = entry.getKey(); + IArtifactFacade val = entry.getValue(); + ArtifactKey artifactKey = dependencyCollector.getArtifactKey(val); + File location = val.getLocation(); + collection.addArtifactFile(artifactKey, location, Collections.singleton(key)); + } + } + return dependencyCollector; } private void addEntireP2RepositoryToTargetPlatform(ArtifactRepository repository, @@ -360,6 +386,7 @@ private DependencyArtifacts doResolveDependencies(MavenSession session, MavenPro resolver.setEnvironments(configuration.getEnvironments()); resolver.setAdditionalFilterProperties(configuration.getProfileProperties()); + resolver.setPomDependencies(configuration.getPomDependencies()); for (ReactorProject otherProject : reactorProjects) { projects.put(otherProject.getBasedir(), otherProject);