From 7d87e41ad0f3356b74d93be8588ef69539edcc91 Mon Sep 17 00:00:00 2001 From: Roland Grunberg Date: Thu, 7 Jun 2012 16:41:33 -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). Change-Id: I0609a1caecad753d811c5a93183547b33737657f --- .../tycho/p2/target/TargetDefinitionResolver.java | 8 +++- .../tycho/p2/target/TargetPlatformBuilderImpl.java | 5 +++ .../core/maven/TychoMavenLifecycleParticipant.java | 15 ++++++++ .../tycho/core/osgitools/OsgiBundleProject.java | 38 +++++++++++++++++++- .../tycho/osgi/runtime/TychoP2RuntimeLocator.java | 17 +++++++++ .../p2/resolver/P2TargetPlatformResolver.java | 10 +++++ 6 files changed, 90 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 index 2d7d3b9..c628e6e 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 metadataRepositories = new ArrayList(); 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 locationUnits = new CompoundQueryable( 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 index 9da87bb..5785029 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 @@ -255,6 +255,11 @@ public class TargetPlatformBuilderImpl implements TargetPlatformBuilder { return; } + // We cannot resolve a non-file URI in local mode while offline + if (System.getProperty("maven.local.mode") != null && offline && !URIUtil.isFileURI(location)) { + return; + } + try { metadataRepository = metadataRepositoryManager.loadRepository(location, monitor); metadataRepositories.add(metadataRepository); 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 index 80810d6..24efc87 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; import java.util.List; import org.apache.maven.AbstractMavenLifecycleParticipant; @@ -51,6 +52,20 @@ 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" }; + Process p = Runtime.getRuntime().exec(cmd); + p.waitFor(); + } catch (IOException e) { + // Continue + } catch (InterruptedException e) { + // Continue + } + } + List projects = session.getProjects(); for (MavenProject project : projects) { resolver.setupProject(session, project, DefaultReactorProject.adapt(project)); 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 8d18453..051913e 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 repositories = new ArrayList(); 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 index d4bcc9a..57ae997 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 @@ -204,6 +204,16 @@ public class P2TargetPlatformResolver extends AbstractTargetPlatformResolver imp ee != null ? ee.getProfileName() : null, configuration.isDisableP2Mirrors()); tpBuilder.setProjectLocation(project.getBasedir()); + // 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); -- 1.7.7.6