From 65328b37df547900ea64cb776ee78528800c7ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Fri, 7 Jan 2022 09:19:12 +0100 Subject: [PATCH] Fix #462 Delay Pom considered items to the final Target Platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - if pom dependencies are considered allow for a partial resolution of the preliminary target platform - don't use pom considered dependencies in computation of build-order anymore - pom considered dependencies are now part of the final target platform calculation These changes allow for other reactor projects to contribute to the OSGi classpath results including for example bnd/felix bundle plugin. Signed-off-by: Christoph Läubrich --- .../tycho/target/TargetPlatformMojo.java | 21 +++- .../java/org/eclipse/tycho/PackagingType.java | 8 +- .../manager/ReactorRepositoryManagerTest.java | 6 +- .../tycho/p2/resolver/P2ResolverTest.java | 32 +++-- .../p2/target/PomDependencyCollectorTest.java | 16 +-- .../p2/target/TargetPlatformFactoryTest.java | 61 ++++------ .../ee/CustomEEResolutionHandlerTest.java | 4 +- .../manager/ReactorRepositoryManagerImpl.java | 18 ++- .../tycho/p2/resolver/P2ResolverImpl.java | 29 ++++- .../p2/target/PomDependencyCollectorImpl.java | 71 ++++++++++- .../target/PreliminaryTargetPlatformImpl.java | 12 +- .../p2/target/TargetPlatformFactoryImpl.java | 114 +++++++++++------- .../tycho/p2/resolver/facade/P2Resolver.java | 8 +- .../target/facade/TargetPlatformFactory.java | 9 +- .../ReactorRepositoryManagerFacade.java | 8 +- .../tycho/core/DependencyResolver.java | 6 +- .../LocalDependencyResolver.java | 8 +- .../extras/eclipserun/EclipseRunMojo.java | 2 +- .../p2/extras/CompareWithBaselineMojo.java | 2 +- .../mixed.reactor/felix.bundle/pom.xml | 29 +++++ .../bundle/exported/PlainMavenInterface.java | 5 + tycho-its/projects/mixed.reactor/pom.xml | 37 ++++++ .../tycho.bundle/META-INF/MANIFEST.MF | 8 ++ .../tycho.bundle/build.properties | 4 + .../mixed.reactor/tycho.bundle/pom.xml | 19 +++ .../src/tycho/bundle/importing/Impl.java | 7 ++ .../tycho/test/resolver/ResolverTests.java | 15 +++ .../resources/META-INF/plexus/components.xml | 6 + .../p2/resolver/P2DependencyResolver.java | 60 +++++++-- .../p2/resolver/PomReactorProjectFacade.java | 84 +++++++++++++ 30 files changed, 552 insertions(+), 157 deletions(-) create mode 100644 tycho-its/projects/mixed.reactor/felix.bundle/pom.xml create mode 100644 tycho-its/projects/mixed.reactor/felix.bundle/src/main/java/felix/bundle/exported/PlainMavenInterface.java create mode 100644 tycho-its/projects/mixed.reactor/pom.xml create mode 100644 tycho-its/projects/mixed.reactor/tycho.bundle/META-INF/MANIFEST.MF create mode 100644 tycho-its/projects/mixed.reactor/tycho.bundle/build.properties create mode 100644 tycho-its/projects/mixed.reactor/tycho.bundle/pom.xml create mode 100644 tycho-its/projects/mixed.reactor/tycho.bundle/src/tycho/bundle/importing/Impl.java create mode 100644 tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/PomReactorProjectFacade.java 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.embedder.shared/src/main/java/org/eclipse/tycho/PackagingType.java b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/PackagingType.java index f5620e9aff..3a7c911a68 100644 --- a/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/PackagingType.java +++ b/tycho-bundles/org.eclipse.tycho.embedder.shared/src/main/java/org/eclipse/tycho/PackagingType.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2014 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,8 @@ *******************************************************************************/ package org.eclipse.tycho; +import java.util.Set; + /** * Tycho's packaging types. */ @@ -28,4 +30,8 @@ public final class PackagingType { public static final String TYPE_ECLIPSE_TARGET_DEFINITION = "eclipse-target-definition"; public static final String TYPE_P2_IU = ArtifactType.TYPE_INSTALLABLE_UNIT; + public static final Set TYCHO_PACKAGING_TYPES = Set.of(PackagingType.TYPE_ECLIPSE_PLUGIN, + TYPE_ECLIPSE_TEST_PLUGIN, TYPE_ECLIPSE_FEATURE, TYPE_ECLIPSE_REPOSITORY, TYPE_ECLIPSE_TARGET_DEFINITION, + TYPE_ECLIPSE_UPDATE_SITE, TYPE_ECLIPSE_APPLICATION); + } 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..f94589f04e 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 @@ -190,7 +190,7 @@ public void testSourceBundle() throws Exception { sb.setDependencyMetadata(metadata); reactorProjects.add(sb); - result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(), projectToResolve)); + result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(false), projectToResolve)); assertEquals(3, result.getArtifacts().size()); List entries = new ArrayList<>(result.getArtifacts()); @@ -214,7 +214,10 @@ public void testEclipseRepository() throws Exception { addContextProject(resourceFile("resolver/bundle01"), TYPE_ECLIPSE_PLUGIN); - result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(), projectToResolve)); + P2TargetPlatform targetPlatform = getTargetPlatform(); + Map map = impl.resolveTargetDependencies(targetPlatform, + projectToResolve); + result = singleEnv(map); assertEquals(3, result.getArtifacts().size()); // the product, bundle01, and the one dependency of bundle01 assertEquals(4, result.getNonReactorUnits().size()); // + a.jre @@ -277,7 +280,7 @@ public void testSwtFragment() throws Exception { projectToResolve = createReactorProject(swtFragment, TYPE_ECLIPSE_PLUGIN, "org.eclipse.tycho.p2.impl.resolver.test.swtFragment"); - result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(), projectToResolve)); + result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(false), projectToResolve)); assertEquals(2, result.getArtifacts().size()); assertEquals(0, result.getNonReactorUnits().size()); @@ -313,7 +316,7 @@ public void testReactorVsExternal() throws Exception { projectToResolve = createReactorProject(resourceFile("reactor-vs-external/feature01"), TYPE_ECLIPSE_FEATURE, "org.sonatype.tycho.p2.impl.resolver.test.feature01"); - result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(), projectToResolve)); + result = singleEnv(impl.resolveTargetDependencies(getTargetPlatform(false), projectToResolve)); assertEquals(2, result.getArtifacts().size()); assertEquals(1, result.getNonReactorUnits().size()); // a.jre @@ -506,11 +509,26 @@ public void testResolveWithoutProject() throws Exception { } private P2TargetPlatform getTargetPlatform() { - return tpFactory.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, reactorProjects, pomDependencies); + return getTargetPlatform(NOOP_EE_RESOLUTION_HANDLER); + } + + private P2TargetPlatform getTargetPlatform(boolean finalTarget) { + return getTargetPlatform(NOOP_EE_RESOLUTION_HANDLER, finalTarget); } private P2TargetPlatform getTargetPlatform(ExecutionEnvironmentResolutionHandler eeResolutionHandler) { - return tpFactory.createTargetPlatform(tpConfig, eeResolutionHandler, reactorProjects, pomDependencies); + return getTargetPlatform(eeResolutionHandler, true); + } + + private P2TargetPlatform getTargetPlatform(ExecutionEnvironmentResolutionHandler eeResolutionHandler, + boolean finalTarget) { + P2TargetPlatform preliminaryTP = tpFactory.createTargetPlatform(tpConfig, eeResolutionHandler, reactorProjects); + if (finalTarget) { + return tpFactory.createTargetPlatformWithUpdatedReactorContent(preliminaryTP, Collections.emptyList(), + pomDependencies); + } else { + return preliminaryTP; + } } 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..faa1aad1c3 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 @@ -14,7 +14,6 @@ *******************************************************************************/ package org.eclipse.tycho.p2.target; -import static org.eclipse.tycho.p2.target.ExecutionEnvironmentTestUtils.NOOP_EE_RESOLUTION_HANDLER; import static org.eclipse.tycho.p2.testutil.InstallableUnitMatchers.unitWithId; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; @@ -29,7 +28,6 @@ import org.eclipse.tycho.p2.impl.test.ArtifactMock; import org.eclipse.tycho.p2.impl.test.ReactorProjectStub; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; -import org.eclipse.tycho.p2.target.facade.TargetPlatformConfigurationStub; import org.eclipse.tycho.test.util.LogVerifier; import org.junit.Before; import org.junit.Rule; @@ -61,7 +59,7 @@ public void testAddArtifactWithExistingMetadataRespectsClassifier() throws Excep subject.addArtifactWithExistingMetadata(artifact, existingMetadata()); - Collection units = getTargetPlatformUnits(); + Collection units = (Collection) subject.getMavenInstallableUnits().keySet(); assertThat(units, hasItem(unitWithId("test.unit.source"))); assertThat(units.size(), is(1)); } @@ -73,7 +71,7 @@ public void testAddArtifactWithExistingMetadataOfMainArtifact() throws Exception subject.addArtifactWithExistingMetadata(artifact, existingMetadata()); - Collection units = getTargetPlatformUnits(); + Collection units = (Collection) subject.getMavenInstallableUnits().keySet(); assertThat(units, hasItem(unitWithId("test.unit"))); assertThat(units.size(), is(1)); } @@ -85,7 +83,7 @@ public void testAddArtifactWithExistingMetadataButNonMatchingClassifier() throws subject.addArtifactWithExistingMetadata(artifact, existingMetadata()); - Collection units = getTargetPlatformUnits(); + Collection units = (Collection) subject.getMavenInstallableUnits().keySet(); assertThat(units.size(), is(0)); } @@ -100,10 +98,4 @@ static ArtifactMock existingMetadata() { "groupId", "artifactId", "1", PackagingType.TYPE_ECLIPSE_PLUGIN, "p2metadata"); } - private Collection getTargetPlatformUnits() { - TestResolverFactory resolverFactory = new TestResolverFactory(logVerifier.getLogger()); - P2TargetPlatform platform = resolverFactory.getTargetPlatformFactoryImpl() - .createTargetPlatform(new TargetPlatformConfigurationStub(), NOOP_EE_RESOLUTION_HANDLER, null, subject); - 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 272d2de0ca..a6ec3cf3a4 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 @@ -109,11 +109,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")))); } @@ -121,11 +121,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"))); } @@ -133,11 +132,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()))); @@ -147,11 +145,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"))); } @@ -159,24 +156,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"))); } @@ -191,7 +186,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")))); @@ -202,14 +197,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")))); @@ -224,12 +218,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")))); } @@ -241,7 +234,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")))); @@ -249,7 +242,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")))); @@ -264,12 +257,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()); @@ -280,8 +271,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))); @@ -293,7 +283,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); } @Test @@ -301,8 +291,7 @@ public void testMavenArtifactsInTargetDefinitionResolveToMavenPath() throws Exce File targetDefinition = new File( FileLocator.toFileURL(getClass().getResource("/resources/targetresolver/mavenDep.target")).getFile()); tpConfig.getTargetDefinitions().add(TargetDefinitionFile.read(targetDefinition)); - P2TargetPlatform targetPlatform = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, List.of(), - pomDependencyCollector); + P2TargetPlatform targetPlatform = subject.createTargetPlatform(tpConfig, NOOP_EE_RESOLUTION_HANDLER, List.of()); Path p2ArtifactPath = targetPlatform .getArtifactLocation( new DefaultArtifactKey(ArtifactType.TYPE_ECLIPSE_PLUGIN, "org.apache.commons.logging", "1.2.0")) 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/PomDependencyCollectorImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java index 144550b7ab..6fe087420f 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/PomDependencyCollectorImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2021 SAP SE and others. + * Copyright (c) 2011, 2022 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 @@ -17,30 +17,46 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.metadata.IArtifactKey; import org.eclipse.equinox.p2.metadata.IInstallableUnit; import org.eclipse.equinox.p2.metadata.VersionedId; +import org.eclipse.equinox.p2.publisher.IPublisherInfo; +import org.eclipse.equinox.p2.publisher.PublisherInfo; +import org.eclipse.equinox.p2.publisher.eclipse.BundlesAction; import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; +import org.eclipse.osgi.service.resolver.BundleDescription; import org.eclipse.tycho.ArtifactKey; import org.eclipse.tycho.ArtifactType; import org.eclipse.tycho.DefaultArtifactKey; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.core.shared.MavenContext; import org.eclipse.tycho.core.shared.MavenLogger; +import org.eclipse.tycho.p2.impl.Activator; import org.eclipse.tycho.p2.maven.repository.xmlio.MetadataIO; import org.eclipse.tycho.p2.metadata.IArtifactFacade; +import org.eclipse.tycho.p2.metadata.ReactorProjectFacade; 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.p2.target.repository.FileArtifactRepository; +import org.eclipse.tycho.repository.p2base.artifact.provider.CompositeArtifactProvider; import org.eclipse.tycho.repository.p2base.artifact.provider.IRawArtifactFileProvider; +import org.eclipse.tycho.repository.p2base.artifact.provider.formats.ArtifactTransferPolicies; +import org.eclipse.tycho.repository.p2base.artifact.repository.FileRepositoryArtifactProvider; +import org.osgi.framework.BundleException; +@SuppressWarnings("restriction") public class PomDependencyCollectorImpl implements PomDependencyCollector { private final TargetPlatformBundlePublisher bundlesPublisher; @@ -50,6 +66,9 @@ public class PomDependencyCollectorImpl implements PomDependencyCollector { private Map descriptorMap = new HashMap<>(); private ReactorProject project; + private IProvisioningAgent agent; + private final List fileDescriptors = new ArrayList<>(); + private FileRepositoryArtifactProvider fileRepositoryArtifactProvider; public PomDependencyCollectorImpl(MavenContext mavenContext, ReactorProject project) { this.project = project; @@ -58,6 +77,13 @@ public PomDependencyCollectorImpl(MavenContext mavenContext, ReactorProject proj File localRepositoryRoot = mavenContext.getLocalRepositoryRoot(); this.bundlesPublisher = new TargetPlatformBundlePublisher(localRepositoryRoot, project, mavenContext.getLogger()); + try { + agent = Activator.createProvisioningAgent(project == null ? null : project.getBasedir().toURI()); + } catch (ProvisionException e) { + } + fileRepositoryArtifactProvider = new FileRepositoryArtifactProvider( + Collections.singletonList(new FileArtifactRepository(agent, () -> fileDescriptors.iterator())), + ArtifactTransferPolicies.forLocalArtifacts()); } public File getProjectLocation() { @@ -69,10 +95,42 @@ public File getProjectLocation() { @Override public void addMavenArtifact(IArtifactFacade artifact, boolean allowGenerateOSGiBundle) { - MavenBundleInfo bundleIU = bundlesPublisher.attemptToPublishBundle(artifact, allowGenerateOSGiBundle); - if (bundleIU != null) { - addMavenArtifact(bundleIU.getArtifact(), Collections.singleton(bundleIU.getUnit())); - descriptorMap.put(bundleIU.getArtifact(), bundleIU.getDescriptor()); + if (artifact instanceof ReactorProjectFacade) { + ReactorProjectFacade projectFacade = (ReactorProjectFacade) artifact; + ReactorProject reactorProject = projectFacade.getReactorProject(); + String packaging = reactorProject.getPackaging(); + if ("bundle".equalsIgnoreCase(packaging) || "jar".equalsIgnoreCase(packaging)) { + File artifactFile = reactorProject.getArtifact(); + if (artifactFile != null) { + try { + BundleDescription bundleDescription = BundlesAction.createBundleDescription(artifactFile); + if (bundleDescription != null && bundleDescription.getSymbolicName() != null) { + IArtifactKey key = BundlesAction.createBundleArtifactKey( + bundleDescription.getSymbolicName(), bundleDescription.getVersion().toString()); + PublisherInfo publisherInfo = new PublisherInfo(); + publisherInfo.setArtifactOptions(IPublisherInfo.A_INDEX); + IArtifactDescriptor descriptor = FileArtifactRepository.forFile(artifactFile, key); + fileDescriptors.add(descriptor); + IInstallableUnit iu = BundlesAction.createBundleIU(bundleDescription, key, publisherInfo); + mavenInstallableUnits.put(iu, projectFacade); + descriptorMap.put(projectFacade, descriptor); + } else { + if (allowGenerateOSGiBundle) { + logger.warn("Referenced reactor project " + projectFacade + + " has no valid OSGi metadata and allowGenerateOSGiBundle=true is not applicable for reactor projects, consider adding felix- or bnd-maven-plugin to this project to generate appropriate OSGi headers in the first place."); + } + } + } catch (IOException | BundleException e) { + logger.warn("Referenced reactor project " + projectFacade + " could not be read!", e); + } + } + } + } else { + MavenBundleInfo bundleIU = bundlesPublisher.attemptToPublishBundle(artifact, allowGenerateOSGiBundle); + if (bundleIU != null) { + addMavenArtifact(bundleIU.getArtifact(), Collections.singleton(bundleIU.getUnit())); + descriptorMap.put(bundleIU.getArtifact(), bundleIU.getDescriptor()); + } } } @@ -125,7 +183,8 @@ public Map getMavenInstallableUnits() { } IRawArtifactFileProvider getArtifactRepoOfPublishedBundles() { - return bundlesPublisher.getArtifactRepoOfPublishedBundles(); + return new CompositeArtifactProvider(bundlesPublisher.getArtifactRepoOfPublishedBundles(), + fileRepositoryArtifactProvider); } @Override 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 79a59c5869..66b17c04a9 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 @@ -19,6 +19,7 @@ import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -29,6 +30,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; @@ -53,6 +55,8 @@ import org.eclipse.tycho.core.shared.MavenContext; import org.eclipse.tycho.core.shared.MavenLogger; import org.eclipse.tycho.p2.maven.repository.Activator; +import org.eclipse.tycho.p2.metadata.IArtifactFacade; +import org.eclipse.tycho.p2.metadata.ReactorProjectFacade; import org.eclipse.tycho.p2.remote.IRepositoryIdManager; import org.eclipse.tycho.p2.target.ee.ExecutionEnvironmentResolutionHandler; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; @@ -126,10 +130,9 @@ 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); } /** @@ -153,23 +156,18 @@ 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; - 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); @@ -183,11 +181,9 @@ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpC applyFilters(filter, externalUIs, reactorProjectUIs.keySet(), eeResolutionHandler.getResolutionHints()); IRawArtifactFileProvider externalArtifactFileProvider = createExternalArtifactProvider(completeRepositories, - targetFileContent, pomDependenciesContent.getArtifactRepoOfPublishedBundles(), - tpConfiguration.getIncludePackedArtifacts()); + targetFileContent, tpConfiguration.getIncludePackedArtifacts()); PreliminaryTargetPlatformImpl targetPlatform = new PreliminaryTargetPlatformImpl(reactorProjectUIs, // externalUIs, // - pomDependenciesContent.getMavenInstallableUnits(), // eeResolutionHandler.getResolutionHints(), // filter, // localMetadataRepository, // @@ -196,12 +192,6 @@ public P2TargetPlatform createTargetPlatform(TargetPlatformConfigurationStub tpC includeLocalMavenRepo, // logger); - RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey - .forResolutionContextArtifacts(pomDependenciesContent.getProjectLocation()); - ArtifactRepositoryBlackboard.putRepository(blackboardKey, new ProviderOnlyArtifactRepository( - externalArtifactFileProvider, Activator.getProvisioningAgent(), blackboardKey.toURI())); - logger.debug("Registered artifact repository " + blackboardKey); - eeResolutionHandler.readFullSpecification(targetPlatform.getInstallableUnits()); return targetPlatform; @@ -264,7 +254,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) { @@ -285,8 +275,6 @@ private LinkedHashSet gatherExternalInstallableUnits( result.addAll(matches.toUnmodifiableSet()); } - result.addAll(pomDependenciesContent.gatherMavenInstallableUnits()); - if (includeLocalMavenRepo && logger.isDebugEnabled()) { IQueryResult locallyInstalledIUs = localMetadataRepository.query(QueryUtil.ALL_UNITS, null); @@ -355,8 +343,7 @@ public static SortedRepositories sort(List repositories) { * 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) { SortedRepositories repos = SortedRepositories.sort(targetDefinitionsContent.stream() .map(TargetDefinitionContent::getArtifactRepository).collect(Collectors.toList())); RepositoryArtifactProvider remoteArtifactProvider = createRemoteArtifactProvider(completeRepositories, @@ -364,7 +351,7 @@ private IRawArtifactFileProvider createExternalArtifactProvider(Set iterator) { return result; } + @SuppressWarnings("unchecked") + @Override public P2TargetPlatform createTargetPlatformWithUpdatedReactorContent(TargetPlatform baseTargetPlatform, - List upstreamProjectResults) { + List upstreamProjectResults, 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(upstreamProjectResults), getProjectArtifactProviders(upstreamProjectResults)); + extractProjectResultIUs((List) upstreamProjectResults), + getProjectArtifactProviders((List) upstreamProjectResults), + pomDependenciesContent); } 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, Map reactorUnitsMap, - List reactorArtifacts) { - + List reactorArtifacts, PomDependencyCollectorImpl pomDependencyCollector) { LinkedHashSet allUnits = preliminaryTP.getExternalUnits(); - + TargetPlatformFilterEvaluator configuredFilters = preliminaryTP.getFilter(); // external units are already filtered, only reactor units need to be filtered again if (reactorUnitsMap != null) { - Collection reactorUnits = new LinkedList<>(reactorUnitsMap.keySet()); - - TargetPlatformFilterEvaluator configuredFilters = preliminaryTP.getFilter(); - if (configuredFilters != null) { - configuredFilters.filterUnits(reactorUnits); - } - allUnits.addAll(reactorUnits); + allUnits.addAll(filterUnits(configuredFilters, reactorUnitsMap.keySet())); + } else { + reactorUnitsMap = new LinkedHashMap<>(); } + IRawArtifactFileProvider pomDependencyArtifactRepo = pomDependencyCollector.getArtifactRepoOfPublishedBundles(); IRawArtifactFileProvider jointArtifacts = createJointArtifactProvider(reactorArtifacts, - preliminaryTP.getExternalArtifacts()); - + preliminaryTP.getExternalArtifacts(), pomDependencyArtifactRepo); + RepositoryBlackboardKey blackboardKey = RepositoryBlackboardKey + .forResolutionContextArtifacts(pomDependencyCollector.getProjectLocation()); + ArtifactRepositoryBlackboard.putRepository(blackboardKey, new ProviderOnlyArtifactRepository(jointArtifacts, + Activator.getProvisioningAgent(), blackboardKey.toURI())); + logger.debug("Registered artifact repository " + blackboardKey); + allUnits.addAll(filterUnits(configuredFilters, pomDependencyCollector.gatherMavenInstallableUnits())); + Map mavenInstallableUnits = pomDependencyCollector + .getMavenInstallableUnits(); + for (Entry entry : mavenInstallableUnits.entrySet()) { + IArtifactFacade value = entry.getValue(); + if (value instanceof ReactorProjectFacade) { + ReactorProjectFacade projectFacade = (ReactorProjectFacade) value; + reactorUnitsMap.put(entry.getKey(), projectFacade.getReactorProject().getIdentities()); + } + } return new FinalTargetPlatformImpl(allUnits, preliminaryTP.getEEResolutionHints(), jointArtifacts, - localArtifactRepository, preliminaryTP.getOriginalMavenArtifactMap(), reactorUnitsMap); + localArtifactRepository, mavenInstallableUnits, reactorUnitsMap); + } + + protected Collection filterUnits(TargetPlatformFilterEvaluator configuredFilters, + Collection units) { + if (units.isEmpty() || configuredFilters == null) { + return units; + } + List filteredUnits = new LinkedList<>(units); + configuredFilters.filterUnits(filteredUnits); + return filteredUnits; } 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-its/projects/mixed.reactor/felix.bundle/pom.xml b/tycho-its/projects/mixed.reactor/felix.bundle/pom.xml new file mode 100644 index 0000000000..27bbe1d883 --- /dev/null +++ b/tycho-its/projects/mixed.reactor/felix.bundle/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + + org.eclipse.tycho.it + mixed.reactor.parent + 1.0.0-SNAPSHOT + + felix.bundle + bundle + + + + org.apache.felix + maven-bundle-plugin + 5.1.2 + true + + + * + !sun.*,* + + true + + + + + \ No newline at end of file diff --git a/tycho-its/projects/mixed.reactor/felix.bundle/src/main/java/felix/bundle/exported/PlainMavenInterface.java b/tycho-its/projects/mixed.reactor/felix.bundle/src/main/java/felix/bundle/exported/PlainMavenInterface.java new file mode 100644 index 0000000000..2ba6967cc8 --- /dev/null +++ b/tycho-its/projects/mixed.reactor/felix.bundle/src/main/java/felix/bundle/exported/PlainMavenInterface.java @@ -0,0 +1,5 @@ +package felix.bundle.exported; + +public interface PlainMavenInterface { + +} diff --git a/tycho-its/projects/mixed.reactor/pom.xml b/tycho-its/projects/mixed.reactor/pom.xml new file mode 100644 index 0000000000..7db1be5796 --- /dev/null +++ b/tycho-its/projects/mixed.reactor/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + + org.eclipse.tycho.it + mixed.reactor.parent + 1.0.0-SNAPSHOT + pom + + 2.6.0-SNAPSHOT + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + ${tycho-version} + target-platform-configuration + + consider + + + + + + + felix.bundle + tycho.bundle + + diff --git a/tycho-its/projects/mixed.reactor/tycho.bundle/META-INF/MANIFEST.MF b/tycho-its/projects/mixed.reactor/tycho.bundle/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..49901d0ef8 --- /dev/null +++ b/tycho-its/projects/mixed.reactor/tycho.bundle/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Tycho Bundle +Bundle-SymbolicName: tycho.bundle +Bundle-Version: 1.0.0.qualifier +Automatic-Module-Name: tycho.bundle +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Import-Package: felix.bundle.exported diff --git a/tycho-its/projects/mixed.reactor/tycho.bundle/build.properties b/tycho-its/projects/mixed.reactor/tycho.bundle/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/tycho-its/projects/mixed.reactor/tycho.bundle/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tycho-its/projects/mixed.reactor/tycho.bundle/pom.xml b/tycho-its/projects/mixed.reactor/tycho.bundle/pom.xml new file mode 100644 index 0000000000..e014be3ddf --- /dev/null +++ b/tycho-its/projects/mixed.reactor/tycho.bundle/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + + org.eclipse.tycho.it + mixed.reactor.parent + 1.0.0-SNAPSHOT + + tycho.bundle + eclipse-plugin + + + org.eclipse.tycho.it + 1.0.0-SNAPSHOT + felix.bundle + + + diff --git a/tycho-its/projects/mixed.reactor/tycho.bundle/src/tycho/bundle/importing/Impl.java b/tycho-its/projects/mixed.reactor/tycho.bundle/src/tycho/bundle/importing/Impl.java new file mode 100644 index 0000000000..2430df59bb --- /dev/null +++ b/tycho-its/projects/mixed.reactor/tycho.bundle/src/tycho/bundle/importing/Impl.java @@ -0,0 +1,7 @@ +package tycho.bundle.importing; + +import felix.bundle.exported.PlainMavenInterface; + +public class Impl implements PlainMavenInterface { + +} diff --git a/tycho-its/src/test/java/org/eclipse/tycho/test/resolver/ResolverTests.java b/tycho-its/src/test/java/org/eclipse/tycho/test/resolver/ResolverTests.java index c6edbf0ff2..51a2e0dc3e 100644 --- a/tycho-its/src/test/java/org/eclipse/tycho/test/resolver/ResolverTests.java +++ b/tycho-its/src/test/java/org/eclipse/tycho/test/resolver/ResolverTests.java @@ -38,4 +38,19 @@ public void testUsesConstraintViolations() throws Exception { verifier.verifyErrorFreeLog(); } + /** + * This test case test a combination of plain maven build artifacts (using + * felix-bundle-plugin) and tycho eclipse-plugin build artifact. + * + * @throws Exception if anything goes wrong + */ + @Test + public void testMixedReactor() throws Exception { + + Verifier verifier = getVerifier("mixed.reactor", false); + // FIXME see Issue #479 // verifier.executeGoal("compile"); + verifier.executeGoal("package"); + verifier.verifyErrorFreeLog(); + } + } diff --git a/tycho-maven-plugin/src/main/resources/META-INF/plexus/components.xml b/tycho-maven-plugin/src/main/resources/META-INF/plexus/components.xml index 97476792fe..d226c4ccb0 100644 --- a/tycho-maven-plugin/src/main/resources/META-INF/plexus/components.xml +++ b/tycho-maven-plugin/src/main/resources/META-INF/plexus/components.xml @@ -210,6 +210,9 @@ org.eclipse.tycho:tycho-packaging-plugin:${project.version}:build-qualifier + + org.eclipse.tycho:target-platform-configuration:${project.version}:target-platform + org.eclipse.tycho:tycho-packaging-plugin:${project.version}:update-site, org.eclipse.tycho:tycho-p2-plugin:${project.version}:update-site-p2-metadata, @@ -257,6 +260,9 @@ org.eclipse.tycho:tycho-packaging-plugin:${project.version}:build-qualifier + + org.eclipse.tycho:target-platform-configuration:${project.version}:target-platform + org.eclipse.tycho:tycho-packaging-plugin:${project.version}:product-export 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 dcb22632a6..6c5f366a8f 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); + Map nonTychoReactorProjects = new HashMap(); Set projectIds = new HashSet<>(); for (ReactorProject p : reactorProjects) { String key = ArtifactUtils.key(p.getGroupId(), p.getArtifactId(), p.getVersion()); projectIds.add(key); + String packaging = p.getPackaging(); + if (!PackagingType.TYCHO_PACKAGING_TYPES.contains(packaging)) { + nonTychoReactorProjects.put(key, p); + } } ArrayList scopes = new ArrayList<>(); @@ -314,8 +326,35 @@ 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); + + for (Artifact artifact : artifacts) { + String key = ArtifactUtils.key(artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion()); + if (nonTychoReactorProjects.containsKey(key)) { + PomReactorProjectFacade projectFacade = new PomReactorProjectFacade(artifact, + nonTychoReactorProjects.get(key)); + dependencyCollector.addMavenArtifact(projectFacade, 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(); + try { + collection.addArtifactFile(artifactKey, location, Collections.singleton(key)); + } catch (IllegalStateException e) { + //already contained in the collection --> ignore it... + } + } + } + return dependencyCollector; } private void addEntireP2RepositoryToTargetPlatform(ArtifactRepository repository, @@ -360,6 +399,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); diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/PomReactorProjectFacade.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/PomReactorProjectFacade.java new file mode 100644 index 0000000000..b15b1518fb --- /dev/null +++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/PomReactorProjectFacade.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright (c) 2022 Christoph Läubrich 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 + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Christoph Läubrich - initial API and implementation + *******************************************************************************/ +package org.eclipse.tycho.p2.resolver; + +import java.io.File; +import java.util.Objects; + +import org.apache.maven.artifact.Artifact; +import org.eclipse.tycho.ReactorProject; +import org.eclipse.tycho.p2.metadata.ReactorProjectFacade; + +final class PomReactorProjectFacade implements ReactorProjectFacade { + + private ReactorProject project; + private Artifact artifact; + + public PomReactorProjectFacade(Artifact artifact, ReactorProject project) { + this.artifact = artifact; + this.project = project; + } + + @Override + public File getLocation() { + return artifact.getFile(); + } + + @Override + public String getGroupId() { + return artifact.getGroupId(); + } + + @Override + public String getArtifactId() { + return artifact.getArtifactId(); + } + + @Override + public String getClassifier() { + return null; + } + + @Override + public String getVersion() { + return artifact.getBaseVersion(); + } + + @Override + public String getPackagingType() { + return artifact.getType(); + } + + @Override + public ReactorProject getReactorProject() { + return project; + } + + @Override + public int hashCode() { + return Objects.hash(artifact, project); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + PomReactorProjectFacade other = (PomReactorProjectFacade) obj; + return Objects.equals(artifact, other.artifact) && Objects.equals(project, other.project); + } + +}