aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Kristina Chodorow <kchodorow@google.com>2015-07-15 14:17:04 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-07-16 08:14:31 +0000
commit9c54557c338b497a0967e07e28f98d339711888d (patch)
treef666943f8a064e7582cbc3b5ab557b8bb053e2a0 /src
parent4c568437c9c51657c672209673c65b679df238cc (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/MavenConnector.java2
-rw-r--r--src/main/java/com/google/devtools/build/workspace/maven/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/workspace/maven/DefaultModelResolver.java87
-rw-r--r--src/main/java/com/google/devtools/build/workspace/maven/Resolver.java33
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);