You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2015/08/19 06:10:15 UTC
tajo git commit: TAJO-1757: Add examples for TajoClient v2.
Repository: tajo
Updated Branches:
refs/heads/master 57be230e9 -> b4098353d
TAJO-1757: Add examples for TajoClient v2.
Closes #689
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/b4098353
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/b4098353
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/b4098353
Branch: refs/heads/master
Commit: b4098353d142c84d5fa881b25b8334650212ffed
Parents: 57be230
Author: Hyunsik Choi <hy...@apache.org>
Authored: Wed Aug 19 13:03:01 2015 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Wed Aug 19 13:03:01 2015 +0900
----------------------------------------------------------------------
CHANGES | 2 +
pom.xml | 1 +
tajo-client-example/pom.xml | 217 +++++++++++++++++++
.../v2/example/TajoClientAsyncExample.java | 70 ++++++
.../client/v2/example/TajoClientExample.java | 65 ++++++
.../tajo/client/v2/LegacyClientDelegate.java | 4 +-
.../org/apache/tajo/client/v2/QueryFuture.java | 4 +-
.../org/apache/tajo/client/v2/TajoClient.java | 12 +-
.../apache/tajo/exception/ErrorMessages.java | 15 +-
.../apache/tajo/client/v2/TestTajoClientV2.java | 4 +-
tajo-dist/pom.xml | 1 +
tajo-project/pom.xml | 5 +
12 files changed, 390 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index f2d4f64..bbd3386 100644
--- a/CHANGES
+++ b/CHANGES
@@ -34,6 +34,8 @@ Release 0.11.0 - unreleased
IMPROVEMENT
+ TAJO-1757: Add examples for TajoClient v2. (hyunsik)
+
TAJO-1761: Separate an integration unit test kit into an independent
module. (hyunsik)
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 605160a..ceba124 100644
--- a/pom.xml
+++ b/pom.xml
@@ -87,6 +87,7 @@
<module>tajo-rpc</module>
<module>tajo-catalog</module>
<module>tajo-client</module>
+ <module>tajo-client-example</module>
<module>tajo-jdbc</module>
<module>tajo-storage</module>
<module>tajo-pullserver</module>
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-client-example/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-client-example/pom.xml b/tajo-client-example/pom.xml
new file mode 100644
index 0000000..e81311d
--- /dev/null
+++ b/tajo-client-example/pom.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you 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.
+ -->
+
+<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>
+ <artifactId>tajo-project</artifactId>
+ <groupId>org.apache.tajo</groupId>
+ <version>0.12.0-SNAPSHOT</version>
+ <relativePath>../tajo-project</relativePath>
+ </parent>
+ <artifactId>tajo-client-example</artifactId>
+ <packaging>jar</packaging>
+ <name>Tajo Client Example</name>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <metrics.version>3.0.1</metrics.version>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>repository.jboss.org</id>
+ <url>https://repository.jboss.org/nexus/content/repositories/releases/
+ </url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.rat</groupId>
+ <artifactId>apache-rat-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>verify</phase>
+ <goals>
+ <goal>check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <systemProperties>
+ <tajo.test>TRUE</tajo.test>
+ </systemProperties>
+ <argLine>-Xms512m -Xmx1024m -Dfile.encoding=UTF-8</argLine>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <configuration>
+ <includeScope>runtime</includeScope>
+ <outputDirectory>${project.build.directory}/lib</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>false</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-pmd-plugin</artifactId>
+ <version>2.7.1</version>
+ </plugin>
+ </plugins>
+ </build>
+
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tajo</groupId>
+ <artifactId>tajo-client</artifactId>
+ </dependency>
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>docs</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <!-- build javadoc jars per jar for publishing to maven -->
+ <id>module-javadocs</id>
+ <phase>package</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ <configuration>
+ <destDir>${project.build.directory}</destDir>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>dist</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <property>
+ <name>tar|rpm|deb</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>dist</id>
+ <phase>package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <target>
+ <echo file="${project.build.directory}/dist-layout-stitching.sh">
+ run() {
+ echo "\$ ${@}"
+ "${@}"
+ res=$?
+ if [ $res != 0 ]; then
+ echo
+ echo "Failed!"
+ echo
+ exit $res
+ fi
+ }
+
+ ROOT=`cd ${basedir}/..;pwd`
+ echo
+ echo "Current directory `pwd`"
+ echo
+ run rm -rf ${project.artifactId}-${project.version}
+ run mkdir ${project.artifactId}-${project.version}
+ run cd ${project.artifactId}-${project.version}
+ run cp -r ${basedir}/target/${project.artifactId}-${project.version}*.jar .
+ echo
+ echo "Tajo Client dist layout available at: ${project.build.directory}/${project.artifactId}-${project.version}"
+ echo
+ </echo>
+ <exec executable="sh" dir="${project.build.directory}" failonerror="true">
+ <arg line="./dist-layout-stitching.sh" />
+ </exec>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-project-info-reports-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </reporting>
+</project>
+
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientAsyncExample.java
----------------------------------------------------------------------
diff --git a/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientAsyncExample.java b/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientAsyncExample.java
new file mode 100644
index 0000000..e2acbc5
--- /dev/null
+++ b/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientAsyncExample.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.tajo.client.v2.example;
+
+import org.apache.tajo.client.ResultSetUtil;
+import org.apache.tajo.client.v2.QueryFuture;
+import org.apache.tajo.client.v2.TajoClient;
+import org.apache.tajo.client.v2.exception.ClientUnableToConnectException;
+import org.apache.tajo.exception.TajoException;
+
+import java.util.concurrent.ExecutionException;
+
+public class TajoClientAsyncExample {
+
+ public static void run(String hostname, int port, String sql) throws ClientUnableToConnectException {
+
+ try (TajoClient client = new TajoClient(hostname, port)) {
+
+ try (QueryFuture future = client.executeQueryAsync(sql)) {
+
+ while (!future.isDone()) { // isDone will be true if query state becomes success, failed, or killed.
+ System.out.println("progress: " + future.progress());
+ }
+
+ if (future.isSuccessful()) {
+ System.out.println(ResultSetUtil.prettyFormat(future.get()));
+ }
+
+ } catch (TajoException e) {
+ // executeQueryAsync() directly throws a TajoException instance if a query syntax is wrong.
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ // e.getCause() contains an TajoException caused by a running query.
+ System.err.println(e.getCause().getMessage());
+ } catch (Throwable t) {
+ System.err.println(t.getMessage());
+ }
+ }
+ }
+
+ public static void main(String[] args) throws ClientUnableToConnectException {
+ if (args.length < 3) {
+ System.err.println("usage: java -cp [classpath] TajoClientAsyncExample [hostname] [port] sql");
+ System.exit(-1);
+ }
+
+ StringBuilder sqlBuilder = new StringBuilder();
+ for (int i = 2; i < args.length; i++) {
+ sqlBuilder.append(args[i]).append(" ");
+ }
+
+ run(args[0], Integer.parseInt(args[1]), sqlBuilder.toString());
+ }
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientExample.java
----------------------------------------------------------------------
diff --git a/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientExample.java b/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientExample.java
new file mode 100644
index 0000000..8a5222e
--- /dev/null
+++ b/tajo-client-example/src/main/java/org/apache/tajo/client/v2/example/TajoClientExample.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.tajo.client.v2.example;
+
+import org.apache.tajo.client.ResultSetUtil;
+import org.apache.tajo.client.v2.TajoClient;
+import org.apache.tajo.client.v2.exception.ClientUnableToConnectException;
+import org.apache.tajo.exception.QueryFailedException;
+import org.apache.tajo.exception.QueryKilledException;
+import org.apache.tajo.exception.TajoException;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class TajoClientExample {
+
+ public static void run(String hostname, int port, String sql) throws ClientUnableToConnectException {
+
+ try (TajoClient client = new TajoClient(hostname, port)) {
+
+ try {
+ ResultSet result = client.executeQuery(sql);
+ System.out.println(ResultSetUtil.prettyFormat(result));
+
+ } catch (QueryFailedException e) {
+ System.err.println("query is failed.");
+ } catch (QueryKilledException e) {
+ System.err.println("query is killed.");
+ } catch (SQLException | TajoException e) {
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ public static void main(String[] args) throws ClientUnableToConnectException {
+ if (args.length < 3) {
+ System.err.println("usage: java -cp [classpath] TajoClientExample [hostname] [port] sql");
+ System.exit(-1);
+ }
+
+ StringBuilder sqlBuilder = new StringBuilder();
+ for (int i = 2; i < args.length; i++) {
+ sqlBuilder.append(args[i]).append(" ");
+ }
+
+ run(args[0], Integer.parseInt(args[1]), sqlBuilder.toString());
+ }
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-client/src/main/java/org/apache/tajo/client/v2/LegacyClientDelegate.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/v2/LegacyClientDelegate.java b/tajo-client/src/main/java/org/apache/tajo/client/v2/LegacyClientDelegate.java
index 697c1ac..12f8812 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/v2/LegacyClientDelegate.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/v2/LegacyClientDelegate.java
@@ -192,7 +192,7 @@ public class LegacyClientDelegate extends SessionConnection implements ClientDel
}
@Override
- public void release() {
+ public void close() {
queryClient.closeQuery(id);
}
@@ -332,7 +332,7 @@ public class LegacyClientDelegate extends SessionConnection implements ClientDel
}
@Override
- public void release() {
+ public void close() {
queryClient.closeQuery(queryId);
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-client/src/main/java/org/apache/tajo/client/v2/QueryFuture.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/v2/QueryFuture.java b/tajo-client/src/main/java/org/apache/tajo/client/v2/QueryFuture.java
index f1604cd..d916e6d 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/v2/QueryFuture.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/v2/QueryFuture.java
@@ -26,7 +26,7 @@ import java.util.concurrent.Future;
/**
*
*/
-public interface QueryFuture extends Future<ResultSet> {
+public interface QueryFuture extends Future<ResultSet>, AutoCloseable {
/**
* Get a query id
*
@@ -122,7 +122,7 @@ public interface QueryFuture extends Future<ResultSet> {
/**
* Release a query future. It will be automatically released after the session invalidation.
*/
- void release();
+ void close();
/**
* Add a listener which will be executed after this query is completed, error, failed or killed.
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-client/src/main/java/org/apache/tajo/client/v2/TajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/v2/TajoClient.java b/tajo-client/src/main/java/org/apache/tajo/client/v2/TajoClient.java
index f9401cb..2b4a150 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/v2/TajoClient.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/v2/TajoClient.java
@@ -18,6 +18,8 @@
package org.apache.tajo.client.v2;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.tajo.exception.QueryFailedException;
import org.apache.tajo.exception.UndefinedDatabaseException;
import org.apache.tajo.client.v2.exception.ClientUnableToConnectException;
@@ -29,6 +31,8 @@ import java.sql.ResultSet;
import java.util.Map;
public class TajoClient implements Closeable {
+ private static Log LOG = LogFactory.getLog(TajoClient.class);
+
/**
* default client port number
*/
@@ -130,8 +134,12 @@ public class TajoClient implements Closeable {
return delegate.executeSQLAsync(sql);
}
- public void close() throws IOException {
- delegate.close();
+ public void close() {
+ try {
+ delegate.close();
+ } catch (IOException e) {
+ LOG.warn(e);
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
index ad5776c..e617efa 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
@@ -21,7 +21,6 @@ package org.apache.tajo.exception;
import com.google.common.collect.Maps;
import org.apache.tajo.error.Errors.ResultCode;
import org.apache.tajo.util.Pair;
-import org.apache.tajo.util.StringUtils;
import java.util.Map;
@@ -135,6 +134,18 @@ public class ErrorMessages {
}
+ public static String concat(String[] args) {
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (String s : args) {
+ if (!first) {
+ sb.append(",");
+ }
+ sb.append(s);
+ }
+ return sb.toString();
+ }
+
public static String getMessage(ResultCode code, String...args) {
if (!MESSAGES.containsKey(code)) {
throw new TajoInternalError("no error message for " + code);
@@ -151,7 +162,7 @@ public class ErrorMessages {
}
} else {
- throw new TajoInternalError("Argument mismatch: code=" + code.name() + ", args=" + StringUtils.join(args));
+ throw new TajoInternalError("Argument mismatch: code=" + code.name() + ", args=" + concat(args));
}
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java b/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
index e1fca63..6ba4854 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/client/v2/TestTajoClientV2.java
@@ -219,7 +219,7 @@ public class TestTajoClientV2 extends QueryTestCaseBase {
} catch (ExecutionException e) {
throw e.getCause();
} finally {
- future.release();
+ future.close();
}
}
@@ -268,7 +268,7 @@ public class TestTajoClientV2 extends QueryTestCaseBase {
} catch (ExecutionException e) {
throw e.getCause();
} finally {
- future.release();
+ future.close();
}
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-dist/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-dist/pom.xml b/tajo-dist/pom.xml
index 8592cba..b9d2343 100644
--- a/tajo-dist/pom.xml
+++ b/tajo-dist/pom.xml
@@ -138,6 +138,7 @@
run cp -r $ROOT/tajo-algebra/target/tajo-algebra-${project.version}/* .
run cp -r $ROOT/tajo-plan/target/tajo-plan-${project.version}/* .
run cp -r $ROOT/tajo-client/target/tajo-client-${project.version}/* .
+ run cp -r $ROOT/tajo-client-example/target/tajo-client-example-${project.version}/* .
run cp -r $ROOT/tajo-cli/target/tajo-cli-${project.version}/* .
run cp -r $ROOT/tajo-catalog/target/tajo-catalog-${project.version}/* .
run cp -r $ROOT/tajo-storage/target/tajo-storage-${project.version}/* .
http://git-wip-us.apache.org/repos/asf/tajo/blob/b4098353/tajo-project/pom.xml
----------------------------------------------------------------------
diff --git a/tajo-project/pom.xml b/tajo-project/pom.xml
index 3303c2a..f486d7f 100644
--- a/tajo-project/pom.xml
+++ b/tajo-project/pom.xml
@@ -791,6 +791,11 @@
</dependency>
<dependency>
<groupId>org.apache.tajo</groupId>
+ <artifactId>tajo-client-example</artifactId>
+ <version>${tajo.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tajo</groupId>
<artifactId>tajo-cli</artifactId>
<version>${tajo.version}</version>
</dependency>