Commit f56b6d16 by 李传峰

feat:[none] 初始集成新版本框架

parent d46bb088
@echo off
call mvn eclipse:clean
call pause
call mvn clean source:jar deploy -Denforcer.skip=true -Dmaven.test.skip=true -U
@pause
\ No newline at end of file
call mvn clean install -Denforcer.skip=true -Dmaven.test.skip=true -U
call pause
\ No newline at end of file
......@@ -5,7 +5,7 @@
<parent>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common-parent</artifactId>
<version>2.1.0-RELEASE</version>
<version>3.1.0-SNAPSHOT</version>
</parent>
<artifactId>pcloud-common-config</artifactId>
......@@ -16,7 +16,7 @@
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
......@@ -5,50 +5,38 @@
<parent>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common-parent</artifactId>
<version>2.1.0-RELEASE</version>
<version>3.1.0-SNAPSHOT</version>
</parent>
<artifactId>pcloud-common-core</artifactId>
<packaging>jar</packaging>
<version>${pcloud-common-core.version}</version>
<version>${reversion}</version>
<name>pcloud-common-core</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<universe-springcloud-monitor-starter.version>1.0.1-SNAPSHOT</universe-springcloud-monitor-starter.version>
<universe-dbmonitor-starter.version>1.0.1-SNAPSHOT</universe-dbmonitor-starter.version>
<universe-monitorlog-logback-starter.version>1.0.1-SNAPSHOT</universe-monitorlog-logback-starter.version>
</properties>
<dependencies>
<dependency>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common</artifactId>
<version>${pcloud-common.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>${reversion}</version>
</dependency>
<dependency>
<groupId>com.pcloud.universe</groupId>
<artifactId>universe-springcloud-monitor-starter</artifactId>
<version>${universe-springcloud-monitor-starter.version}</version>
</dependency>
<dependency>
<groupId>com.pcloud.universe</groupId>
<artifactId>universe-dbmonitor-starter</artifactId>
<version>${universe-dbmonitor-starter.version}</version>
</dependency>
<dependency>
<groupId>com.pcloud.universe</groupId>
<artifactId>universe-monitorlog-logback-starter</artifactId>
<version>${universe-monitorlog-logback-starter.version}</version>
</dependency>
<!-- Database connect Begin -->
......
package com.pcloud.common.core.tools;
import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
import io.micrometer.spring.autoconfigure.MeterRegistryConfigurer;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//import org.springframework.cloud.netflix.hystrix.EnableHystrix;
//import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
/**
* Created by zengqiang on 17-11-16.
*/
//@EnableHystrix
//@EnableHystrixDashboard
@Configuration
public class CommonBeans {
private static Logger LOGGER = LoggerFactory.getLogger(CommonBeans.class);
@Autowired
private Environment environment;
private long timeout = 10;
@Bean
public ProcessorMetrics processorMetrics() {
return new ProcessorMetrics();
}
@Bean
public JvmGcMetrics jvmGcMetrics() {
return new JvmGcMetrics();
}
@Bean
public JvmThreadMetrics jvmThreadMetrics() {
return new JvmThreadMetrics();
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
@Primary
MeterRegistryConfigurer configurer() {
try {
InetAddress inetAddress = getLocalInetAddress();
String host = null == inetAddress ? "unknown" : inetAddress.getHostName() + "/" + inetAddress.getHostAddress();
return registry -> {
registry.config().commonTags("host/ip", host);
};
} catch (Exception e) {
LOGGER.error("create MeterRegistryConfigurer error", e);
return null;
}
}
/**
* 取当前系统站点本地地址 linux下 和 window下可用
*
* @return
*/
public InetAddress getLocalInetAddress() {
InetAddress ia = null, inetAddress = null;
try {
for (Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements();) {
NetworkInterface networkInterface = interfaces.nextElement();
if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
continue;
}
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
ia = addresses.nextElement();
if (ia instanceof Inet4Address) {
inetAddress = ia;
}
}
}
} catch (SocketException e) {
return null;
}
return inetAddress;
}
@Bean
public GracefulShutdownConnector gracefulShutdown() {
return new GracefulShutdownConnector();
}
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer(@Autowired GracefulShutdownConnector connector) {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers(connector);
}
}
};
}
class GracefulShutdownConnector implements TomcatConnectorCustomizer,
ApplicationListener<ContextClosedEvent> {
private volatile Connector connector;
@Override
public void customize(Connector connector) {
this.connector = connector;
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
if (environment.containsProperty("shutdownTimeout")) {
timeout = environment.getProperty("shutdownTimeout", Long.class);
}
this.connector.pause();
Executor executor = this.connector.getProtocolHandler().getExecutor();
if (executor instanceof ThreadPoolExecutor) {
try {
ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
threadPoolExecutor.shutdown();
if (!threadPoolExecutor.awaitTermination(timeout, TimeUnit.SECONDS)) {
LOGGER.warn("Tomcat thread pool did not shut down gracefully within "
+ timeout + " seconds. Proceeding with forceful shutdown");
}
}
catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
}
package com.pcloud.common.core.zipkin;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.cloud.sleuth.Sampler;
import org.springframework.cloud.sleuth.Span;
import java.util.BitSet;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 自定义采样率Sampler
*/
@Slf4j
public class PercentageLocalSampler implements Sampler {
//采样率最小值
private static final Float MIN_PERCENTAGE = 0.0f;
//采样率最大值
private static final Float MAX_PERCENTAGE = 1.0f;
private Map<String, BitSet> sampleDecisionsMap;
//本地采样器
private final SamplerLocalProperties configuration;
private Float globalPercentage;
private static final String all = "all";
//替换访问地址前缀正则表达式
private static final String regex = "^(http://www\\.|http://|www\\.|http:)";
//uri访问次数
private final Map<String, AtomicInteger> concurrentSampleCount;
//刷新本地采样器和读取采样器配置使用读写锁,该场景读大于写,后期可优化为类似eureka注册表多级缓存
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//读锁
ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
//写锁
ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
public PercentageLocalSampler(SamplerLocalProperties configuration) {
this.configuration = configuration;
sampleDecisionsMap = buildRandomBit();
concurrentSampleCount = new ConcurrentHashMap<>();
concurrentSampleCount.put(all, new AtomicInteger(0));
}
public Map<String, AtomicInteger> getConcurrentSampleCount() {
return this.concurrentSampleCount;
}
@Override
public boolean isSampled(Span currentSpan) {
try {
readLock.lock();
if (currentSpan == null) {
return false;
}
// 获取span中的请求uri
String uri = currentSpan.getName();
uri = uri.replaceFirst(regex, "");
AtomicInteger count = this.concurrentSampleCount.get(all);
// 获取全局的bitSet
BitSet bitSet = this.sampleDecisionsMap.get(all);
// 获取全局的采样率
float percentage = this.configuration.getPercentage();
for (UriSampleProperties sampleProperties : configuration.getUriSamples()) {
// 正则匹配
if (uri.matches(sampleProperties.getUriRegex())) {
//匹配上了自定义采样率的正则
// 多个线程会有并发问题,加个局部锁
synchronized (this) {
// 判断当前uri是否在map中
if (!concurrentSampleCount.containsKey(uri)) {
concurrentSampleCount.put(uri, new AtomicInteger(0));
}
}
// 获取当前URI对应的访问次数
count = concurrentSampleCount.get(uri);
// 获取当前URI对应的bitSet
bitSet = sampleDecisionsMap.get(sampleProperties.getUriRegex());
// 获取当前URI对应的采样率
percentage = sampleProperties.getUriPercentage();
break;
}
}
log.warn("replace uri {} , percentage {}", uri, percentage);
// 如果采样率是0 ,直接返回false
if (percentage == MIN_PERCENTAGE) {
return false;
} else if (percentage == MAX_PERCENTAGE) { // 如果采样率是1 ,那么直接返回true
return true;
}
synchronized (this) {
// 访问次数加1
final int i = count.getAndIncrement();
// 判断当前的访问 次数是否在 bitSet中,存在则返回true
boolean result = bitSet.get(i);
// 等于99的时候,重新设置为0
if (i == 99) {
count.set(0);
}
return result;
}
} finally {
readLock.unlock();
}
}
private static BitSet randomBitSet(int size, int cardinality, Random rnd) {
BitSet result = new BitSet(size);
int[] chosen = new int[cardinality];
int i;
for (i = 0; i < cardinality; ++i) {
chosen[i] = i;
result.set(i);
}
for (; i < size; ++i) {
int j = rnd.nextInt(i + 1);
if (j < cardinality) {
result.clear(chosen[j]);
result.set(i);
chosen[j] = i;
}
}
return result;
}
private Map<String, BitSet> buildRandomBit() {
Map<String, BitSet> map = new ConcurrentHashMap<>();
int size = 100;
// 设置全局的采样率
int outOf100 = (int) (configuration.getPercentage() * size);
map.put(all, randomBitSet(size, outOf100, new Random()));
if (CollectionUtils.isNotEmpty(configuration.getUriSamples())) {
for (UriSampleProperties sampleProperties : configuration.getUriSamples()) {
// 设置个性化的采样率
map.put(sampleProperties.getUriRegex(), randomBitSet(size,
(int) (sampleProperties.getUriPercentage() * size), new Random()));
}
}
return map;
}
public void initPercentage(SamplerLocalProperties samplerRemoteProperties) {
try {
writeLock.lock();
configuration.setPercentage(samplerRemoteProperties.getPercentage());
configuration.setUriSamples(samplerRemoteProperties.getUriSamples());
sampleDecisionsMap = buildRandomBit();
} finally {
writeLock.unlock();
}
}
public SamplerLocalProperties getConfiguration() {
return configuration;
}
}
package com.pcloud.common.core.zipkin;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.pcloud.common.utils.string.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import org.springframework.core.env.PropertySource;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* 刷新本地采样率
*/
@Slf4j
@Component
public class RefreshSamplerLocalProperties implements ApplicationContextAware, InitializingBean {
@Autowired(required = false)
private List<PropertySourceLocator> propertySourceLocators = new ArrayList<>();
@Autowired(required = false)
private PercentageLocalSampler percentageLocalSampler;
//线程休眠时间
private static final Long REFRESH_SLEEP_TIME = 60 * 1000L;
//个性化采样率map的key
private static final String SPRING_ZIPKIN_URISAMPLEMAPJSONSTR = "spring.zipkin.uriSampleMapJsonStr";
//个性化设置全局采样率的key
private static final String SPRING_ZIPKIN_GLOBALPERCENTAGE = "spring.zipkin.globalPercentage";
//容器上下文
private ApplicationContext applicationContext;
//个性化采样率默认值
private static final String DEFAULT_URISAMPLEMAPJSONSTR = "{}";
//全局采样率默认值
private static final Float DEFAULT_GLOBALPERCENTAGE = 0.01f;
private Environment environment;
private static final String STATUS_DELIMITER="-";
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
environment = applicationContext.getEnvironment();
}
@Override
public void afterPropertiesSet() throws Exception {
new RefreshRequest().start();
}
public void setPropertySourceLocators(
Collection<PropertySourceLocator> propertySourceLocators) {
this.propertySourceLocators = new ArrayList<>(propertySourceLocators);
}
/**
* 读取git配置文件线程
*/
class RefreshRequest extends Thread {
@Override
public void run() {
while (true) {
try {
for (PropertySourceLocator locator : propertySourceLocators) {
PropertySource<?> source = null;
source = locator.locate(environment);
if (source == null) {
continue;
}
float globalPercentage = source.getProperty(SPRING_ZIPKIN_GLOBALPERCENTAGE) != null ? Float.parseFloat(source.getProperty(SPRING_ZIPKIN_GLOBALPERCENTAGE).toString()) : DEFAULT_GLOBALPERCENTAGE;
String uriSampleMapJsonStr = source.getProperty(SPRING_ZIPKIN_URISAMPLEMAPJSONSTR) != null ? source.getProperty(SPRING_ZIPKIN_URISAMPLEMAPJSONSTR).toString() : DEFAULT_URISAMPLEMAPJSONSTR;
log.warn("读取git配置文件 globalPercentage {} ,globalPercentageJsonStr {}", globalPercentage, uriSampleMapJsonStr);
if (!uriSampleMapJsonStr.equals(DEFAULT_URISAMPLEMAPJSONSTR)) {
loadSamplerProperties(globalPercentage,uriSampleMapJsonStr);
}
}
Thread.sleep(REFRESH_SLEEP_TIME);
} catch (Exception e) {
log.error("刷新采样率异常 {}", e);
}
}
}
}
/**
* 刷新PercentageLocalSampler
*
* @param globalPercentage 全局采样率
* @param uriSampleMapJsonStr url正则表达式和个性化采样率
*/
public void loadSamplerProperties(Float globalPercentage, String uriSampleMapJsonStr) {
//获取容器的percentageLocalSampler
if (null == percentageLocalSampler) {
percentageLocalSampler = (PercentageLocalSampler) applicationContext.getBean("percentageLocalSampler");
}
SamplerLocalProperties samplerLocalProperties = percentageLocalSampler.getConfiguration();
SamplerLocalProperties samplerRemoteLocalProperties = new SamplerLocalProperties();
//全局采样率配置更新
if (globalPercentage != null && globalPercentage != DEFAULT_GLOBALPERCENTAGE) {
samplerRemoteLocalProperties.setPercentage(globalPercentage);
}
if (!StringUtil.isEmpty(uriSampleMapJsonStr) && !uriSampleMapJsonStr.equals(DEFAULT_URISAMPLEMAPJSONSTR)) {
List<UriSampleProperties> uriSamples = new ArrayList<>();
Map<Float, ArrayList<String>> uriSampleMap = (HashMap<Float, ArrayList<String>>) JSON.parseObject(uriSampleMapJsonStr, new TypeReference<HashMap<Float, ArrayList<String>>>() {
});
if (uriSampleMap != null && uriSampleMap.size() > 0) {
for (Map.Entry<Float, ArrayList<String>> entry : uriSampleMap.entrySet()) {
float percentage = entry.getKey();
for (String uri : entry.getValue()) {
UriSampleProperties uriSampleProperties = new UriSampleProperties();
uriSampleProperties.setUriPercentage(percentage);
uriSampleProperties.setUriRegex(uri);
uriSamples.add(uriSampleProperties);
}
}
}
samplerRemoteLocalProperties.setUriSamples(uriSamples);
}
if(!getPercentageSamplerHashCode(samplerRemoteLocalProperties).equals(getPercentageSamplerHashCode(samplerLocalProperties))){
log.warn("更新采样率 globalPercentage {} ,globalPercentageJsonStr {}", globalPercentage, uriSampleMapJsonStr);
percentageLocalSampler.initPercentage(samplerRemoteLocalProperties);
}
}
/**
* 计算计算hash值
*
* @param samplerLocalProperties
* @return
*/
public static String getPercentageSamplerHashCode(SamplerLocalProperties samplerLocalProperties) {
StringBuffer reconcileHashCode = new StringBuffer((samplerLocalProperties.getPercentage() + STATUS_DELIMITER));
for (UriSampleProperties uriSampleProperties : samplerLocalProperties.getUriSamples()) {
reconcileHashCode.append(uriSampleProperties.getUriRegex().hashCode() + STATUS_DELIMITER);
reconcileHashCode.append((uriSampleProperties.getUriPercentage() + STATUS_DELIMITER));
}
return reconcileHashCode.toString();
}
}
package com.pcloud.common.core.zipkin;
import java.util.ArrayList;
import java.util.List;
/**
* 本地采样器集合
*/
public class SamplerLocalProperties {
//采样器集合
private List<UriSampleProperties> uriSamples = new ArrayList<>(10);
//全局采样率
private float percentage = 0.1f;
public List<UriSampleProperties> getUriSamples() {
return uriSamples;
}
public void setUriSamples(List<UriSampleProperties> uriSamples) {
this.uriSamples = uriSamples;
}
public float getPercentage() {
return percentage;
}
public void setPercentage(float percentage) {
this.percentage = percentage;
}
}
package com.pcloud.common.core.zipkin;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
/**
* 本地取样器
*/
public class UriSampleProperties {
//url正则表达式表达式
private String uriRegex;
//采样率
private float uriPercentage = 0.01f;
public String getUriRegex() {
return uriRegex;
}
public void setUriRegex(String uriRegex) {
this.uriRegex = uriRegex;
}
public float getUriPercentage() {
return uriPercentage;
}
public void setUriPercentage(float uriPercentage) {
this.uriPercentage = uriPercentage;
}
}
package com.pcloud.common.core.zipkin;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.cloud.sleuth.Sampler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 重新配置自定义采样率
*/
@Configuration
@AutoConfigureBefore(RefreshSamplerLocalProperties.class)
public class ZipkinConfig {
//ZipkinAutoConfiguration使用@ConditionalOnMissingBean注解的,也就是容器中不存在这个Bean的时候,才初始化他自己默认的配置,可以重写他的配置
@Bean
public Sampler percentageLocalSampler(){
SamplerLocalProperties samplerLocalProperties = new SamplerLocalProperties();
return new PercentageLocalSampler(samplerLocalProperties);
}
}
......@@ -6,27 +6,22 @@
<parent>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common-parent</artifactId>
<version>2.1.0-RELEASE</version>
<version>3.1.0-SNAPSHOT</version>
</parent>
<artifactId>pcloud-common</artifactId>
<packaging>jar</packaging>
<version>${pcloud-common.version}</version>
<version>${reversion}</version>
<name>pcloud-common</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common-config</artifactId>
<version>${pcloud-common-config.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
......@@ -49,7 +44,7 @@
<!-- Spring Cloud Begin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
......@@ -57,23 +52,23 @@
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
......@@ -83,24 +78,14 @@
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<dependency>
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-spring-legacy</artifactId>
<version>1.0.0-rc.2</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-influx</artifactId>
<version>1.0.0-rc.2</version>
</dependency>
</dependency>-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
......@@ -119,6 +104,10 @@
<artifactId>cglib</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
......
......@@ -6,27 +6,21 @@
<parent>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common-parent</artifactId>
<version>2.1.0-RELEASE</version>
<version>3.1.0-SNAPSHOT</version>
</parent>
<artifactId>pcloud-solr</artifactId>
<packaging>jar</packaging>
<version>${pcloud-solr.version}</version>
<version>${reversion}</version>
<name>pcloud-solr</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.data.solr.version>2.1.7.RELEASE</spring.data.solr.version>
</properties>
<dependencies>
<dependency>
<groupId>com.pcloud.common</groupId>
<artifactId>pcloud-common-config</artifactId>
<version>${pcloud-common-config.version}</version>
</dependency>
<!-- solr add by gaop at 2018-4-23 11:33:47 -->
<dependency>
<groupId>org.springframework.data</groupId>
......@@ -49,22 +43,18 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.18</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<!-- Common Dependency End -->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment