Allow gradle builds without version numbers
Add a gradle `ResolutionStrategy` that resolves missing version numbers using the `spring-boot-dependencies` POM. This commit also introduces a new `spring-boot-dependency-tools` module that provides programmatic access to the `dependencyManagement` section of the dependencies POM. Fixed gh-262pull/272/head
parent
19ca4d4eae
commit
ab4baa3c43
@ -0,0 +1,4 @@
|
||||
# Spring Boot - Dependency Tools
|
||||
The Spring Boot Dependency Tools module provides support utilities to help when resolving
|
||||
'blessed' Spring Boot dependencies. It basically provides programmatic access to the
|
||||
managed dependencies section of `spring-boot-dependencies/pom.xml`
|
@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-tools</artifactId>
|
||||
<version>1.0.0.BUILD-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>spring-boot-dependency-tools</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/../..</main.basedir>
|
||||
<generated.pom.dir>${project.build.directory}/generated-resources/org/springframework/boot/dependency/tools</generated.pom.dir>
|
||||
</properties>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>${project.build.directory}/generated-resources</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-dependencies-pom</id>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<target>
|
||||
<copy file="${main.basedir}/spring-boot-dependencies/pom.xml"
|
||||
tofile="${generated.pom.dir}/dependencies-pom.xml" />
|
||||
</target>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-help-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>generate-effective-dependencies-pom</id>
|
||||
<phase>generate-resources</phase>
|
||||
<goals>
|
||||
<goal>effective-pom</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<output>${generated.pom.dir}/effective-pom.xml</output>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<!--This plugin's configuration is used to store Eclipse m2e settings
|
||||
only. It has no influence on the Maven build itself. -->
|
||||
<plugin>
|
||||
<groupId>org.eclipse.m2e</groupId>
|
||||
<artifactId>lifecycle-mapping</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<configuration>
|
||||
<lifecycleMappingMetadata>
|
||||
<pluginExecutions>
|
||||
<pluginExecution>
|
||||
<pluginExecutionFilter>
|
||||
<groupId>
|
||||
org.apache.maven.plugins
|
||||
</groupId>
|
||||
<artifactId>
|
||||
maven-help-plugin
|
||||
</artifactId>
|
||||
<versionRange>
|
||||
[2.2,)
|
||||
</versionRange>
|
||||
<goals>
|
||||
<goal>effective-pom</goal>
|
||||
</goals>
|
||||
</pluginExecutionFilter>
|
||||
<action>
|
||||
<ignore></ignore>
|
||||
</action>
|
||||
</pluginExecution>
|
||||
<pluginExecution>
|
||||
<pluginExecutionFilter>
|
||||
<groupId>
|
||||
org.apache.maven.plugins
|
||||
</groupId>
|
||||
<artifactId>
|
||||
maven-antrun-plugin
|
||||
</artifactId>
|
||||
<versionRange>
|
||||
[1.7,)
|
||||
</versionRange>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
</pluginExecutionFilter>
|
||||
<action>
|
||||
<ignore></ignore>
|
||||
</action>
|
||||
</pluginExecution>
|
||||
</pluginExecutions>
|
||||
</lifecycleMappingMetadata>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* 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 org.springframework.boot.dependency.tools;
|
||||
|
||||
/**
|
||||
* Simple subset of the Spring Assert utility.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class Assert {
|
||||
|
||||
public static void notNull(Object object, String message) {
|
||||
if (object == null) {
|
||||
throw new IllegalArgumentException(message);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,234 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* 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 org.springframework.boot.dependency.tools;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
/**
|
||||
* A single managed dependency.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
* @see ManagedDependencies
|
||||
*/
|
||||
public final class Dependency {
|
||||
|
||||
private final String groupId;
|
||||
|
||||
private final String artifactId;
|
||||
|
||||
private final String version;
|
||||
|
||||
private final List<Exclusion> exclusions;
|
||||
|
||||
/**
|
||||
* Create a new {@link Dependency} instance.
|
||||
* @param groupId the group ID
|
||||
* @param artifactId the artifact ID
|
||||
* @param version the version
|
||||
*/
|
||||
public Dependency(String groupId, String artifactId, String version) {
|
||||
this(groupId, artifactId, version, Collections.<Exclusion> emptyList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new {@link Dependency} instance.
|
||||
* @param groupId the group ID
|
||||
* @param artifactId the artifact ID
|
||||
* @param version the version
|
||||
* @param exclusions the exclusions
|
||||
*/
|
||||
public Dependency(String groupId, String artifactId, String version,
|
||||
List<Exclusion> exclusions) {
|
||||
Assert.notNull(groupId, "GroupId must not be null");
|
||||
Assert.notNull(artifactId, "ArtifactId must not be null");
|
||||
Assert.notNull(version, "Version must not be null");
|
||||
Assert.notNull(exclusions, "Exclusions must not be null");
|
||||
this.groupId = groupId;
|
||||
this.artifactId = artifactId;
|
||||
this.version = version;
|
||||
this.exclusions = Collections.unmodifiableList(exclusions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the dependency group id.
|
||||
*/
|
||||
public String getGroupId() {
|
||||
return this.groupId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the dependency artifact id.
|
||||
*/
|
||||
public String getArtifactId() {
|
||||
return this.artifactId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the dependency version.
|
||||
*/
|
||||
public String getVersion() {
|
||||
return this.version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the dependency exclusions.
|
||||
*/
|
||||
public List<Exclusion> getExclusions() {
|
||||
return this.exclusions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.groupId + ":" + this.artifactId + ":" + this.version;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + this.groupId.hashCode();
|
||||
result = prime * result + this.artifactId.hashCode();
|
||||
result = prime * result + this.version.hashCode();
|
||||
result = prime * result + this.exclusions.hashCode();
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (getClass() == obj.getClass()) {
|
||||
Dependency other = (Dependency) obj;
|
||||
boolean result = true;
|
||||
result &= this.groupId.equals(other.groupId);
|
||||
result &= this.artifactId.equals(other.artifactId);
|
||||
result &= this.version.equals(other.version);
|
||||
result &= this.exclusions.equals(other.exclusions);
|
||||
return result;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static Dependency fromDependenciesXml(Element element) throws Exception {
|
||||
String groupId = getTextContent(element, "groupId");
|
||||
String artifactId = getTextContent(element, "artifactId");
|
||||
String version = getTextContent(element, "version");
|
||||
List<Exclusion> exclusions = Exclusion.fromExclusionsXml(element
|
||||
.getElementsByTagName("exclusions"));
|
||||
return new Dependency(groupId, artifactId, version, exclusions);
|
||||
}
|
||||
|
||||
private static String getTextContent(Element element, String tagName) {
|
||||
return element.getElementsByTagName(tagName).item(0).getTextContent();
|
||||
}
|
||||
|
||||
/**
|
||||
* A dependency exclusion.
|
||||
*/
|
||||
public final static class Exclusion {
|
||||
|
||||
private final String groupId;
|
||||
|
||||
private final String artifactId;
|
||||
|
||||
private Exclusion(String groupId, String artifactId) {
|
||||
Assert.notNull(groupId, "GroupId must not be null");
|
||||
Assert.notNull(groupId, "ArtifactId must not be null");
|
||||
this.groupId = groupId;
|
||||
this.artifactId = artifactId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the exclusion artifact id.
|
||||
*/
|
||||
public String getArtifactId() {
|
||||
return this.artifactId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the exclusion group id.
|
||||
*/
|
||||
public String getGroupId() {
|
||||
return this.groupId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.groupId + ":" + this.artifactId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return this.groupId.hashCode() * 31 + this.artifactId.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (getClass() == obj.getClass()) {
|
||||
Exclusion other = (Exclusion) obj;
|
||||
boolean result = true;
|
||||
result &= this.groupId.equals(other.groupId);
|
||||
result &= this.artifactId.equals(other.artifactId);
|
||||
return result;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static List<Exclusion> fromExclusionsXml(NodeList exclusion) {
|
||||
if (exclusion == null || exclusion.getLength() == 0) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return fromExclusionsXml(exclusion.item(0));
|
||||
}
|
||||
|
||||
private static List<Exclusion> fromExclusionsXml(Node item) {
|
||||
List<Exclusion> exclusions = new ArrayList<Dependency.Exclusion>();
|
||||
NodeList children = item.getChildNodes();
|
||||
for (int i = 0; i < children.getLength(); i++) {
|
||||
Node child = children.item(i);
|
||||
if (child instanceof Element) {
|
||||
exclusions.add(fromExclusionXml((Element) child));
|
||||
}
|
||||
}
|
||||
return exclusions;
|
||||
}
|
||||
|
||||
private static Exclusion fromExclusionXml(Element element) {
|
||||
String groupId = getTextContent(element, "groupId");
|
||||
String artifactId = getTextContent(element, "artifactId");
|
||||
return new Exclusion(groupId, artifactId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* 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 org.springframework.boot.dependency.tools;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
/**
|
||||
* Provides access to the managed dependencies declared in
|
||||
* {@literal spring-boot-dependencies}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
* @see Dependency
|
||||
*/
|
||||
public class ManagedDependencies implements Iterable<Dependency> {
|
||||
|
||||
private static ManagedDependencies instance;
|
||||
|
||||
private final String version;
|
||||
|
||||
private final Map<ArtifactAndGroupId, Dependency> byArtifactAndGroupId;
|
||||
|
||||
private final Map<String, Dependency> byArtifactId;
|
||||
|
||||
ManagedDependencies(String dependenciesPomResource, String effectivePomResource) {
|
||||
try {
|
||||
Document dependenciesPomDocument = readDocument(dependenciesPomResource);
|
||||
this.version = dependenciesPomDocument.getElementsByTagName("version")
|
||||
.item(0).getTextContent();
|
||||
|
||||
// Parse all dependencies from the effective POM (with resolved properties)
|
||||
Document effectivePomDocument = readDocument(effectivePomResource);
|
||||
Map<ArtifactAndGroupId, Dependency> all = new HashMap<ArtifactAndGroupId, Dependency>();
|
||||
for (Dependency dependency : readDependencies(effectivePomDocument)) {
|
||||
all.put(new ArtifactAndGroupId(dependency), dependency);
|
||||
}
|
||||
|
||||
// But only add those from the dependencies POM
|
||||
this.byArtifactAndGroupId = new LinkedHashMap<ManagedDependencies.ArtifactAndGroupId, Dependency>();
|
||||
this.byArtifactId = new LinkedHashMap<String, Dependency>();
|
||||
for (Dependency dependency : readDependencies(dependenciesPomDocument)) {
|
||||
ArtifactAndGroupId artifactAndGroupId = new ArtifactAndGroupId(dependency);
|
||||
Dependency effectiveDependency = all.get(artifactAndGroupId);
|
||||
if (effectiveDependency != null) {
|
||||
this.byArtifactAndGroupId
|
||||
.put(artifactAndGroupId, effectiveDependency);
|
||||
this.byArtifactId.put(effectiveDependency.getArtifactId(),
|
||||
effectiveDependency);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new IllegalStateException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private Document readDocument(String resource) throws Exception {
|
||||
InputStream stream = getClass().getResourceAsStream(resource);
|
||||
if (stream == null) {
|
||||
throw new IllegalStateException("Unable to open resource " + resource);
|
||||
}
|
||||
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance()
|
||||
.newDocumentBuilder();
|
||||
Document document = documentBuilder.parse(stream);
|
||||
document.getDocumentElement().normalize();
|
||||
return document;
|
||||
}
|
||||
|
||||
private List<Dependency> readDependencies(Document document) throws Exception {
|
||||
Element element = (Element) document.getElementsByTagName("project").item(0);
|
||||
element = (Element) element.getElementsByTagName("dependencyManagement").item(0);
|
||||
element = (Element) element.getElementsByTagName("dependencies").item(0);
|
||||
NodeList nodes = element.getChildNodes();
|
||||
List<Dependency> dependencies = new ArrayList<Dependency>();
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
Node node = nodes.item(i);
|
||||
if (node instanceof Element) {
|
||||
dependencies.add(Dependency.fromDependenciesXml((Element) node));
|
||||
}
|
||||
}
|
||||
return dependencies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the 'spring-boot-dependencies' POM version.
|
||||
*/
|
||||
public String getVersion() {
|
||||
return this.version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a single dependency for the given group and artifact IDs.
|
||||
* @param groupId the group ID
|
||||
* @param artifactId the artifact ID
|
||||
* @return a {@link Dependency} or {@code null}
|
||||
*/
|
||||
public Dependency find(String groupId, String artifactId) {
|
||||
return this.byArtifactAndGroupId.get(new ArtifactAndGroupId(groupId, artifactId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a single dependency for the artifact IDs.
|
||||
* @param artifactId the artifact ID
|
||||
* @return a {@link Dependency} or {@code null}
|
||||
*/
|
||||
public Dependency find(String artifactId) {
|
||||
return this.byArtifactId.get(artifactId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide an {@link Iterator} over all managed {@link Dependency Dependencies}.
|
||||
*/
|
||||
@Override
|
||||
public Iterator<Dependency> iterator() {
|
||||
return this.byArtifactAndGroupId.values().iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The Spring Boot managed dependencies.
|
||||
*/
|
||||
public static ManagedDependencies get() {
|
||||
if (instance == null) {
|
||||
return new ManagedDependencies("dependencies-pom.xml", "effective-pom.xml");
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple holder for an artifact+group ID.
|
||||
*/
|
||||
private static class ArtifactAndGroupId {
|
||||
|
||||
private final String groupId;
|
||||
|
||||
private final String artifactId;
|
||||
|
||||
public ArtifactAndGroupId(Dependency dependency) {
|
||||
this(dependency.getGroupId(), dependency.getArtifactId());
|
||||
}
|
||||
|
||||
public ArtifactAndGroupId(String groupId, String artifactId) {
|
||||
Assert.notNull(groupId, "GroupId must not be null");
|
||||
Assert.notNull(artifactId, "ArtifactId must not be null");
|
||||
this.groupId = groupId;
|
||||
this.artifactId = artifactId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return this.groupId.hashCode() * 31 + this.artifactId.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (getClass() == obj.getClass()) {
|
||||
ArtifactAndGroupId other = (ArtifactAndGroupId) obj;
|
||||
boolean result = true;
|
||||
result &= this.groupId.equals(other.groupId);
|
||||
result &= this.artifactId.equals(other.artifactId);
|
||||
return result;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Utilities for working with the managed dependencies declared in the
|
||||
* {@literal spring-boot-dependencies} project.
|
||||
*
|
||||
* @see org.springframework.boot.dependency.tools.ManagedDependencies
|
||||
*/
|
||||
package org.springframework.boot.dependency.tools;
|
||||
|
@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Copyright 2012-2014 the original author or authors.
|
||||
*
|
||||
* 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 org.springframework.boot.dependency.tools;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.hamcrest.Matchers.nullValue;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link ManagedDependencies}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class ManagedDependenciesTests {
|
||||
|
||||
private ManagedDependencies dependencies;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
this.dependencies = new ManagedDependencies("test-dependencies-pom.xml",
|
||||
"test-effective-pom.xml");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void version() throws Exception {
|
||||
assertThat(this.dependencies.getVersion(), equalTo("1.0.0.BUILD-SNAPSHOT"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void iterate() throws Exception {
|
||||
Iterator<Dependency> iterator = this.dependencies.iterator();
|
||||
assertThat(iterator.next().toString(), equalTo("org.sample:sample01:1.0.0"));
|
||||
assertThat(iterator.next().toString(), equalTo("org.sample:sample02:1.0.0"));
|
||||
assertThat(iterator.hasNext(), equalTo(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByArtifactAndGroupId() throws Exception {
|
||||
assertThat(this.dependencies.find("org.sample", "sample02").toString(),
|
||||
equalTo("org.sample:sample02:1.0.0"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByArtifactAndGroupIdMissing() throws Exception {
|
||||
assertThat(this.dependencies.find("org.sample", "missing"), nullValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByArtifactAndGroupIdOnlyInEffectivePom() throws Exception {
|
||||
assertThat(this.dependencies.find("org.extra", "extra01"), nullValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByArtifactId() throws Exception {
|
||||
assertThat(this.dependencies.find("sample02").toString(),
|
||||
equalTo("org.sample:sample02:1.0.0"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByArtifactIdMissing() throws Exception {
|
||||
assertThat(this.dependencies.find("missing"), nullValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exludes() throws Exception {
|
||||
Dependency dependency = this.dependencies.find("org.sample", "sample01");
|
||||
assertThat(dependency.getExclusions().toString(),
|
||||
equalTo("[org.exclude:exclude01]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void get() throws Exception {
|
||||
ManagedDependencies dependencies = ManagedDependencies.get();
|
||||
assertThat(dependencies.iterator().hasNext(), equalTo(true));
|
||||
assertThat(dependencies.find("org.springframework", "spring-core"),
|
||||
notNullValue());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<version>1.0.0.BUILD-SNAPSHOT</version>
|
||||
<properties>
|
||||
<sample.version>1.0.0</sample.version>
|
||||
</properties>
|
||||
<prerequisites>
|
||||
<maven>3.0.0</maven>
|
||||
</prerequisites>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.sample</groupId>
|
||||
<artifactId>sample01</artifactId>
|
||||
<version>${sample.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.exclude</groupId>
|
||||
<artifactId>exclude01</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.sample</groupId>
|
||||
<artifactId>sample02</artifactId>
|
||||
<version>${sample.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
</project>
|
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<version>1.0.0.BUILD-SNAPSHOT</version>
|
||||
<properties>
|
||||
<sample.version>1.0.0</sample.version>
|
||||
</properties>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.sample</groupId>
|
||||
<artifactId>sample01</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.exclude</groupId>
|
||||
<artifactId>exclude01</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.sample</groupId>
|
||||
<artifactId>sample02</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.extra</groupId>
|
||||
<artifactId>extra01</artifactId>
|
||||
<version>2.0.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
</project>
|
@ -0,0 +1,51 @@
|
||||
|
||||
package org.springframework.boot.gradle;
|
||||
|
||||
import org.gradle.api.Action;
|
||||
import org.gradle.api.artifacts.DependencyResolveDetails;
|
||||
import org.gradle.api.artifacts.ModuleVersionSelector;
|
||||
import org.gradle.api.artifacts.ResolutionStrategy;
|
||||
import org.springframework.boot.dependency.tools.Dependency;
|
||||
import org.springframework.boot.dependency.tools.ManagedDependencies;
|
||||
|
||||
/**
|
||||
* A resolution strategy to resolve missing version numbers using the
|
||||
* 'spring-boot-dependencies' POM.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class SpringBootResolutionStrategy {
|
||||
|
||||
private static final String SPRING_BOOT_GROUP = "org.springframework.boot";
|
||||
|
||||
public static void apply(ResolutionStrategy resolutionStrategy) {
|
||||
resolutionStrategy.eachDependency(new Action<DependencyResolveDetails>() {
|
||||
|
||||
@Override
|
||||
public void execute(DependencyResolveDetails resolveDetails) {
|
||||
String version = resolveDetails.getTarget().getVersion();
|
||||
if (version == null || version.trim().length() == 0) {
|
||||
resolve(resolveDetails);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
protected static void resolve(DependencyResolveDetails resolveDetails) {
|
||||
|
||||
ManagedDependencies dependencies = ManagedDependencies.get();
|
||||
ModuleVersionSelector target = resolveDetails.getTarget();
|
||||
|
||||
if (SPRING_BOOT_GROUP.equals(target.getGroup())) {
|
||||
resolveDetails.useVersion(dependencies.getVersion());
|
||||
return;
|
||||
}
|
||||
|
||||
Dependency dependency = dependencies.find(target.getGroup(), target.getName());
|
||||
if (dependency != null) {
|
||||
resolveDetails.useVersion(dependency.getVersion());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue