diff options
author | 2015-07-15 14:17:04 +0000 | |
---|---|---|
committer | 2015-07-16 08:14:31 +0000 | |
commit | 9c54557c338b497a0967e07e28f98d339711888d (patch) | |
tree | f666943f8a064e7582cbc3b5ab557b8bb053e2a0 /src | |
parent | 4c568437c9c51657c672209673c65b679df238cc (diff) |
Add a simple resolver for Maven repositories
Also adds support for submodules and removes a spammy warning.
--
MOS_MIGRATED_REVID=98306456
Diffstat (limited to 'src')
4 files changed, 109 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java index 60addc6e57..b405e7dccd 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java @@ -1,4 +1,4 @@ -// Copyright 2014 Google Inc. All rights reserved. +// Copyright 2015 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/src/main/java/com/google/devtools/build/workspace/maven/BUILD b/src/main/java/com/google/devtools/build/workspace/maven/BUILD index 74d1132e5f..b333690549 100644 --- a/src/main/java/com/google/devtools/build/workspace/maven/BUILD +++ b/src/main/java/com/google/devtools/build/workspace/maven/BUILD @@ -1,6 +1,7 @@ java_library( name = "maven", srcs = [ + "DefaultModelResolver.java", "Resolver.java", ], visibility = [ diff --git a/src/main/java/com/google/devtools/build/workspace/maven/DefaultModelResolver.java b/src/main/java/com/google/devtools/build/workspace/maven/DefaultModelResolver.java new file mode 100644 index 0000000000..68b9b095fe --- /dev/null +++ b/src/main/java/com/google/devtools/build/workspace/maven/DefaultModelResolver.java @@ -0,0 +1,87 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.workspace.maven; + +import com.google.common.collect.Lists; +import org.apache.maven.model.Parent; +import org.apache.maven.model.Repository; +import org.apache.maven.model.building.ModelSource; +import org.apache.maven.model.building.UrlModelSource; +import org.apache.maven.model.resolution.InvalidRepositoryException; +import org.apache.maven.model.resolution.ModelResolver; +import org.apache.maven.model.resolution.UnresolvableModelException; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; +import java.util.List; + +class DefaultModelResolver implements ModelResolver { + + private final List<Repository> repositories; + + public DefaultModelResolver() { + repositories = Lists.newArrayList(); + } + + private DefaultModelResolver(List<Repository> repositories) { + this.repositories = repositories; + } + + @Override + public ModelSource resolveModel(String groupId, String artifactId, String version) + throws UnresolvableModelException { + for (Repository repository : repositories) { + try { + UrlModelSource urlModelSource = new UrlModelSource(new URL(repository.getUrl() + + groupId.replaceAll("\\.", "/") + "/" + artifactId + "/" + version + "/" + artifactId + + "-" + version + ".pom")); + if (urlModelSource.getInputStream().available() != 0) { + return urlModelSource; + } + } catch (MalformedURLException e) { + throw new UnresolvableModelException(e.getMessage(), groupId, artifactId, version, e); + } catch (IOException e) { + // The artifact could not be fetched from the current repo, just move on and check the next + // one. + } + } + throw new UnresolvableModelException("Could not find any repositories that knew how to " + + "resolve the artifact (checked " + Arrays.toString(repositories.toArray()) + ")", + groupId, artifactId, version); + } + + @Override + public ModelSource resolveModel(Parent parent) throws UnresolvableModelException { + return resolveModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()); + } + + @Override + public void addRepository(Repository repository) throws InvalidRepositoryException { + repositories.add(repository); + } + + @Override + public void addRepository(Repository repository, boolean replace) + throws InvalidRepositoryException { + addRepository(repository); + } + + @Override + public ModelResolver newCopy() { + return new DefaultModelResolver(repositories); + } +}
\ No newline at end of file diff --git a/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java b/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java index b1ff699e2a..2ffd1b0811 100644 --- a/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java +++ b/src/main/java/com/google/devtools/build/workspace/maven/Resolver.java @@ -32,12 +32,12 @@ import org.apache.maven.model.building.ModelBuildingException; import org.apache.maven.model.building.ModelBuildingResult; import org.apache.maven.model.io.DefaultModelReader; import org.apache.maven.model.locator.DefaultModelLocator; +import org.apache.maven.model.resolution.InvalidRepositoryException; +import org.apache.maven.model.resolution.ModelResolver; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.resolution.ArtifactDescriptorException; import org.eclipse.aether.resolution.ArtifactDescriptorRequest; import org.eclipse.aether.resolution.ArtifactDescriptorResult; @@ -118,28 +118,39 @@ public class Resolver { DefaultModelBuilderFactory factory = new DefaultModelBuilderFactory(); DefaultModelBuildingRequest request = new DefaultModelBuildingRequest(); + ModelResolver modelResolver = new DefaultModelResolver(); + request.setModelResolver(modelResolver); request.setPomFile(pom); Model model; try { ModelBuildingResult result = factory.newInstance().build(request); model = result.getEffectiveModel(); - } catch (ModelBuildingException e) { + } catch (ModelBuildingException | IllegalArgumentException e) { + // IllegalArg can be thrown if the parent POM cannot be resolved. handler.handle(Event.error(pomLocation, "Unable to resolve Maven model from " + pom + ": " + e.getMessage())); return; } - CollectRequest collectRequest = new CollectRequest(); for (Repository repo : model.getRepositories()) { - collectRequest.addRepository( - new RemoteRepository.Builder(repo.getId(), repo.getName(), repo.getUrl()).build()); + try { + modelResolver.addRepository(repo); + } catch (InvalidRepositoryException e) { + handler.handle(Event.error("Unable to add repository " + repo.getName() + + " (" + repo.getId() + "," + repo.getUrl() + ")")); + return; + } + } + + for (String module : model.getModules()) { + resolvePomDependencies(project + "/" + module); } for (org.apache.maven.model.Dependency dependency : model.getDependencies()) { try { Rule artifactRule = new Rule( dependency.getArtifactId(), dependency.getGroupId(), dependency.getVersion()); - addArtifact(artifactRule, model.toString(), pomLocation); + addArtifact(artifactRule, model.toString()); getArtifactDependencies(artifactRule, pomLocation); } catch (Rule.InvalidRuleException e) { handler.handle(Event.error(pomLocation, e.getMessage())); @@ -176,7 +187,7 @@ public class Resolver { try { Rule rule = new Rule( depArtifact.getArtifactId(), depArtifact.getGroupId(), depArtifact.getVersion()); - if (addArtifact(rule, artifactRule.toMavenArtifactString(), location)) { + if (addArtifact(rule, artifactRule.toMavenArtifactString())) { getArtifactDependencies(rule, location); } } catch (Rule.InvalidRuleException e) { @@ -190,16 +201,12 @@ public class Resolver { * was already in the list. If the artifact was in the list at a different version, adds an * error event to the event handler. */ - private boolean addArtifact(Rule dependency, String parent, Location pomLocation) { + private boolean addArtifact(Rule dependency, String parent) { String artifactName = dependency.name(); if (deps.containsKey(artifactName)) { Rule existingDependency = deps.get(artifactName); // Check that the versions are the same. if (!existingDependency.version().equals(dependency.version())) { - handler.handle(Event.warn(pomLocation, dependency.groupId() + ":" - + dependency.artifactId() + " already processed for version " - + existingDependency.version() + " but " + parent + " wants version " - + dependency.version() + ", ignoring.")); existingDependency.addParent(parent + " wanted version " + dependency.version()); } else { existingDependency.addParent(parent); |