提交 e9f79b63 编写于 作者: Y youyong

Merge branch 'master' of ssh://192.168.8.22:58422/cat

......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-consumer</artifactId>
......@@ -22,7 +22,6 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.6</version>
<scope>test</scope>
</dependency>
</dependencies>
......
......@@ -18,6 +18,7 @@ import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.message.spi.MessageManager;
import com.dianping.cat.message.spi.MessageQueue;
import com.dianping.cat.message.spi.MessageStorage;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
......@@ -52,11 +53,12 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(TransactionReportAnalyzer.class).is(PER_LOOKUP) //
.req(MessageManager.class) //
.config(E("reportPath").value("target/report/transaction/")).req(MessageStorage.class, "html"));
.req(MessageStorage.class, "html") //
.config(E("reportPath").value("target/report/transaction/")));
all.add(C(TransactionAnalyzer.class).is(PER_LOOKUP) //
.req(MessageManager.class) //
.config(E("reportPath").value("target/report/transaction/")).req(MessageStorage.class, "html"));
.req(MessageManager.class, BucketManager.class) //
.req(MessageStorage.class, "html"));
all.add(C(IpAnalyzer.class).is(PER_LOOKUP));
......
package com.dianping.cat.consumer.transaction;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
......@@ -17,21 +14,18 @@ import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import com.dianping.cat.configuration.model.entity.Config;
import com.dianping.cat.configuration.model.entity.Property;
import com.dianping.cat.consumer.transaction.model.entity.Duration;
import com.dianping.cat.consumer.transaction.model.entity.Range;
import com.dianping.cat.consumer.transaction.model.entity.TransactionName;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.entity.TransactionType;
import com.dianping.cat.consumer.transaction.model.transform.DefaultJsonBuilder;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.dianping.cat.message.spi.AbstractMessageAnalyzer;
import com.dianping.cat.message.spi.MessageManager;
import com.dianping.cat.message.spi.MessageStorage;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageTree;
import com.site.helper.Files;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
/**
......@@ -40,21 +34,19 @@ import com.site.lookup.annotation.Inject;
*/
public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionReport> implements Initializable,
LogEnabled {
private static final SimpleDateFormat FILE_SDF = new SimpleDateFormat("yyyyMMddHHmm");
private static final long MINUTE = 60 * 1000;
@Inject
private MessageManager m_messageManager;
private BucketManager m_bucketManager;
@Inject
private MessageStorage m_messageStorage;
private MessagePathBuilder m_pathBuilder;
private Map<String, TransactionReport> m_reports = new HashMap<String, TransactionReport>();
private long m_extraTime;
private Bucket<MessageTree> m_messageBucket;
private String m_reportPath;
private long m_extraTime;
private Logger m_logger;
......@@ -119,25 +111,14 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
return m_reports;
}
private String getTransactionFileName(TransactionReport report) {
StringBuffer result = new StringBuffer();
String start = FILE_SDF.format(report.getStartTime());
String end = FILE_SDF.format(report.getEndTime());
result.append(report.getDomain()).append("-").append(start).append("-").append(end);
return result.toString();
}
@Override
public void initialize() throws InitializationException {
Config config = m_messageManager.getClientConfig();
String path = m_pathBuilder.getLogViewPath(new Date(m_startTime));
if (config != null) {
Property property = config.findProperty("transaction-base-dir");
if (property != null) {
m_reportPath = property.getValue();
}
try {
m_messageBucket = m_bucketManager.getMessageBucket(path);
} catch (Exception e) {
throw new InitializationException(String.format("Unable to create message bucket at %s.", path), e);
}
}
......@@ -169,7 +150,12 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
// the message is required by some transactions
if (count > 0) {
m_messageStorage.store(tree);
String messageId = tree.getMessageId();
String threadTag = "t:" + tree.getThreadId();
String sessionTag = "s:" + tree.getSessionToken();
String requestTag = "r:" + messageId;
m_messageBucket.storeById(messageId, tree, threadTag, sessionTag, requestTag);
}
}
}
......@@ -177,7 +163,7 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
int processTransaction(TransactionReport report, MessageTree tree, Transaction t) {
TransactionType type = report.findOrCreateType(t.getType());
TransactionName name = type.findOrCreateName(t.getName());
String url = m_messageStorage.getPath(tree);
String url = m_pathBuilder.getLogViewPath(tree.getMessageId());
int count = 0;
type.incTotalCount();
......@@ -265,31 +251,50 @@ public class TransactionAnalyzer extends AbstractMessageAnalyzer<TransactionRepo
m_duration = duration;
}
public void setMessageStorage(MessageStorage messageStorage) {
m_messageStorage = messageStorage;
}
public void setReportPath(String reportPath) {
m_reportPath = reportPath;
}
@Override
protected void store(List<TransactionReport> reports) {
if (reports == null || reports.size() == 0) {
return;
}
for (TransactionReport report : reports) {
String failureFileName = getTransactionFileName(report);
String htmlPath = new StringBuilder().append(m_reportPath).append(failureFileName).append(".html").toString();
File file = new File(htmlPath);
m_bucketManager.closeBucket(m_messageBucket);
storeReports(reports);
storeLogviews();
}
void storeLogviews() {
String path = m_pathBuilder.getLogViewPath(new Date(m_startTime));
Bucket<byte[]> bucket = null;
file.getParentFile().mkdirs();
try {
bucket = m_bucketManager.getBytesBucket(path);
try {
Files.forIO().writeTo(file, new DefaultJsonBuilder().buildJson(report));
} catch (IOException e) {
m_logger.error(String.format("Error when writing to file(%s)!", file), e);
m_pathBuilder.getLogViewBaseDir();
} catch (Exception e) {
m_logger.error(String.format("Error when storing transaction reports to %s!", path), e);
} finally {
if (bucket != null) {
m_bucketManager.closeBucket(bucket);
}
}
}
void storeReports(List<TransactionReport> reports) {
String path = m_pathBuilder.getReportPath(new Date(m_startTime));
Bucket<String> bucket = null;
try {
bucket = m_bucketManager.getStringBucket(path);
for (TransactionReport report : reports) {
bucket.storeById("transaction-" + report.getDomain(), report.toString());
}
} catch (Exception e) {
m_logger.error(String.format("Error when storing transaction reports to %s!", path), e);
} finally {
if (bucket != null) {
m_bucketManager.closeBucket(bucket);
}
}
}
......
......@@ -94,13 +94,13 @@
<role>com.dianping.cat.consumer.transaction.TransactionAnalyzer</role>
<implementation>com.dianping.cat.consumer.transaction.TransactionAnalyzer</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<configuration>
<reportPath>target/report/transaction/</reportPath>
</configuration>
<requirements>
<requirement>
<role>com.dianping.cat.message.spi.MessageManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageStorage</role>
<role-hint>html</role-hint>
......
......@@ -6,11 +6,10 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.dianping.cat.consumer.transaction.model.transform.DefaultJsonBuilder;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultJsonBuilder;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.DefaultTransaction;
import com.dianping.cat.message.spi.MessageStorage;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.message.spi.internal.DefaultMessageTree;
import com.site.helper.Files;
......@@ -20,11 +19,9 @@ import com.site.lookup.ComponentTestCase;
public class TransactionAnalyzerTest extends ComponentTestCase {
@Test
public void testProcessTransaction() throws Exception {
TransactionAnalyzer analyzer = new TransactionAnalyzer();
TransactionAnalyzer analyzer = lookup(TransactionAnalyzer.class);
TransactionReport report = new TransactionReport("Test");
analyzer.setMessageStorage(lookup(MessageStorage.class, "html"));
for (int i = 1; i <= 1000; i++) {
MessageTree tree = newMessageTree(i);
DefaultTransaction t = new DefaultTransaction("A", "n" + i % 2, null);
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-core</artifactId>
......@@ -33,7 +33,7 @@
<plugin>
<groupId>com.site.maven.plugins</groupId>
<artifactId>maven-codegen-plugin</artifactId>
<version>1.0.8</version>
<version>1.0.10</version>
<executions>
<execution>
<id>default-cli</id>
......
......@@ -36,10 +36,8 @@ import com.dianping.cat.message.spi.internal.DefaultMessageHandler;
import com.dianping.cat.message.spi.internal.DefaultMessagePathBuilder;
import com.dianping.cat.message.spi.internal.DefaultMessageStorage;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketFactory;
import com.dianping.cat.storage.BucketManager;
import com.dianping.cat.storage.internal.DefaultBucket;
import com.dianping.cat.storage.internal.DefaultBucketFactory;
import com.dianping.cat.storage.internal.DefaultBucketManager;
import com.dianping.cat.storage.internal.DefaultMessageBucket;
import com.site.lookup.configuration.AbstractResourceConfigurator;
......@@ -100,7 +98,6 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(Bucket.class, MessageTree.class.getName(), DefaultMessageBucket.class) //
.req(MessageCodec.class, "plain-text"));
all.add(C(BucketManager.class, DefaultBucketManager.class));
all.add(C(BucketFactory.class, DefaultBucketFactory.class));
return all;
}
......
......@@ -2,6 +2,7 @@ package com.dianping.cat.message.spi;
import java.io.File;
import java.net.URL;
import java.util.Date;
public interface MessagePathBuilder {
public String getHdfsPath(String messageId);
......@@ -11,4 +12,8 @@ public interface MessagePathBuilder {
public URL getLogViewBaseUrl();
public String getLogViewPath(String messageId);
public String getLogViewPath(Date timestamp);
public String getReportPath(Date timestamp);
}
......@@ -31,6 +31,11 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
private Logger m_logger;
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
@Override
public String getHdfsPath(String messageId) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/{1}/{0,date,mm}-{2}");
......@@ -79,6 +84,20 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
return messageId;
}
@Override
public String getReportPath(Date timestamp) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/report");
return format.format(new Object[] { timestamp });
}
@Override
public String getLogViewPath(Date timestamp) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{0,date,HH}/logview");
return format.format(new Object[] { timestamp });
}
@Override
public void initialize() throws InitializationException {
Config config = m_manager.getClientConfig();
......@@ -115,9 +134,4 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
public void setBaseLogUrl(URL baseLogUrl) {
m_baseLogUrl = baseLogUrl;
}
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
}
package com.dianping.cat.storage;
public interface BucketFactory<T> {
public Bucket<T> create(String path);
}
\ No newline at end of file
......@@ -5,6 +5,8 @@ import java.io.IOException;
import com.dianping.cat.message.spi.MessageTree;
public interface BucketManager {
public void closeBucket(Bucket<?> bucket);
public Bucket<MessageTree> getMessageBucket(String path) throws IOException;
public Bucket<String> getStringBucket(String path) throws IOException;
......
......@@ -6,7 +6,7 @@ import java.util.List;
* Map to one HDFS directory for one report.
* <p>
*
* Sample tags: "thread:101", "session:abc", "request:xyz", "parent:xxx"
* Sample tags: "thread:101", "session:abc", "request:xyz"
*/
public interface TagThreadSupport<T> {
public boolean storeById(String id, T data, String... tags);
......
......@@ -50,9 +50,9 @@ public abstract class AbstractFileBucket<T> implements Bucket<T>, TagThreadSuppo
m_writeLock.lock();
try {
m_writeFile.close();
m_idToOffsets.clear();
m_tagToIds.clear();
m_writeFile.close();
} catch (IOException e) {
// ignore it
} finally {
......
package com.dianping.cat.storage.internal;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketFactory;
public class DefaultBucketFactory<T> implements BucketFactory<T> {
@Override
public Bucket<T> create(String path) {
// TODO Auto-generated method stub
return null;
}
}
......@@ -103,4 +103,10 @@ public class DefaultBucketManager extends ContainerHolder implements BucketManag
return hashcode;
}
}
@Override
public void closeBucket(Bucket<?> bucket) {
bucket.close();
release(bucket);
}
}
......@@ -209,9 +209,5 @@
<role>com.dianping.cat.storage.BucketManager</role>
<implementation>com.dianping.cat.storage.internal.DefaultBucketManager</implementation>
</component>
<component>
<role>com.dianping.cat.storage.BucketFactory</role>
<implementation>com.dianping.cat.storage.internal.DefaultBucketFactory</implementation>
</component>
</components>
</plexus>
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-home</artifactId>
......@@ -80,7 +80,7 @@
<plugin>
<groupId>com.site.maven.plugins</groupId>
<artifactId>maven-codegen-plugin</artifactId>
<version>1.0.8</version>
<version>1.0.10</version>
<executions>
<execution>
<id>generate plexus component descriptor</id>
......
......@@ -4,12 +4,14 @@ import java.util.ArrayList;
import java.util.List;
import com.dianping.cat.message.spi.MessageConsumer;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.report.page.model.failure.CompositeFailureModelService;
import com.dianping.cat.report.page.model.failure.LocalFailureModelService;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.report.page.model.transaction.CompositeTransactionModelService;
import com.dianping.cat.report.page.model.transaction.HdfsTransactionModelService;
import com.dianping.cat.report.page.model.transaction.LocalTransactionModelService;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
......@@ -20,7 +22,8 @@ class ServiceComponentConfigurator extends AbstractResourceConfigurator {
all.add(C(ModelService.class, "transaction-local", LocalTransactionModelService.class) //
.req(MessageConsumer.class, "realtime"));
all.add(C(ModelService.class, "transaction-hdfs", HdfsTransactionModelService.class));
all.add(C(ModelService.class, "transaction-hdfs", HdfsTransactionModelService.class) //
.req(BucketManager.class, MessagePathBuilder.class));
all.add(C(ModelService.class, "transaction", CompositeTransactionModelService.class) //
.req(ModelService.class, new String[] { "transaction-local", "transaction-hdfs" }, "m_services"));
......
package com.dianping.cat.report.page.model.transaction;
import java.util.Date;
import com.dianping.cat.consumer.transaction.model.entity.TransactionReport;
import com.dianping.cat.consumer.transaction.model.transform.DefaultXmlParser;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.report.page.model.spi.ModelRequest;
import com.dianping.cat.report.page.model.spi.ModelResponse;
import com.dianping.cat.report.page.model.spi.ModelService;
import com.dianping.cat.storage.Bucket;
import com.dianping.cat.storage.BucketManager;
import com.site.lookup.annotation.Inject;
public class HdfsTransactionModelService implements ModelService<TransactionReport> {
@Inject
private BucketManager m_bucketManager;
@Inject
private MessagePathBuilder m_pathBuilder;
@Override
public boolean isEligable(ModelRequest request) {
return request.getPeriod().isHistorical();
public ModelResponse<TransactionReport> invoke(ModelRequest request) {
String domain = request.getDomain();
long date = Long.parseLong(request.getProperty("date"));
String path = m_pathBuilder.getReportPath(new Date(date));
ModelResponse<TransactionReport> response = new ModelResponse<TransactionReport>();
Bucket<String> bucket = null;
try {
bucket = m_bucketManager.getStringBucket(path);
String xml = bucket.findById("transaction-" + domain);
if (xml == null) {
TransactionReport report = new DefaultXmlParser().parse(xml);
response.setModel(report);
}
} catch (Exception e) {
response.setException(e);
} finally {
if (bucket != null) {
m_bucketManager.closeBucket(bucket);
}
}
return response;
}
@Override
public ModelResponse<TransactionReport> invoke(ModelRequest request) {
// TODO
return null;
public boolean isEligable(ModelRequest request) {
return request.getPeriod().isHistorical();
}
}
......@@ -51,7 +51,6 @@ public class Handler implements PageHandler<Context>, Initializable {
String name = payload.getName();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("domain", domain) //
.setProperty("date", date) //
.setProperty("type", payload.getType())//
.setProperty("name", payload.getName());
......@@ -76,7 +75,6 @@ public class Handler implements PageHandler<Context>, Initializable {
String domain = payload.getDomain();
String date = String.valueOf(payload.getDate());
ModelRequest request = new ModelRequest(domain, payload.getPeriod()) //
.setProperty("domain", domain) //
.setProperty("date", date) //
.setProperty("type", payload.getType());
......
......@@ -95,6 +95,14 @@
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
<role-hint>transaction-hdfs</role-hint>
<implementation>com.dianping.cat.report.page.model.transaction.HdfsTransactionModelService</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.storage.BucketManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessagePathBuilder</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.report.page.model.spi.ModelService</role>
......
function showGraphs(anchor, id, date, domain, type, name) {
var isCtrl = false;
function showGraphs(anchor, id, date, domain, type, name, isCurrent) {
if (isCtrl) return true;
var cell = document.getElementById(id);
var text = anchor.innerHTML;
......@@ -6,11 +10,11 @@ function showGraphs(anchor, id, date, domain, type, name) {
anchor.innerHTML = '[:: hide ::]';
if (cell.nodeName == 'IMG') { // <img src='...'/>
cell.src = "?op=graphs&date="+date+"&domain="+domain+"&type="+type+"&name="+name;
cell.src = "?op=graphs&date="+date+"&domain="+domain+"&type="+type+"&name="+name+(isCurrent?"&t="+new Date().getTime():"");
} else { // <div>...</div>
$.ajax({
type: "get",
url: "?op=graphs&date="+date+"&domain="+domain+"&type="+type+"&name="+name,
url: "?op=graphs&date="+date+"&domain="+domain+"&type="+type+"&name="+name+(isCurrent?"&t="+new Date().getTime():""),
success : function(data, textStatus) {
cell.innerHTML = data;
}
......@@ -27,3 +31,9 @@ function showGraphs(anchor, id, date, domain, type, name) {
return false;
}
$(document).keydown(function(e) {
if(e.ctrlKey || e.metaKey) isCtrl = true;
}).keyup(function(e) {
isCtrl = false;
});
\ No newline at end of file
......@@ -28,7 +28,7 @@
<td><a href="?date=${model.date}&type=${e.id}">${e.id}</a></td>
<td>${e.totalCount}</td>
<td>${e.failCount}</td>
<td>${e.failPercent}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
<td><a href="${model.logViewBaseUri}/${empty e.failMessageUrl ? e.successMessageUrl : e.failMessageUrl}">Log View</a></td>
<td>${w:format(e.min,'0')}/${w:format(e.max,'0')}/${w:format(e.avg,'0.0')}/${w:format(e.std,'0.0')}</td>
</tr>
......@@ -38,10 +38,10 @@
<c:forEach var="name" items="${report.types[payload.type].names}" varStatus="status">
<c:set var="e" value="${name.value}"/>
<tr class="${status.index mod 2 != 0 ? 'odd' : 'even'}">
<td><a href="?op=graphs&date=${model.date}&domain=${report.domain}&type=${payload.type}&name=${e.id}" onclick="return showGraphs(this,${status.index},${model.date},'${report.domain}','${payload.type}','${e.id}');">[:: show ::]</a> ${e.id}</td>
<td><a href="?op=graphs&date=${model.date}&domain=${report.domain}&type=${payload.type}&name=${e.id}" onclick="return showGraphs(this,${status.index},${model.date},'${report.domain}','${payload.type}','${e.id}',${payload.period.current});">[:: show ::]</a> ${e.id}</td>
<td>${e.totalCount}</td>
<td>${e.failCount}</td>
<td>${e.failPercent}</td>
<td>${w:format(e.failPercent,'0.00')}</td>
<td><a href="${model.logViewBaseUri}/${empty e.failMessageUrl ? e.successMessageUrl : e.failMessageUrl}">Log View</a></td>
<td>${w:format(e.min,'0')}/${w:format(e.max,'0')}/${w:format(e.avg,'0.0')}/${w:format(e.std,'0.0')}</td>
</tr>
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cat-job</artifactId>
......@@ -45,7 +45,7 @@
<plugin>
<groupId>com.site.maven.plugins</groupId>
<artifactId>maven-codegen-plugin</artifactId>
<version>1.0.7</version>
<version>1.0.10</version>
<executions>
<execution>
<id>generate plexus component descriptor</id>
......
......@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.dianping.cat</groupId>
<artifactId>parent</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
<name>Tracking</name>
<packaging>pom</packaging>
<modules>
......@@ -18,17 +18,17 @@
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-core</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-consumer</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-job</artifactId>
<version>0.2.0</version>
<version>0.2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.site.common</groupId>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册