diff --git a/tycho-api/src/main/java/org/eclipse/tycho/TychoConstants.java b/tycho-api/src/main/java/org/eclipse/tycho/TychoConstants.java index 76fa56b154..5b5ead3643 100644 --- a/tycho-api/src/main/java/org/eclipse/tycho/TychoConstants.java +++ b/tycho-api/src/main/java/org/eclipse/tycho/TychoConstants.java @@ -38,7 +38,6 @@ public interface TychoConstants { // static final String CTX_TARGET_PLATFORM -> moved to TargetPlatform.FINAL_TARGET_PLATFORM_KEY; static final String CTX_DEPENDENCY_ARTIFACTS = CTX_BASENAME + "/dependencyArtifacts"; - static final String CTX_REPOSITORY_REFERENCE = CTX_BASENAME + "/repositoryReference"; static final String CTX_METADATA_ARTIFACT_LOCATION = CTX_BASENAME + "/metadataArtifactLocation"; /** 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 544c5a0c5c..93aa52c8f0 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 @@ -22,7 +22,6 @@ import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.TargetEnvironment; import org.eclipse.tycho.TargetPlatform; -import org.eclipse.tycho.core.osgitools.AbstractTychoProject; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; /** @@ -46,6 +45,6 @@ public DependencyArtifacts resolveDependencies(MavenSession session, MavenProjec TargetPlatform targetPlatform, List reactorProjects, DependencyResolverConfiguration resolverConfiguration, List environments); - public void injectDependenciesIntoMavenModel(MavenProject project, AbstractTychoProject projectType, + public void injectDependenciesIntoMavenModel(MavenProject project, TychoProject projectType, DependencyArtifacts resolvedDependencies, DependencyArtifacts testDepedencyArtifacts, Logger logger); } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProject.java index d2f3b9dd86..a6cf7041e0 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProject.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProject.java @@ -40,6 +40,12 @@ public interface TychoProject { */ public DependencyArtifacts getDependencyArtifacts(ReactorProject project); + /** + * Returns resolved project dependencies. For projects targeting multiple runtime environments, + * returned collection includes artifacts for all supported runtime environments. + */ + public DependencyArtifacts getTestDependencyArtifacts(ReactorProject project); + /** * Returns resolved project dependencies resolved for specified runtime environment. */ diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java b/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java index 3487a68214..1627792620 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/TychoProjectManager.java @@ -56,7 +56,6 @@ import org.eclipse.tycho.core.osgitools.OsgiManifest; import org.eclipse.tycho.core.osgitools.OsgiManifestParserException; import org.eclipse.tycho.core.resolver.DefaultTargetPlatformConfigurationReader; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.helper.PluginRealmHelper; import org.eclipse.tycho.model.project.EclipseProject; import org.eclipse.tycho.targetplatform.TargetDefinition; @@ -238,7 +237,7 @@ public Optional getBndTychoProject(MavenProject project) { public Collection getProjectDependencies(MavenProject project) throws Exception { Set dependencySet = new HashSet<>(); TychoProject tychoProject = getTychoProject(project).get(); - List dependencies = TychoProjectUtils + List dependencies = tychoProject .getDependencyArtifacts(DefaultReactorProject.adapt(project)).getArtifacts(); for (ArtifactDescriptor descriptor : dependencies) { File location = descriptor.fetchArtifact().get(); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java index 7a977ece07..5702c70353 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/MavenDependencyInjector.java @@ -56,9 +56,11 @@ import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.TychoConstants; +import org.eclipse.tycho.core.TargetPlatformConfiguration; import org.eclipse.tycho.core.osgitools.BundleReader; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; import org.eclipse.tycho.core.osgitools.OsgiManifestParserException; +import org.eclipse.tycho.targetplatform.TargetDefinition.MavenGAVLocation; public final class MavenDependencyInjector { @@ -110,7 +112,8 @@ private static String getProjectKey(Dependency dependency) { public static void injectMavenDependencies(MavenProject project, DependencyArtifacts dependencies, DependencyArtifacts testDependencies, BundleReader bundleReader, Function descriptorMapping, Logger logger, - RepositorySystem repositorySystem, Settings settings, BuildPropertiesParser buildPropertiesParser) { + RepositorySystem repositorySystem, Settings settings, BuildPropertiesParser buildPropertiesParser, + TargetPlatformConfiguration configuration) { MavenDependencyInjector generator = new MavenDependencyInjector(project, bundleReader, descriptorMapping, logger); for (ArtifactDescriptor artifact : dependencies.getArtifacts()) { @@ -148,9 +151,10 @@ public static void injectMavenDependencies(MavenProject project, DependencyArtif return dependency; }).filter(Objects::nonNull).toList(); generator.addDependencyList(extraJars); - @SuppressWarnings("unchecked") - Collection repositoryReferences = (Collection) reactorProject - .getContextValue(TychoConstants.CTX_REPOSITORY_REFERENCE); + Collection repositoryReferences = configuration.getTargets().stream() + .flatMap(definition -> definition.getLocations().stream()).filter(MavenGAVLocation.class::isInstance) + .map(MavenGAVLocation.class::cast).flatMap(location -> location.getRepositoryReferences().stream()) + .toList(); if (repositoryReferences != null && !repositoryReferences.isEmpty()) { Map repositoryMap = project.getRemoteArtifactRepositories().stream() .collect(Collectors.toMap(MavenDependencyInjector::getId, Function.identity(), (a, b) -> a, diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java index 43facb7fb8..f0e060e379 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/AbstractTychoProject.java @@ -29,6 +29,7 @@ import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.AbstractLogEnabled; +import org.codehaus.plexus.logging.Logger; import org.eclipse.aether.collection.DependencyCollectionException; import org.eclipse.aether.resolution.DependencyResolutionException; import org.eclipse.tycho.DependencyArtifacts; @@ -36,14 +37,16 @@ import org.eclipse.tycho.IArtifactFacade; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.TargetEnvironment; +import org.eclipse.tycho.TargetPlatform; import org.eclipse.tycho.TychoConstants; +import org.eclipse.tycho.core.DependencyResolver; +import org.eclipse.tycho.core.DependencyResolverConfiguration; import org.eclipse.tycho.core.TargetPlatformConfiguration; import org.eclipse.tycho.core.TychoProject; import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.maven.MavenArtifactFacade; import org.eclipse.tycho.core.maven.MavenDependenciesResolver; import org.eclipse.tycho.core.osgitools.targetplatform.MultiEnvironmentDependencyArtifacts; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.p2resolver.PomReactorProjectFacade; import org.eclipse.tycho.targetplatform.TargetDefinition; import org.osgi.framework.Filter; @@ -56,16 +59,50 @@ public abstract class AbstractTychoProject extends AbstractLogEnabled implements private static final String CTX_INITIAL_MAVEN_DEPENDENCIES = CTX_OSGI_BUNDLE_BASENAME + "/initialDependencies"; @Requirement - MavenDependenciesResolver projectDependenciesResolver; + protected MavenDependenciesResolver projectDependenciesResolver; @Requirement - LegacySupport legacySupport; + protected LegacySupport legacySupport; @Requirement - TychoProjectManager projectManager; + protected TychoProjectManager projectManager; + + @Requirement + protected Logger logger; + + @Requirement(hint = "p2") + protected DependencyResolver dependencyResolver; @Override - public DependencyArtifacts getDependencyArtifacts(ReactorProject project) { - return TychoProjectUtils.getDependencyArtifacts(project); + public DependencyArtifacts getDependencyArtifacts(ReactorProject reactorProject) { + return reactorProject.computeContextValue(TychoConstants.CTX_DEPENDENCY_ARTIFACTS, () -> { + if (logger != null) { + logger.info("Resolving dependencies of " + reactorProject); + } + MavenSession mavenSession = getMavenSession(reactorProject); + MavenProject mavenProject = getMavenProject(reactorProject); + List reactorProjects = DefaultReactorProject.adapt(mavenSession); + TargetPlatform preliminaryTargetPlatform = dependencyResolver.computePreliminaryTargetPlatform(mavenSession, + mavenProject, reactorProjects); + TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(mavenProject); + DependencyResolverConfiguration resolverConfiguration = configuration.getDependencyResolverConfiguration(); + DependencyArtifacts dependencyArtifacts = dependencyResolver.resolveDependencies(mavenSession, mavenProject, + preliminaryTargetPlatform, reactorProjects, resolverConfiguration, configuration.getEnvironments()); + if (logger != null) { + if (logger.isDebugEnabled() && DebugUtils.isDebugEnabled(mavenSession, mavenProject)) { + StringBuilder sb = new StringBuilder(); + sb.append("Resolved target platform for ").append(reactorProject).append("\n"); + dependencyArtifacts.toDebugString(sb, " "); + logger.debug(sb.toString()); + } + } + return dependencyArtifacts; + }); + + } + + @Override + public DependencyArtifacts getTestDependencyArtifacts(ReactorProject project) { + return (DependencyArtifacts) project.getContextValue(TychoConstants.CTX_TEST_DEPENDENCY_ARTIFACTS); } @Override @@ -83,16 +120,6 @@ public DependencyArtifacts getDependencyArtifacts(ReactorProject project, Target return platform; } - public void setDependencyArtifacts(MavenSession session, ReactorProject project, - DependencyArtifacts dependencyArtifacts) { - project.setContextValue(TychoConstants.CTX_DEPENDENCY_ARTIFACTS, dependencyArtifacts); - } - - public void setTestDependencyArtifacts(MavenSession session, ReactorProject project, - DependencyArtifacts dependencyArtifacts) { - project.setContextValue(TychoConstants.CTX_TEST_DEPENDENCY_ARTIFACTS, dependencyArtifacts); - } - public void setupProject(MavenSession session, MavenProject project) { ReactorProject reactorProject = DefaultReactorProject.adapt(project); reactorProject.setContextValue(CTX_MAVEN_SESSION, session); diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java index 1c98009b30..14c7d0ac83 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/DefaultReactorProject.java @@ -183,15 +183,20 @@ public File getArtifact(String artifactClassifier) { @Override public Object getContextValue(String key) { Object value = context.get(key); + if (value instanceof LazyValue lazy) { + return lazy.get(); + } return (value != null) ? value : project.getContextValue(key); } @SuppressWarnings("unchecked") @Override public T computeContextValue(String key, Supplier initalValueSupplier) { - return (T) context.computeIfAbsent(key, nil -> { - return initalValueSupplier.get(); - }); + Object value = context.computeIfAbsent(key, nil -> new LazyValue<>(initalValueSupplier)); + if (value instanceof LazyValue lazy) { + return (T) lazy.get(); + } + return (T) value; } @Override @@ -284,4 +289,23 @@ public T adapt(Class target) { return null; } + private static final class LazyValue implements Supplier { + + private Supplier initalValueSupplier; + private T value; + + LazyValue(Supplier initalValueSupplier) { + this.initalValueSupplier = initalValueSupplier; + } + + @Override + public synchronized T get() { + if (value == null) { + value = initalValueSupplier.get(); + } + return value; + } + + } + } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java index bc22535cf2..d60817829d 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/OsgiBundleProject.java @@ -41,6 +41,7 @@ import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; import org.eclipse.equinox.p2.metadata.IInstallableUnit; +import org.eclipse.equinox.p2.metadata.IRequirement; import org.eclipse.osgi.container.namespaces.EclipsePlatformNamespace; import org.eclipse.osgi.internal.framework.FilterImpl; import org.eclipse.tycho.ArtifactDescriptor; @@ -52,15 +53,18 @@ import org.eclipse.tycho.DefaultArtifactKey; import org.eclipse.tycho.DependencyArtifacts; import org.eclipse.tycho.ExecutionEnvironmentConfiguration; +import org.eclipse.tycho.OptionalResolutionAction; import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.PlatformPropertiesUtils; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.ResolvedArtifactKey; import org.eclipse.tycho.TargetEnvironment; +import org.eclipse.tycho.TargetPlatform; import org.eclipse.tycho.TychoConstants; import org.eclipse.tycho.core.ArtifactDependencyVisitor; import org.eclipse.tycho.core.ArtifactDependencyWalker; import org.eclipse.tycho.core.BundleProject; +import org.eclipse.tycho.core.DependencyResolverConfiguration; import org.eclipse.tycho.core.PluginDescription; import org.eclipse.tycho.core.TargetPlatformConfiguration; import org.eclipse.tycho.core.TychoProject; @@ -71,8 +75,8 @@ import org.eclipse.tycho.core.osgitools.project.BuildOutputJar; import org.eclipse.tycho.core.osgitools.project.EclipsePluginProject; import org.eclipse.tycho.core.osgitools.project.EclipsePluginProjectImpl; +import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; import org.eclipse.tycho.core.resolver.P2ResolverFactory; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.model.Feature; import org.eclipse.tycho.model.ProductConfiguration; import org.eclipse.tycho.model.UpdateSite; @@ -677,8 +681,42 @@ public List getTestClasspath(ReactorProject reactorProject, bool } } - public DependencyArtifacts getTestDependencyArtifacts(ReactorProject project) { - return TychoProjectUtils.getTestDependencyArtifacts(project); + @Override + public DependencyArtifacts getTestDependencyArtifacts(ReactorProject reactorProject) { + return reactorProject.computeContextValue(TychoConstants.CTX_TEST_DEPENDENCY_ARTIFACTS, () -> { + List testDependencies = getExtraTestRequirements(reactorProject); + if (testDependencies.isEmpty()) { + return new DefaultDependencyArtifacts(); + } + logger.info("Resolving test dependencies of " + reactorProject); + MavenSession mavenSession = getMavenSession(reactorProject); + MavenProject mavenProject = getMavenProject(reactorProject); + List reactorProjects = DefaultReactorProject.adapt(mavenSession); + TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(mavenProject); + DependencyResolverConfiguration resolverConfiguration = configuration.getDependencyResolverConfiguration(); + DependencyResolverConfiguration testResolverConfiguration = new DependencyResolverConfiguration() { + @Override + public OptionalResolutionAction getOptionalResolutionAction() { + return resolverConfiguration.getOptionalResolutionAction(); + } + + @Override + public List getAdditionalArtifacts() { + ArrayList res = new ArrayList<>(resolverConfiguration.getAdditionalArtifacts()); + res.addAll(testDependencies); + return res; + } + + @Override + public Collection getAdditionalRequirements() { + return resolverConfiguration.getAdditionalRequirements(); + } + }; + TargetPlatform preliminaryTargetPlatform = dependencyResolver.computePreliminaryTargetPlatform(mavenSession, + mavenProject, reactorProjects); + return dependencyResolver.resolveDependencies(mavenSession, mavenProject, preliminaryTargetPlatform, + reactorProjects, testResolverConfiguration, configuration.getEnvironments()); + }); } @Override diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTychoResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTychoResolver.java index 043187104b..7ace72ca2c 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTychoResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/resolver/DefaultTychoResolver.java @@ -14,10 +14,7 @@ *******************************************************************************/ package org.eclipse.tycho.core.resolver; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.Optional; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Dependency; @@ -25,22 +22,14 @@ import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; -import org.eclipse.equinox.p2.metadata.IRequirement; -import org.eclipse.tycho.ArtifactKey; import org.eclipse.tycho.DependencyArtifacts; -import org.eclipse.tycho.OptionalResolutionAction; import org.eclipse.tycho.ReactorProject; -import org.eclipse.tycho.TargetPlatform; -import org.eclipse.tycho.core.BundleProject; import org.eclipse.tycho.core.DependencyResolver; -import org.eclipse.tycho.core.DependencyResolverConfiguration; -import org.eclipse.tycho.core.TargetPlatformConfiguration; import org.eclipse.tycho.core.TychoProject; import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.osgitools.AbstractTychoProject; import org.eclipse.tycho.core.osgitools.DebugUtils; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; -import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; import org.eclipse.tycho.resolver.TychoResolver; @Component(role = TychoResolver.class) @@ -77,92 +66,29 @@ public void setupProject(MavenSession session, MavenProject project) { } @Override - public void resolveProject(MavenSession session, MavenProject project) { - TychoProject tychoProject = projectManager.getTychoProject(project).orElse(null); - if (tychoProject instanceof AbstractTychoProject dr) { - ReactorProject reactorProject = DefaultReactorProject.adapt(project); - synchronized (reactorProject) { - if (reactorProject.getContextValue(RESOLVE_MARKER) != null) { - return; - } - reactorProject.setContextValue(RESOLVE_MARKER, true); - List mavenProjects = session.getProjects(); - List reactorProjects = mavenProjects.stream().map(DefaultReactorProject::adapt) - .toList(); - - String threadMarker; - if (logger.isDebugEnabled()) { - threadMarker = "[" + Thread.currentThread().getName().replaceAll("^ForkJoinPool-(\\d+)-", "") - + "] "; - } else { - threadMarker = ""; - } - logger.debug(threadMarker + "Computing preliminary target platform for " + project); - TargetPlatform preliminaryTargetPlatform = dependencyResolver.computePreliminaryTargetPlatform(session, - project, reactorProjects); - - logger.info(threadMarker + "Resolving dependencies of " + project); - TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(project); - - DependencyResolverConfiguration resolverConfiguration = configuration - .getDependencyResolverConfiguration(); - - DependencyArtifacts dependencyArtifacts = dependencyResolver.resolveDependencies(session, project, - preliminaryTargetPlatform, reactorProjects, resolverConfiguration, - configuration.getEnvironments()); - - if (logger.isDebugEnabled() && DebugUtils.isDebugEnabled(session, project)) { - StringBuilder sb = new StringBuilder(threadMarker); - sb.append("Resolved target platform for ").append(project).append("\n"); - dependencyArtifacts.toDebugString(sb, " "); - logger.debug(sb.toString()); - } - - dr.setDependencyArtifacts(session, reactorProject, dependencyArtifacts); - - DependencyArtifacts testDependencyArtifacts = null; - if (tychoProject instanceof BundleProject bundleProject) { - List testDependencies = bundleProject.getExtraTestRequirements(reactorProject); - if (!testDependencies.isEmpty()) { - logger.info(threadMarker + "Resolving test dependencies of " + project); - DependencyResolverConfiguration testResolverConfiguration = new DependencyResolverConfiguration() { - @Override - public OptionalResolutionAction getOptionalResolutionAction() { - return resolverConfiguration.getOptionalResolutionAction(); - } - - @Override - public List getAdditionalArtifacts() { - ArrayList res = new ArrayList<>( - resolverConfiguration.getAdditionalArtifacts()); - res.addAll(testDependencies); - return res; - } - - @Override - public Collection getAdditionalRequirements() { - return resolverConfiguration.getAdditionalRequirements(); - } - }; - testDependencyArtifacts = dependencyResolver.resolveDependencies(session, project, - preliminaryTargetPlatform, reactorProjects, testResolverConfiguration, - configuration.getEnvironments()); - } - dr.setTestDependencyArtifacts(session, reactorProject, - Objects.requireNonNullElse(testDependencyArtifacts, new DefaultDependencyArtifacts())); - } - - dependencyResolver.injectDependenciesIntoMavenModel(project, dr, dependencyArtifacts, - testDependencyArtifacts, logger); - - if (logger.isDebugEnabled() && DebugUtils.isDebugEnabled(session, project)) { - StringBuilder sb = new StringBuilder(threadMarker); - sb.append("Injected dependencies for ").append(project.toString()).append("\n"); - for (Dependency dependency : project.getDependencies()) { - sb.append(" ").append(dependency.toString()); - } - logger.debug(sb.toString()); + public void resolveProject(MavenSession mavenSession, MavenProject mavenProject) { + Optional tychoProject = projectManager.getTychoProject(mavenProject); + if (tychoProject.isEmpty()) { + return; + } + ReactorProject reactorProject = DefaultReactorProject.adapt(mavenProject); + synchronized (reactorProject) { + if (reactorProject.getContextValue(RESOLVE_MARKER) != null) { + return; + } + reactorProject.setContextValue(RESOLVE_MARKER, true); + TychoProject project = tychoProject.get(); + DependencyArtifacts dependencyArtifacts = project.getDependencyArtifacts(reactorProject); + DependencyArtifacts testDependencyArtifacts = project.getTestDependencyArtifacts(reactorProject); + dependencyResolver.injectDependenciesIntoMavenModel(mavenProject, project, dependencyArtifacts, + testDependencyArtifacts, logger); + if (logger.isDebugEnabled() && DebugUtils.isDebugEnabled(mavenSession, mavenProject)) { + StringBuilder sb = new StringBuilder(); + sb.append("Injected dependencies for ").append(mavenProject.toString()).append("\n"); + for (Dependency dependency : mavenProject.getDependencies()) { + sb.append(" ").append(dependency.toString()); } + logger.debug(sb.toString()); } } } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/utils/TychoProjectUtils.java b/tycho-core/src/main/java/org/eclipse/tycho/core/utils/TychoProjectUtils.java index 7e325acc91..aa8b355fc9 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/core/utils/TychoProjectUtils.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/core/utils/TychoProjectUtils.java @@ -34,24 +34,6 @@ public class TychoProjectUtils { public static final String TYCHO_ENV_OSGI_OS = "tycho.env.osgi.os"; public static final String TYCHO_ENV_OSGI_ARCH = "tycho.env.osgi.arch"; - /** - * Returns the {@link DependencyArtifacts} instance associated with the given project. - * - * @param project - * a Tycho project - * @return the resolved dependencies of the given project; never null - * @throws IllegalStateException - * if the given project does not have the resolved project dependencies stored - */ - public static DependencyArtifacts getDependencyArtifacts(ReactorProject project) throws IllegalStateException { - DependencyArtifacts resolvedDependencies = (DependencyArtifacts) project - .getContextValue(TychoConstants.CTX_DEPENDENCY_ARTIFACTS); - if (resolvedDependencies == null) { - throw new IllegalStateException(TYCHO_NOT_CONFIGURED + project.toString()); - } - return resolvedDependencies; - } - public static Optional getOptionalDependencyArtifacts(ReactorProject project) { DependencyArtifacts resolvedDependencies = (DependencyArtifacts) project .getContextValue(TychoConstants.CTX_DEPENDENCY_ARTIFACTS); @@ -94,25 +76,6 @@ public static List getDependencySeeds(ReactorProject project) { return dependencySeeds; } - /** - * Returns the {@link DependencyArtifacts} instance associated with the given project and its - * tests. - * - * @param project - * a Tycho project - * @return the resolved test dependencies of the given project; never null - * @throws IllegalStateException - * if the given project does not have the resolved project dependencies stored - */ - public static DependencyArtifacts getTestDependencyArtifacts(ReactorProject project) throws IllegalStateException { - DependencyArtifacts resolvedDependencies = (DependencyArtifacts) project - .getContextValue(TychoConstants.CTX_TEST_DEPENDENCY_ARTIFACTS); - if (resolvedDependencies == null) { - throw new IllegalStateException(TYCHO_NOT_CONFIGURED + project.toString()); - } - return resolvedDependencies; - } - /** * Computes the merged properties from maven session and the project * diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java index bf04d5cdd8..145f765ca5 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/P2DependencyResolver.java @@ -41,7 +41,6 @@ import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.component.annotations.Requirement; -import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; @@ -59,7 +58,6 @@ import org.eclipse.tycho.IDependencyMetadata; import org.eclipse.tycho.IDependencyMetadata.DependencyMetadataType; import org.eclipse.tycho.IllegalArtifactReferenceException; -import org.eclipse.tycho.MavenArtifactRepositoryReference; import org.eclipse.tycho.MavenDependencyDescriptor; import org.eclipse.tycho.MavenRepositoryLocation; import org.eclipse.tycho.OptionalResolutionAction; @@ -72,10 +70,10 @@ import org.eclipse.tycho.core.TargetPlatformConfiguration; import org.eclipse.tycho.core.TargetPlatformConfiguration.InjectP2MavenMetadataHandling; import org.eclipse.tycho.core.TargetPlatformConfiguration.LocalArtifactHandling; +import org.eclipse.tycho.core.TychoProject; import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.maven.MavenDependenciesResolver; import org.eclipse.tycho.core.maven.MavenDependencyInjector; -import org.eclipse.tycho.core.osgitools.AbstractTychoProject; import org.eclipse.tycho.core.osgitools.BundleReader; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; @@ -96,11 +94,10 @@ import org.eclipse.tycho.p2maven.repository.P2ArtifactRepositoryLayout; import org.eclipse.tycho.repository.registry.facade.ReactorRepositoryManager; import org.eclipse.tycho.resolver.P2MetadataProvider; -import org.eclipse.tycho.targetplatform.TargetDefinition.MavenGAVLocation; import org.eclipse.tycho.targetplatform.TargetDefinitionFile; @Component(role = DependencyResolver.class, hint = P2DependencyResolver.ROLE_HINT, instantiationStrategy = "per-lookup") -public class P2DependencyResolver extends AbstractLogEnabled implements DependencyResolver, Initializable { +public class P2DependencyResolver implements DependencyResolver, Initializable { public static final String ROLE_HINT = "p2"; @@ -145,6 +142,9 @@ public class P2DependencyResolver extends AbstractLogEnabled implements Dependen private TargetPlatformFactory tpFactory; + @Requirement + private Logger logger; + @Override public void setupProjects(final MavenSession session, final MavenProject project, final ReactorProject reactorProject) { @@ -198,54 +198,33 @@ protected Collection getDependencyMetadata(final MavenSessi public TargetPlatform computePreliminaryTargetPlatform(MavenSession session, MavenProject project, List reactorProjects) { ReactorProject reactorProject = DefaultReactorProject.adapt(project); - TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(project); - ExecutionEnvironmentConfiguration ee = projectManager.getExecutionEnvironmentConfiguration(project); - - TargetPlatformConfigurationStub tpConfiguration = new TargetPlatformConfigurationStub(); - for (ArtifactRepository repository : project.getRemoteArtifactRepositories()) { - addEntireP2RepositoryToTargetPlatform(repository, tpConfiguration); - } - - tpConfiguration.setEnvironments(configuration.getEnvironments()); - for (TargetDefinitionFile target : configuration.getTargets()) { - tpConfiguration.addTargetDefinition(target); - } - - tpConfiguration.addFilters(configuration.getFilters()); - tpConfiguration.setIncludeSourceMode(configuration.getTargetDefinitionIncludeSourceMode()); - tpConfiguration - .setIgnoreLocalArtifacts(configuration.getIgnoreLocalArtifacts() == LocalArtifactHandling.ignore); - tpConfiguration.setReferencedRepositoryMode(configuration.getReferencedRepositoryMode()); + return reactorProject.computeContextValue(TargetPlatform.PRELIMINARY_TARGET_PLATFORM_KEY, () -> { + logger.debug("Computing preliminary target platform for " + project); + TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(project); + ExecutionEnvironmentConfiguration ee = projectManager.getExecutionEnvironmentConfiguration(project); + + TargetPlatformConfigurationStub tpConfiguration = new TargetPlatformConfigurationStub(); + for (ArtifactRepository repository : project.getRemoteArtifactRepositories()) { + addEntireP2RepositoryToTargetPlatform(repository, tpConfiguration); + } - return computePreliminaryTargetPlatform(reactorProject, tpConfiguration, ee, reactorProjects); - } + tpConfiguration.setEnvironments(configuration.getEnvironments()); + for (TargetDefinitionFile target : configuration.getTargets()) { + tpConfiguration.addTargetDefinition(target); + } - /** - * Computes the target platform with dependency-only p2 metadata and attaches it to the given - * project. - * - * @param project - * the reactor project to compute the target platform for. - * @param resolvedEnvironment - */ - private TargetPlatform computePreliminaryTargetPlatform(ReactorProject project, - TargetPlatformConfigurationStub tpConfiguration, ExecutionEnvironmentConfiguration eeConfiguration, - List reactorProjects) { - // - // at this point, there is only incomplete ("dependency-only") metadata for the reactor projects - TargetPlatform result = getTpFactory().createTargetPlatform(tpConfiguration, eeConfiguration, reactorProjects, - project); - project.setContextValue(TargetPlatform.PRELIMINARY_TARGET_PLATFORM_KEY, result); - - List repositoryReferences = tpConfiguration.getTargetDefinitions().stream() - .flatMap(definition -> definition.getLocations().stream()).filter(MavenGAVLocation.class::isInstance) - .map(MavenGAVLocation.class::cast).flatMap(location -> location.getRepositoryReferences().stream()) - .toList(); - project.setContextValue(TychoConstants.CTX_REPOSITORY_REFERENCE, repositoryReferences); - return result; + tpConfiguration.addFilters(configuration.getFilters()); + tpConfiguration.setIncludeSourceMode(configuration.getTargetDefinitionIncludeSourceMode()); + tpConfiguration + .setIgnoreLocalArtifacts(configuration.getIgnoreLocalArtifacts() == LocalArtifactHandling.ignore); + tpConfiguration.setReferencedRepositoryMode(configuration.getReferencedRepositoryMode()); + TargetPlatform result = getTpFactory().createTargetPlatform(tpConfiguration, ee, reactorProjects, + reactorProject); + return result; + }); } - public synchronized TargetPlatformFactory getTpFactory() { + private synchronized TargetPlatformFactory getTpFactory() { if (tpFactory == null) { tpFactory = resolverFactory.getTargetPlatformFactory(); } @@ -316,7 +295,7 @@ private void addEntireP2RepositoryToTargetPlatform(ArtifactRepository repository if (repository.getLayout() instanceof P2ArtifactRepositoryLayout) { URI url = new URI(TargetDefinitionResolver.convertRawToUri(repository.getUrl())); resolutionContext.addP2Repository(new MavenRepositoryLocation(repository.getId(), url)); - getLogger().debug("Added p2 repository " + repository.getId() + " (" + repository.getUrl() + ")"); + logger.debug("Added p2 repository " + repository.getId() + " (" + repository.getUrl() + ")"); } } catch (URISyntaxException e) { throw new RuntimeException("Invalid repository URI: " + repository.getUrl(), e); @@ -431,7 +410,7 @@ public void initialize() throws InitializationException { } @Override - public void injectDependenciesIntoMavenModel(MavenProject project, AbstractTychoProject projectType, + public void injectDependenciesIntoMavenModel(MavenProject project, TychoProject projectType, DependencyArtifacts dependencyArtifacts, DependencyArtifacts testDependencyArtifacts, Logger logger) { Function descriptorMapping; TargetPlatformConfiguration configuration = projectManager.getTargetPlatformConfiguration(project); @@ -444,7 +423,7 @@ public void injectDependenciesIntoMavenModel(MavenProject project, AbstractTycho } MavenDependencyInjector.injectMavenDependencies(project, dependencyArtifacts, testDependencyArtifacts, bundleReader, descriptorMapping, logger, repositorySystem, context.getSession().getSettings(), - buildPropertiesParser); + buildPropertiesParser, configuration); } private MavenDependencyDescriptor resolveDescriptorWithValidation(MavenProject project, Logger logger, diff --git a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/PomUnits.java b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/PomUnits.java index acaea34b8b..2c475426db 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/PomUnits.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/p2resolver/PomUnits.java @@ -35,7 +35,6 @@ import org.eclipse.tycho.core.TychoProject; import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.osgitools.targetplatform.ArtifactCollection; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.p2.target.facade.PomDependencyCollector; import org.eclipse.tycho.p2maven.InstallableUnitGenerator; import org.eclipse.tycho.p2maven.InstallableUnitPublisher; @@ -76,9 +75,13 @@ public IQueryable createPomQueryable(ReactorProject reactorPro } public void addCollectedUnits(PomDependencyCollector collector, ReactorProject reactorProject) { + Optional tychoProject = tychoProjectManager.getTychoProject(reactorProject); + if (tychoProject.isEmpty()) { + return; + } Object contextValue = reactorProject.getContextValue(KEY); if (contextValue instanceof PomInstallableUnitStore store) { - DependencyArtifacts dependencyArtifacts = TychoProjectUtils.getDependencyArtifacts(reactorProject); + DependencyArtifacts dependencyArtifacts = tychoProject.get().getDependencyArtifacts(reactorProject); store.addPomDependencyConsumer(dependency -> { IArtifactFacade facade = dependency.artifactFacade(); Entry result = collector.addMavenArtifact(facade, diff --git a/tycho-extras/tycho-dependency-tools-plugin/src/main/java/org/eclipse/tycho/extras/pde/ListDependenciesMojo.java b/tycho-extras/tycho-dependency-tools-plugin/src/main/java/org/eclipse/tycho/extras/pde/ListDependenciesMojo.java index 06b37a98a3..1018c64e83 100644 --- a/tycho-extras/tycho-dependency-tools-plugin/src/main/java/org/eclipse/tycho/extras/pde/ListDependenciesMojo.java +++ b/tycho-extras/tycho-dependency-tools-plugin/src/main/java/org/eclipse/tycho/extras/pde/ListDependenciesMojo.java @@ -16,6 +16,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import org.apache.maven.artifact.Artifact; @@ -37,7 +38,6 @@ import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; import org.eclipse.tycho.core.osgitools.OsgiBundleProject; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.helper.PluginRealmHelper; /** @@ -79,14 +79,15 @@ public void execute() throws MojoExecutionException, MojoFailureException { } catch (IOException ex) { throw new MojoFailureException(ex.getMessage(), ex); } - if (projectManager.getTychoProject(project).isEmpty()) { + Optional tychoProject = projectManager.getTychoProject(project); + if (tychoProject.isEmpty()) { return; } Set written = new HashSet<>(); try (BufferedWriter writer = Files.newBufferedWriter(outputFile.toPath())) { ReactorProject reactorProject = DefaultReactorProject.adapt(project); - List dependencies = TychoProjectUtils.getDependencyArtifacts(reactorProject) + List dependencies = tychoProject.get().getDependencyArtifacts(reactorProject) .getArtifacts().stream().filter(desc -> !desc.getLocation(true).equals(project.getBasedir())) // remove self .toList(); for (ArtifactDescriptor dependnecy : dependencies) { diff --git a/tycho-lib-detector/.settings/org.eclipse.jdt.core.prefs b/tycho-lib-detector/.settings/org.eclipse.jdt.core.prefs index ed424b0073..93b33aefa7 100644 --- a/tycho-lib-detector/.settings/org.eclipse.jdt.core.prefs +++ b/tycho-lib-detector/.settings/org.eclipse.jdt.core.prefs @@ -9,7 +9,7 @@ org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullable.secondary= org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 org.eclipse.jdt.core.compiler.compliance=1.3 org.eclipse.jdt.core.compiler.problem.APILeak=warning org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info diff --git a/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/PublishProductMojo.java b/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/PublishProductMojo.java index b1af0965b6..7b96432091 100644 --- a/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/PublishProductMojo.java +++ b/tycho-p2-publisher-plugin/src/main/java/org/eclipse/tycho/plugins/p2/publisher/PublishProductMojo.java @@ -26,6 +26,7 @@ import java.util.HexFormat; import java.util.Iterator; import java.util.List; +import java.util.Optional; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -49,13 +50,13 @@ import org.eclipse.tycho.Interpolator; import org.eclipse.tycho.PackagingType; import org.eclipse.tycho.PlatformPropertiesUtils; +import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.TargetEnvironment; import org.eclipse.tycho.TychoConstants; import org.eclipse.tycho.core.TychoProject; import org.eclipse.tycho.core.maven.TychoInterpolator; import org.eclipse.tycho.core.osgitools.EclipseRepositoryProject; import org.eclipse.tycho.core.resolver.shared.DependencySeed; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.model.ProductConfiguration; import org.eclipse.tycho.p2.repository.PublishingRepository; import org.eclipse.tycho.p2.repository.module.ModuleArtifactRepository; @@ -193,11 +194,7 @@ private String digest(File artifactFile) throws IOException, NoSuchAlgorithmExce } private File getExpandedLauncherBinaries() throws MojoExecutionException, MojoFailureException { - // TODO 364134 take the executable feature from the target platform instead - DependencyArtifacts dependencyArtifacts = TychoProjectUtils.getDependencyArtifacts(getReactorProject()); - ArtifactDescriptor artifact = dependencyArtifacts.getArtifact(ArtifactType.TYPE_ECLIPSE_FEATURE, - "org.eclipse.equinox.executable", null); - + ArtifactDescriptor artifact = getLauncherArtifact(); if (artifact == null) { throw new MojoExecutionException( "Unable to locate feature 'org.eclipse.equinox.executable'. This feature is required for native product launchers."); @@ -227,6 +224,19 @@ private File getExpandedLauncherBinaries() throws MojoExecutionException, MojoFa } } + private ArtifactDescriptor getLauncherArtifact() { + ReactorProject reactorProject = getReactorProject(); + Optional tychoProject = projectManager.getTychoProject(reactorProject); + if (tychoProject.isEmpty()) { + return null; + } + // TODO 364134 take the executable feature from the target platform instead + DependencyArtifacts dependencyArtifacts = tychoProject.get().getDependencyArtifacts(reactorProject); + ArtifactDescriptor artifact = dependencyArtifacts.getArtifact(ArtifactType.TYPE_ECLIPSE_FEATURE, + "org.eclipse.equinox.executable", null); + return artifact; + } + private void checkMacOSLauncherCompatibility(ArtifactDescriptor executablesFeature) throws MojoExecutionException { if (!macOSConfigured()) { return; diff --git a/tycho-packaging-plugin/src/main/java/org/eclipse/tycho/packaging/LicenseFeatureHelper.java b/tycho-packaging-plugin/src/main/java/org/eclipse/tycho/packaging/LicenseFeatureHelper.java index a02a5b11cd..46184ee587 100644 --- a/tycho-packaging-plugin/src/main/java/org/eclipse/tycho/packaging/LicenseFeatureHelper.java +++ b/tycho-packaging-plugin/src/main/java/org/eclipse/tycho/packaging/LicenseFeatureHelper.java @@ -18,6 +18,7 @@ import java.io.InputStream; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Properties; import java.util.Set; import java.util.zip.ZipEntry; @@ -27,19 +28,24 @@ import org.codehaus.plexus.archiver.ArchivedFileSet; import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet; import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; import org.eclipse.tycho.ArtifactDescriptor; import org.eclipse.tycho.ArtifactType; import org.eclipse.tycho.BuildProperties; import org.eclipse.tycho.BuildPropertiesParser; import org.eclipse.tycho.ReactorProject; import org.eclipse.tycho.core.BuildPropertiesImpl; +import org.eclipse.tycho.core.TychoProject; +import org.eclipse.tycho.core.TychoProjectManager; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.model.Feature; @Component(role = LicenseFeatureHelper.class) public class LicenseFeatureHelper { + @Requirement() + TychoProjectManager projectManager; + public LicenseFeatureHelper() { } @@ -60,8 +66,12 @@ public File getLicenseFeature(Feature feature, MavenProject mavenProject) { if (id == null) { return null; } + Optional tychoProject = projectManager.getTychoProject(mavenProject); + if (tychoProject.isEmpty()) { + return null; + } - ArtifactDescriptor licenseFeature = TychoProjectUtils + ArtifactDescriptor licenseFeature = tychoProject.get() .getDependencyArtifacts(DefaultReactorProject.adapt(mavenProject)) .getArtifact(ArtifactType.TYPE_ECLIPSE_FEATURE, id, feature.getLicenseFeatureVersion()); diff --git a/tycho-packaging-plugin/src/test/java/org/eclipse/tycho/buildversion/BuildQualifierTest.java b/tycho-packaging-plugin/src/test/java/org/eclipse/tycho/buildversion/BuildQualifierTest.java index d8d897022e..b09bfda89e 100644 --- a/tycho-packaging-plugin/src/test/java/org/eclipse/tycho/buildversion/BuildQualifierTest.java +++ b/tycho-packaging-plugin/src/test/java/org/eclipse/tycho/buildversion/BuildQualifierTest.java @@ -32,10 +32,11 @@ import org.codehaus.plexus.component.configurator.ComponentConfigurationException; import org.eclipse.tycho.ArtifactDescriptor; import org.eclipse.tycho.ArtifactType; +import org.eclipse.tycho.DependencyArtifacts; import org.eclipse.tycho.ReactorProject; +import org.eclipse.tycho.TychoConstants; import org.eclipse.tycho.core.osgitools.DefaultReactorProject; import org.eclipse.tycho.core.osgitools.targetplatform.DefaultDependencyArtifacts; -import org.eclipse.tycho.core.utils.TychoProjectUtils; import org.eclipse.tycho.testing.AbstractTychoMojoTestCase; import org.eclipse.tycho.version.TychoVersion; @@ -192,8 +193,8 @@ public void testAggregateAttachedFeatureQualifier() throws Exception { MavenProject project = getProject(projects, "attachedfeature"); ReactorProject reactorProject = DefaultReactorProject.adapt(project); - DefaultDependencyArtifacts dependencyArtifacts = (DefaultDependencyArtifacts) TychoProjectUtils - .getDependencyArtifacts(reactorProject); + DefaultDependencyArtifacts dependencyArtifacts = (DefaultDependencyArtifacts) getDependencyArtifacts( + reactorProject); // replace target platform dependencies with fake attached feature and bundle // artifacts @@ -217,6 +218,15 @@ public void testAggregateAttachedFeatureQualifier() throws Exception { assertQualifier("201206180600", projects, "attachedfeature"); } + public static DependencyArtifacts getDependencyArtifacts(ReactorProject project) throws IllegalStateException { + DependencyArtifacts resolvedDependencies = (DependencyArtifacts) project + .getContextValue(TychoConstants.CTX_DEPENDENCY_ARTIFACTS); + if (resolvedDependencies == null) { + throw new IllegalStateException(); + } + return resolvedDependencies; + } + public void testWithInvalidQualifierFormat() throws Exception { MavenProject project = getProject("projects/buildqualifier", "p001/pom.xml"); BuildQualifierMojo mojo = createMojoWithProject(project);