Created a Spring Data GemFire Starter POM

... as well as a Spring Boot Sample Application with associated tests
for demonstrating how to get started using both Spring Data GemFire
and GemFire.
This commit is contained in:
John Blum 2014-03-28 22:47:56 -07:00 committed by Dave Syer
parent 898698a681
commit 34cbe1e60b
15 changed files with 698 additions and 2 deletions

View File

@ -52,6 +52,7 @@
<commons-dbcp.version>1.4</commons-dbcp.version>
<commons-pool.version>1.6</commons-pool.version>
<crashub.version>1.3.0-beta14</crashub.version>
<gemfire.version>7.0.1</gemfire.version>
<gradle.version>1.6</gradle.version>
<groovy.version>2.3.0-rc-1</groovy.version>
<h2.version>1.3.175</h2.version>
@ -87,6 +88,7 @@
<spring-integration.version>3.0.2.RELEASE</spring-integration.version>
<spring-batch.version>2.2.6.RELEASE</spring-batch.version>
<spring-data-couchbase.version>1.0.0.RELEASE</spring-data-couchbase.version>
<spring-data-gemfire.version>1.3.3.RELEASE</spring-data-gemfire.version>
<spring-data-redis.version>1.1.1.RELEASE</spring-data-redis.version>
<spring-data-releasetrain.version>Codd-SR2</spring-data-releasetrain.version>
<spring-hateoas.version>0.9.0.RELEASE</spring-hateoas.version>
@ -311,6 +313,11 @@
<artifactId>jetty-annotations</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>com.gemstone.gemfire</groupId>
<artifactId>gemfire</artifactId>
<version>${gemfire.version}</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
@ -525,7 +532,12 @@
<artifactId>spring-batch-core</artifactId>
<version>${spring-batch.version}</version>
</dependency>
<dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-gemfire</artifactId>
<version>${spring-data-gemfire.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>${spring-data-releasetrain.version}</version>

View File

@ -217,7 +217,7 @@
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</repositories>
<build>
<pluginManagement>
<plugins>

View File

@ -27,6 +27,7 @@
<module>spring-boot-sample-amqp</module>
<module>spring-boot-sample-aop</module>
<module>spring-boot-sample-batch</module>
<module>spring-boot-sample-data-gemfire</module>
<module>spring-boot-sample-data-jpa</module>
<module>spring-boot-sample-data-mongodb</module>
<module>spring-boot-sample-data-redis</module>

View File

@ -0,0 +1,39 @@
<?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>
<!-- Your own application should inherit from spring-boot-starter-parent -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-samples</artifactId>
<version>1.0.1.BUILD-SNAPSHOT</version>
</parent>
<artifactId>spring-boot-sample-data-gemfire</artifactId>
<packaging>jar</packaging>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-gemfire</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,53 @@
/*
* Copyright 2010-2013 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 sample.data.gemfire;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* The GemstoneAppConfiguration class for allowing Spring Boot to pickup additional application Spring configuration
* meta-data for GemFire, which must be specified in Spring Data GemFire's XML namespace.
* <p/>
* @author John Blum
* @see org.springframework.boot.autoconfigure.EnableAutoConfiguration
* @see org.springframework.context.annotation.ComponentScan
* @see org.springframework.context.annotation.Configuration
* @see org.springframework.context.annotation.ImportResource
* @see org.springframework.data.gemfire.repository.config.EnableGemfireRepositories
* @see org.springframework.transaction.annotation.EnableTransactionManagement
* @since 1.0.0
*/
@Configuration
@ImportResource("/spring-data-gemfire-cache.xml")
@ComponentScan
@EnableAutoConfiguration
@EnableGemfireRepositories
@EnableTransactionManagement
@SuppressWarnings("unused")
public class SampleDataGemFireApplication {
public static void main(final String[] args) {
SpringApplication.run(SampleDataGemFireApplication.class, args);
}
}

View File

@ -0,0 +1,99 @@
/*
* Copyright 2010-2013 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 sample.data.gemfire.domain;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.gemfire.mapping.Region;
import org.springframework.util.ObjectUtils;
/**
* The Gemstone class is an abstract data type modeling a Gemstone, such as a diamond or a ruby.
* <p/>
* @author John Blum
* @see java.io.Serializable
* @see org.springframework.data.annotation.Id
* @see org.springframework.data.gemfire.mapping.Region
* @since 1.0.0
*/
@Region("Gemstones")
@SuppressWarnings("unused")
public class Gemstone implements Serializable {
@Id
private Long id;
private String name;
public Gemstone() {
}
public Gemstone(final Long id) {
this.id = id;
}
public Gemstone(final Long id, final String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(final Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Gemstone)) {
return false;
}
Gemstone that = (Gemstone) obj;
return ObjectUtils.nullSafeEquals(this.getName(), that.getName());
}
@Override
public int hashCode() {
int hashValue = 17;
hashValue = 37 * hashValue + ObjectUtils.nullSafeHashCode(getName());
return hashValue;
}
@Override
public String toString() {
return String.format("{ @type = %1$s, id = %2$d, name = %3$s }",
getClass().getName(), getId(), getName());
}
}

View File

@ -0,0 +1,45 @@
/*
* Copyright 2010-2013 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 sample.data.gemfire.service;
import org.springframework.data.gemfire.repository.GemfireRepository;
import sample.data.gemfire.domain.Gemstone;
/**
* The GemstoneRepository interface is an extension of the GemfireRepository abstraction for encapsulating data access
* and persistence operations (CRUD) on Gemstone domain objects.
* <p/>
* @author John Blum
* @see org.springframework.data.gemfire.repository.GemfireRepository
* @see sample.data.gemfire.domain.Gemstone
* @since 1.0.0
*/
public interface GemstoneRepository extends GemfireRepository<Gemstone, Long> {
/**
* Finds a particular Gemstone in the GemFire Cache by name.
* <p/>
*
* @param <T> the Class type of the Gemstone domain object to find.
* @param name a String value indicating the name of the Gemstone to find.
* @return a Gemstone by name.
* @see sample.data.gemfire.domain.Gemstone
*/
<T extends Gemstone> T findByName(String name);
}

View File

@ -0,0 +1,80 @@
/*
* Copyright 2010-2013 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 sample.data.gemfire.service;
import sample.data.gemfire.domain.Gemstone;
/**
* The GemstoneService interface is a Service interface object contract defining business operations for processing
* Gemstone domain objects.
* <p/>
* @author John Blum
* @see sample.data.gemfire.domain.Gemstone
* @since 1.0.0
*/
@SuppressWarnings("unused")
public interface GemstoneService {
/**
* Returns a count of the number of Gemstones in the GemFire Cache.
* <p/>
*
* @return a long value indicating the number of Gemstones in the GemFire Cache.
*/
long count();
/**
* Gets a Gemstone by ID.
* <p/>
*
* @param id a long value indicating the identifier of the Gemstone.
* @return a Gemstone with ID, or null if no Gemstone exists with ID.
* @see sample.data.gemfire.domain.Gemstone
*/
Gemstone get(Long id);
/**
* Gets a Gemstone by name.
* <p/>
*
* @param name a String value indicating the name of the Gemstone.
* @return a Gemstone with name, or null if no Gemstone exists with name.
* @see sample.data.gemfire.domain.Gemstone
*/
Gemstone get(String name);
/**
* Return a listing of Gemstones currently stored in the GemFire Cache.
* <p/>
*
* @return a Iterable object to iterate over the list of Gemstones currently stored in the GemFire Cache.
* @see java.lang.Iterable
* @see sample.data.gemfire.domain.Gemstone
*/
Iterable<Gemstone> list();
/**
* Saves the specified Gemstone to the GemFire Cache.
* <p/>
*
* @param gemstone the Gemstone to save in the GemFire Cache.
* @return the saved Gemstone.
* @see sample.data.gemfire.domain.Gemstone
*/
Gemstone save(Gemstone gemstone);
}

View File

@ -0,0 +1,162 @@
/*
* Copyright 2010-2013 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 sample.data.gemfire.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import sample.data.gemfire.domain.Gemstone;
/**
* The GemstoneServiceImpl class is a Service object implementing the GemstoneService interface containing
* business logic and rules in addition to data services for processing Gemstones.
* <p/>
* @author John Blum
* @see org.springframework.stereotype.Service
* @see org.springframework.transaction.annotation.Transactional
* @see sample.data.gemfire.domain.Gemstone
* @see sample.data.gemfire.service.GemstoneRepository
* @see sample.data.gemfire.service.GemstoneService
* @since 1.0.0
*/
@Service("gemstoneService")
@SuppressWarnings("unused")
public class GemstoneServiceImpl implements GemstoneService {
protected static final List<String> APPROVED_GEMS = new ArrayList<String>(Arrays.asList(
"ALEXANDRITE", "AQUAMARINE", "DIAMOND", "OPAL", "PEARL", "RUBY", "SAPPHIRE", "SPINEL", "TOPAZ"));
@Autowired
private GemstoneRepository gemstoneRepo;
@PostConstruct
public void init() {
Assert.notNull(gemstoneRepo, "A reference to the 'GemstoneRepository' was not properly configured!");
System.out.printf("%1$s initialized!%n", getClass().getSimpleName());
}
/**
* Returns a count of the number of Gemstones in the GemFire Cache.
* <p/>
*
* @return a long value indicating the number of Gemstones in the GemFire Cache.
*/
@Transactional(readOnly = true)
public long count() {
return gemstoneRepo.count();
}
/**
* Gets a Gemstone by ID.
* <p/>
*
* @param id a long value indicating the identifier of the Gemstone.
* @return a Gemstone with ID, or null if no Gemstone exists with ID.
* @see sample.data.gemfire.domain.Gemstone
*/
@Transactional(readOnly = true)
public Gemstone get(final Long id) {
return gemstoneRepo.findOne(id);
}
/**
* Gets a Gemstone by name.
* <p/>
*
* @param name a String value indicating the name of the Gemstone.
* @return a Gemstone with name, or null if no Gemstone exists with name.
* @see sample.data.gemfire.domain.Gemstone
*/
@Transactional(readOnly = true)
public Gemstone get(final String name) {
return gemstoneRepo.findByName(name);
}
/**
* Return a listing of Gemstones currently stored in the GemFire Cache.
* <p/>
*
* @return a Iterable object to iterate over the list of Gemstones currently stored in the GemFire Cache.
* @see java.lang.Iterable
* @see sample.data.gemfire.domain.Gemstone
*/
@Transactional(readOnly = true)
public Iterable<Gemstone> list() {
return gemstoneRepo.findAll();
}
/**
* Saves the specified Gemstone to the GemFire Cache.
* <p/>
*
* @param gemstone the Gemstone to save in the GemFire Cache.
* @return the saved Gemstone.
* @see sample.data.gemfire.domain.Gemstone
*/
@Transactional
public Gemstone save(final Gemstone gemstone) {
Assert.notNull(gemstone, "The Gemstone to save must not be null!");
Assert.notNull(gemstone.getName(), "The name of the Gemstone must be specified!");
// NOTE deliberately (naively) validate the Gemstone after mutating data access in GemFire rather than before
// to demonstrate transactions in GemFire.
Gemstone savedGemstone = validate(gemstoneRepo.save(gemstone));
Assert.state(savedGemstone.equals(get(gemstone.getId())),
String.format("Failed to find Gemstone (%1$s) in GemFire's Cache Region 'Gemstones'!", gemstone));
System.out.printf("Saved Gemstone (%1$s)%n", savedGemstone.getName());
return gemstone;
}
private Gemstone validate(final Gemstone gemstone) {
if (!APPROVED_GEMS.contains(gemstone.getName().toUpperCase())) {
// NOTE if the Gemstone is not valid, blow chunks (should cause transaction to rollback in GemFire)!
System.err.printf("Illegal Gemstone (%1$s)!%n", gemstone.getName());
throw new IllegalGemstoneException(String.format("'%1$s' is not a valid Gemstone!", gemstone.getName()));
}
return gemstone;
}
public static final class IllegalGemstoneException extends IllegalArgumentException {
public IllegalGemstoneException() {
}
public IllegalGemstoneException(final String message) {
super(message);
}
public IllegalGemstoneException(final Throwable cause) {
super(cause);
}
public IllegalGemstoneException(final String message, final Throwable cause) {
super(message, cause);
}
}
}

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:gfe="http://www.springframework.org/schema/gemfire"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
">
<util:properties id="gemfireCacheConfigurationSettings">
<prop key="name">GemstonesSpringGemFireApp</prop>
<prop key="log-level">config</prop>
<prop key="mcast-port">0</prop>
</util:properties>
<gfe:cache properties-ref="gemfireCacheConfigurationSettings"/>
<gfe:replicated-region id="Gemstones" ignore-jta="true" persistent="false"
key-constraint="java.lang.Long" value-constraint="sample.data.gemfire.domain.Gemstone"/>
<gfe:transaction-manager id="transactionManager" copy-on-read="true"/>
</beans>

View File

@ -0,0 +1,131 @@
/*
* Copyright 2010-2013 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 sample.data.gemfire;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import sample.data.gemfire.domain.Gemstone;
import sample.data.gemfire.service.GemstoneService;
import sample.data.gemfire.service.GemstoneServiceImpl.IllegalGemstoneException;
/**
* The SampleDataGemFireApplicationTest class is a test suite with test cases testing the SampleDataGemFireApplication
* in Spring Boot.
* <p/>
* @author John Blum
* @see org.junit.Test
* @see org.junit.runner.RunWith
* @see org.springframework.boot.test.SpringApplicationConfiguration
* @see org.springframework.test.context.junit4.SpringJUnit4ClassRunner
* @see sample.data.gemfire.SampleDataGemFireApplication
* @since 1.0.0
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SampleDataGemFireApplication.class)
@SuppressWarnings("unused")
public class SampleDataGemFireApplicationTest {
@Autowired
private GemstoneService gemstoneService;
private final AtomicLong ID_GENERATOR = new AtomicLong(0l);
protected List<Gemstone> asList(final Iterable<Gemstone> gemstones) {
List<Gemstone> gemstoneList = new ArrayList<Gemstone>();
if (gemstones != null) {
for (Gemstone gemstone : gemstones) {
gemstoneList.add(gemstone);
}
}
return gemstoneList;
}
protected Gemstone createGemstone(final String name) {
return createGemstone(ID_GENERATOR.incrementAndGet(), name);
}
protected Gemstone createGemstone(final Long id, final String name) {
return new Gemstone(id, name);
}
protected List<Gemstone> getGemstones(final String... names) {
List<Gemstone> gemstones = new ArrayList<Gemstone>(names.length);
for (String name : names) {
gemstones.add(createGemstone(null, name));
}
return gemstones;
}
@Before
public void setup() {
assertNotNull("A reference to the GemstoneService was not properly configured!", gemstoneService);
}
@Test
public void testGemstonesApp() {
assertEquals(0, gemstoneService.count());
assertTrue(asList(gemstoneService.list()).isEmpty());
gemstoneService.save(createGemstone("Diamond"));
gemstoneService.save(createGemstone("Ruby"));
assertEquals(2, gemstoneService.count());
assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby")));
try {
gemstoneService.save(createGemstone("Coal"));
}
catch (IllegalGemstoneException expected) {
}
assertEquals(2, gemstoneService.count());
assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby")));
gemstoneService.save(createGemstone("Pearl"));
gemstoneService.save(createGemstone("Sapphire"));
assertEquals(4, gemstoneService.count());
assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")));
try {
gemstoneService.save(createGemstone("Quartz"));
}
catch (IllegalGemstoneException expected) {
}
assertEquals(4, gemstoneService.count());
assertTrue(asList(gemstoneService.list()).containsAll(getGemstones("Diamond", "Ruby", "Pearl", "Sapphire")));
assertEquals(createGemstone("Diamond"), gemstoneService.get("Diamond"));
assertEquals(createGemstone("Pearl"), gemstoneService.get("Pearl"));
}
}

View File

@ -25,6 +25,7 @@
<module>spring-boot-starter-aop</module>
<module>spring-boot-starter-batch</module>
<module>spring-boot-starter-data-couchbase</module>
<module>spring-boot-starter-data-gemfire</module>
<module>spring-boot-starter-data-jpa</module>
<module>spring-boot-starter-data-mongodb</module>
<module>spring-boot-starter-integration</module>

View File

@ -0,0 +1,42 @@
<?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-starters</artifactId>
<version>1.0.1.BUILD-SNAPSHOT</version>
</parent>
<artifactId>spring-boot-starter-data-gemfire</artifactId>
<packaging>jar</packaging>
<properties>
<main.basedir>${basedir}/../..</main.basedir>
</properties>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.gemstone.gemfire</groupId>
<artifactId>gemfire</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-gemfire</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-plugins</id>
<url>http://repo.spring.io/plugins-release</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

View File

@ -0,0 +1 @@
provides: gemfire,spring-data-gemfire

View File

@ -76,6 +76,11 @@
<artifactId>spring-boot-starter-batch</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-gemfire</artifactId>
<version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>