tycho/tycho-use-custom-resolver.p...

267 lines
14 KiB
Diff
Raw Normal View History

2012-06-12 15:06:31 +00:00
From 6f332ba550f5d0b29a929503b0d7ca386d337f9c Mon Sep 17 00:00:00 2001
From: Roland Grunberg <rgrunber@redhat.com>
2012-06-12 15:06:31 +00:00
Date: Tue, 12 Jun 2012 10:38:51 -0400
Subject: [PATCH] Implement a custom resolver for Tycho in local mode.
When running in local mode, dependencies should be resolved by looking
on the local system. Remote repositories should be ignored unless
offline mode is disabled.
Automatically create a local p2 repository of all bundles on the system
so that they may be used for local dependency resolution. This is done
using a modified version of Eclipse's copy-platform script.
Since Fedora 17, we need an Execution Environment of at least JavaSE-1.6
for Eclipse bundles. Eclipse Juno platform bundles depend on
javax.annotation. In Fedora this is provided by geronimo-annotation, but
has a dependency on javax.lang.model (since 1.6).
2012-06-12 15:06:31 +00:00
Change-Id: Ia1ece07ece2412bc4a88901631f3f651ad2b634b
---
2012-06-12 15:06:31 +00:00
.../tycho/p2/target/TargetDefinitionResolver.java | 8 +++--
.../tycho/p2/target/TargetPlatformBuilderImpl.java | 6 ++++
.../core/maven/TychoMavenLifecycleParticipant.java | 16 +++++++++
.../core/osgitools/EclipseFeatureProject.java | 22 +++++++++++++
.../tycho/core/osgitools/OsgiBundleProject.java | 38 +++++++++++++++++++++-
.../tycho/osgi/runtime/TychoP2RuntimeLocator.java | 17 ++++++++++
.../p2/resolver/P2TargetPlatformResolver.java | 10 ++++++
7 files changed, 114 insertions(+), 3 deletions(-)
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java
2012-06-12 15:06:31 +00:00
index 6a85c49..d9d6055 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetDefinitionResolver.java
@@ -24,6 +24,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
@@ -100,8 +101,11 @@ public class TargetDefinitionResolver {
List<IMetadataRepository> metadataRepositories = new ArrayList<IMetadataRepository>();
for (Repository repository : iuLocationDefinition.getRepositories()) {
- artifactRepositories.add(repository.getLocation());
- metadataRepositories.add(loadRepository(repository));
+ // We cannot resolve a non-file URI in local mode
+ if (System.getProperty("maven.local.mode") == null || URIUtil.isFileURI(repository.getLocation())) {
+ artifactRepositories.add(repository.getLocation());
+ metadataRepositories.add(loadRepository(repository));
+ }
}
IQueryable<IInstallableUnit> locationUnits = new CompoundQueryable<IInstallableUnit>(
diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java
2012-06-12 15:06:31 +00:00
index e4b4084..8d58a3c 100644
--- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java
+++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/target/TargetPlatformBuilderImpl.java
2012-06-12 15:06:31 +00:00
@@ -225,6 +225,12 @@ public class TargetPlatformBuilderImpl implements TargetPlatformBuilder {
IMetadataRepository metadataRepository = null;
IArtifactRepository artifactRepository = null;
+ // We cannot resolve a non-file URI in local mode while offline
+ if (System.getProperty("maven.local.mode") != null && offline && !URIUtil.isFileURI(location)) {
+ return;
+ }
2012-06-12 15:06:31 +00:00
+
+
try {
2012-06-12 15:06:31 +00:00
// TODO always log that a p2 repository is added to the target platform somewhere; used to be either from p2 or the following line
// logger.info("Adding repository (cached) " + location.toASCIIString());
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java
2012-06-12 15:06:31 +00:00
index 0dd2fd4..15669a6 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/maven/TychoMavenLifecycleParticipant.java
@@ -11,6 +11,7 @@
package org.eclipse.tycho.core.maven;
import java.io.File;
+import java.io.IOException;
2012-06-12 15:06:31 +00:00
import java.util.HashSet;
import java.util.List;
2012-06-12 15:06:31 +00:00
import java.util.Set;
@@ -55,6 +56,21 @@ public class TychoMavenLifecycleParticipant extends AbstractMavenLifecyclePartic
registerExecutionListener(session);
configureComponents(session);
+ // Create a system p2 repository for local dependency resolution
+ if (System.getProperty("maven.local.mode") != null) {
+ try {
+ String[] cmd = new String[] { "/usr/share/java/tycho/copy-platform-all",
+ System.getProperty("user.dir") + "/.m2/p2/repo" };
+ System.out.println("Building system local p2 repository...");
+ Process p = Runtime.getRuntime().exec(cmd);
+ p.waitFor();
+ } catch (IOException e) {
+ // Continue
+ } catch (InterruptedException e) {
+ // Continue
+ }
+ }
+
for (MavenProject project : projects) {
resolver.setupProject(session, project, DefaultReactorProject.adapt(project));
2012-06-12 15:06:31 +00:00
}
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/EclipseFeatureProject.java b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/EclipseFeatureProject.java
index 060a844..dbbe51a 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/EclipseFeatureProject.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/core/osgitools/EclipseFeatureProject.java
@@ -21,6 +21,9 @@ import org.eclipse.tycho.core.ArtifactDependencyVisitor;
import org.eclipse.tycho.core.ArtifactDependencyWalker;
import org.eclipse.tycho.core.TargetEnvironment;
import org.eclipse.tycho.core.TychoProject;
+import org.eclipse.tycho.core.UnknownEnvironmentException;
+import org.eclipse.tycho.core.utils.ExecutionEnvironment;
+import org.eclipse.tycho.core.utils.ExecutionEnvironmentUtils;
import org.eclipse.tycho.model.Feature;
@Component(role = TychoProject.class, hint = org.eclipse.tycho.ArtifactKey.TYPE_ECLIPSE_FEATURE)
@@ -49,4 +52,23 @@ public class EclipseFeatureProject extends AbstractArtifactBasedProject {
Feature.loadFeature(project.getBasedir());
}
+ @Override
+ public ExecutionEnvironment getExecutionEnvironment(MavenProject project) {
+ ExecutionEnvironment ee = super.getExecutionEnvironment(project);
+
+ if (System.getProperty("maven.local.mode") != null && ee != null) {
+ try {
+ // EE must be at least JavaSE-1.6
+ final ExecutionEnvironment javaSE16 = ExecutionEnvironmentUtils.getExecutionEnvironment("JavaSE-1.6");
+ if (ee.compareTo(javaSE16) < 0) {
+ ee = javaSE16;
+ }
+ } catch (UnknownEnvironmentException e) {
+ // Continue
+ }
+ }
+
+ return ee;
+ }
+
}
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
2012-06-12 15:06:31 +00:00
index fe6383f..d037faf 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
@@ -505,6 +505,28 @@ public class OsgiBundleProject extends AbstractTychoProject implements BundlePro
}
ExecutionEnvironment manifestMinimalEE = Collections.min(envs);
+ ExecutionEnvironment tmp;
+
+ if (System.getProperty("maven.local.mode") != null) {
+ try {
+ // EE must be at least JavaSE-1.6
+ final ExecutionEnvironment javaSE16 = ExecutionEnvironmentUtils.getExecutionEnvironment("JavaSE-1.6");
+ while (!envs.isEmpty()) {
+ tmp = Collections.min(envs);
+ if (tmp.compareTo(javaSE16) >= 0) {
+ manifestMinimalEE = tmp;
+ break;
+ }
+ envs.remove(tmp);
+ }
+
+ if (envs.isEmpty()) {
+ return javaSE16;
+ }
+ } catch (UnknownEnvironmentException e) {
+ // Continue
+ }
+ }
if (buildMinimalEE == null) {
return manifestMinimalEE;
@@ -515,7 +537,21 @@ public class OsgiBundleProject extends AbstractTychoProject implements BundlePro
protected ExecutionEnvironment getExecutionEnvironment(MavenProject project, String profile) {
try {
- return ExecutionEnvironmentUtils.getExecutionEnvironment(profile);
+ ExecutionEnvironment ee = ExecutionEnvironmentUtils.getExecutionEnvironment(profile);
+
+ if (System.getProperty("maven.local.mode") != null && ee != null) {
+ try {
+ // EE must be at least JavaSE-1.6
+ final ExecutionEnvironment javaSE16 = ExecutionEnvironmentUtils.getExecutionEnvironment("JavaSE-1.6");
+ if (ee.compareTo(javaSE16) < 0) {
+ ee = javaSE16;
+ }
+ } catch (UnknownEnvironmentException e) {
+ // Continue
+ }
+ }
+
+ return ee;
} catch (UnknownEnvironmentException e) {
throw new RuntimeException("Unknown execution environment specified in build.properties of project "
+ project, e);
diff --git a/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java b/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java
index 15b3fff..c8f14df 100644
--- a/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java
+++ b/tycho-core/src/main/java/org/eclipse/tycho/osgi/runtime/TychoP2RuntimeLocator.java
@@ -23,6 +23,7 @@ import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.JavadirWorkspaceReader;
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
@@ -38,6 +39,7 @@ import org.codehaus.plexus.util.FileUtils;
import org.eclipse.sisu.equinox.embedder.EquinoxRuntimeLocator;
import org.eclipse.tycho.locking.facade.FileLockService;
import org.eclipse.tycho.locking.facade.FileLocker;
+import org.sonatype.aether.util.artifact.DefaultArtifact;
@Component(role = EquinoxRuntimeLocator.class)
public class TychoP2RuntimeLocator implements EquinoxRuntimeLocator {
@@ -158,6 +160,21 @@ public class TychoP2RuntimeLocator implements EquinoxRuntimeLocator {
}
private File resolveArtifact(MavenSession session, Artifact artifact) throws MavenExecutionException {
+
+ // If we are in local mode, find the artifact on the system
+ if (System.getProperty("maven.local.mode") != null) {
+ JavadirWorkspaceReader wReader = new JavadirWorkspaceReader();
+ DefaultArtifact newArtifact = new DefaultArtifact(artifact.getGroupId()
+ + ":" + artifact.getArtifactId()
+ + ":" + artifact.getType()
+ + ":" + artifact.getVersion());
+ File file = wReader.findArtifact(newArtifact);
+ if (file != null) {
+ artifact.setFile(file);
+ return file;
+ }
+ }
+
List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
for (MavenProject project : session.getProjects()) {
repositories.addAll(project.getPluginArtifactRepositories());
diff --git a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java
2012-06-12 15:06:31 +00:00
index ea06289..0768fd0 100644
--- a/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java
+++ b/tycho-p2/tycho-p2-facade/src/main/java/org/eclipse/tycho/p2/resolver/P2TargetPlatformResolver.java
2012-06-12 15:06:31 +00:00
@@ -206,6 +206,16 @@ public class P2TargetPlatformResolver extends AbstractTargetPlatformResolver imp
tpBuilder.setProjectLocation(project.getBasedir());
2012-06-12 15:06:31 +00:00
tpBuilder.setIncludePackedArtifacts(configuration.isIncludePackedArtifacts());
+ // Add Fedora Local P2 Repository when running in local mode
+ if (System.getProperty("maven.local.mode") != null) {
+ String uri = "file:" + System.getProperty("user.dir") + "/.m2/p2/repo";
+ try {
+ tpBuilder.addP2Repository(new URI(uri));
+ } catch (URISyntaxException e) {
+ getLogger().warn("Unable to resolve repository URI : " + uri, e);
+ }
+ }
+
addThisReactorProjectToTargetPlatform(session, project, configuration, tpBuilder);
addOtherReactorProjectsToTargetPlatform(project, reactorProjects, tpBuilder);
--
2012-06-12 15:06:31 +00:00
1.7.11.2