自定义客户端构件

Avatica的两个构件

截至到Apache Calcite Avatica 1.9.0版本,提供了两个(JAR)构件,使得客户端可以通过JDBC访问Avatica服务器。

<dependencies>
  <!-- 带有阴影的构件 -->
  <dependency>
    <groupId>org.apache.calcite.avatica</groupId>
    <artifactId>avatica</artifactId>
  </dependency>
  <!-- 不带阴影的构件 -->
  <dependency>
    <groupId>org.apache.calcite.avatica</groupId>
    <artifactId>avatica-core</artifactId>
  </dependency>
</dependencies>

按照以往版本的惯例,org.apache.calcite.avatica:avatica是一个JAR,其中包含Avatica客户端代码库的所有必要依赖项。那些可以安全重定位的类已经这样做了,以减少可能发生的类路径问题。

Avatica 1.9.0将引入一个新的构件org.apache.calcite.avatica:avatica-core,这只包含Avatica客户端类而没有任何捆绑的依赖项。

该构件使用户能够使用不同版本的JAR构建类路径,而不是Avatica目前依赖的版本。

这是一种“你的体验可能会有所不同”或“取消保修”的决定(因为您正在使用我们未经测试的依赖项的Avatica);但是,一些下游项目确实提供了对版本之间兼容性的合理保证。

构建自己的Avatica客户端构件

在某些情况下,提供特定版本的Avatica依赖项可能会很有益。以下是一个简要的pom.xml,概述了如何完成这项工作。

<?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>
  <groupId>myorg.custom.client</groupId>
  <artifactId>my-special-app-client</artifactId>
  <packaging>jar</packaging>
  <name>Special Application Client Artifact</name>
  <description>为我的组织特定应用构建的自定义构件,使用Apache Calcite Avatica</description>

  <properties>
    <myorg.prefix>myorg.custom.client</myorg.prefix>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.calcite.avatica</groupId>
      <artifactId>avatica-core</artifactId>
      <version>1.9.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <!-- 重写来自avatica-core的版本(4.5.2),以解决httpclient中的假设性错误 -->
      <version>4.5.3</version>
    </dependency>
    <!-- 包含Guava用于“特殊应用程序” -->
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>17.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <!-- 重定位Jackson、Protobuf、Apache Commons HttpClient和HttpComponents,但不包括Guava。
                   假设的“特殊应用程序”会期望在标准位置找到Guava -->
              <relocations>
                <relocation>
                  <pattern>com.fasterxml.jackson</pattern>
                  <shadedPattern>${myorg.prefix}.com.fasterxml.jackson</shadedPattern>
                </relocation>
                <relocation>
                  <pattern>com.google.protobuf</pattern>
                  <shadedPattern>${myorg.prefix}.com.google.protobuf</shadedPattern>
                </relocation>
                <relocation>
                  <pattern>org.apache.http</pattern>
                  <shadedPattern>${myorg.prefix}.org.apache.http</shadedPattern>
                </relocation>
                <relocation>
                  <pattern>org.apache.commons</pattern>
                  <shadedPattern>${myorg.prefix}.org.apache.commons</shadedPattern>
                </relocation>
              </relocations>
              <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

注意: 以上提供的pom.xml是一个示例,您可能需要根据您的项目需求进行调整。

参考资料

https://calcite.apache.org/avatica/docs/custom_client_artifacts.html