You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by ja...@apache.org on 2015/09/14 07:29:00 UTC

[13/15] drill git commit: DRILL-3589: Update JDBC driver to shade and minimize dependencies.

DRILL-3589: Update JDBC driver to shade and minimize dependencies.

Update build process to use shading, stop using Proguard.
Add simple integration test that verifies that the JDBC driver works
correctly with a clean classpath.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/4e3b7dc0
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/4e3b7dc0
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/4e3b7dc0

Branch: refs/heads/master
Commit: 4e3b7dc0333a01e72d0ea9256331ea1e1dd51181
Parents: e5f529b
Author: Jacques Nadeau <ja...@apache.org>
Authored: Sun Aug 16 11:46:26 2015 -0700
Committer: Jacques Nadeau <ja...@apache.org>
Committed: Sun Sep 13 21:58:34 2015 -0700

----------------------------------------------------------------------
 .../apache/drill/common/util/PathScanner.java   |  49 ++-
 distribution/pom.xml                            |   5 +
 .../drill/exec/compile/QueryClassLoader.java    |   2 +-
 .../drill/exec/server/BootStrapContext.java     |  10 +-
 .../java/org/apache/drill/BaseTestQuery.java    |   2 +-
 exec/jdbc-all/pom.xml                           | 411 +++++++++++--------
 .../apache/drill/jdbc/DrillbitClassLoader.java  | 106 +++++
 .../org/apache/drill/jdbc/ITTestShadedJar.java  | 189 +++++++++
 exec/jdbc-all/src/test/resources/logback.xml    |  54 +++
 .../main/java/org/apache/drill/jdbc/Driver.java |  14 +-
 10 files changed, 620 insertions(+), 222 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/common/src/main/java/org/apache/drill/common/util/PathScanner.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/drill/common/util/PathScanner.java b/common/src/main/java/org/apache/drill/common/util/PathScanner.java
index 16537b6..a44bdf2 100644
--- a/common/src/main/java/org/apache/drill/common/util/PathScanner.java
+++ b/common/src/main/java/org/apache/drill/common/util/PathScanner.java
@@ -35,7 +35,6 @@ import org.reflections.Reflections;
 import org.reflections.scanners.ResourcesScanner;
 import org.reflections.scanners.SubTypesScanner;
 import org.reflections.scanners.TypeAnnotationsScanner;
-import org.reflections.util.ClasspathHelper;
 import org.reflections.util.ConfigurationBuilder;
 
 import com.google.common.base.Stopwatch;
@@ -143,33 +142,31 @@ public class PathScanner {
                  resourcePathname);
     final Set<URL> resultUrlSet = Sets.newHashSet();
 
-    final ClassLoader[] netLoaders = ClasspathHelper.classLoaders(classLoaders);
-    for (ClassLoader classLoader : netLoaders) {
-      try {
-        final Enumeration<URL> resourceUrls =
-            classLoader.getResources(resourcePathname);
-        while (resourceUrls.hasMoreElements()) {
-          final URL resourceUrl = resourceUrls.nextElement();
-          logger.trace( "- found a(n) {} at {}.", resourcePathname, resourceUrl );
-
-          int index = resourceUrl.toExternalForm().lastIndexOf(resourcePathname);
-          if (index != -1 && returnRootPathname) {
-            final URL classpathRootUrl =
-                new URL(resourceUrl.toExternalForm().substring(0, index));
-            resultUrlSet.add(classpathRootUrl);
-            logger.debug( "- collected resource's classpath root URL {}.",
-                          classpathRootUrl );
-          } else {
-            resultUrlSet.add(resourceUrl);
-            logger.debug( "- collected resource URL {}.", resourceUrl );
-          }
-        }
-      } catch (IOException e) {
-        if (Reflections.log != null) {
-          Reflections.log.error(
-              "Error scanning for resources named " + resourcePathname, e);
+    final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+    try {
+      final Enumeration<URL> resourceUrls =
+          classLoader.getResources(resourcePathname);
+      while (resourceUrls.hasMoreElements()) {
+        final URL resourceUrl = resourceUrls.nextElement();
+        logger.trace("- found a(n) {} at {}.", resourcePathname, resourceUrl);
+
+        int index = resourceUrl.toExternalForm().lastIndexOf(resourcePathname);
+        if (index != -1 && returnRootPathname) {
+          final URL classpathRootUrl =
+              new URL(resourceUrl.toExternalForm().substring(0, index));
+          resultUrlSet.add(classpathRootUrl);
+          logger.debug("- collected resource's classpath root URL {}.",
+              classpathRootUrl);
+        } else {
+          resultUrlSet.add(resourceUrl);
+          logger.debug("- collected resource URL {}.", resourceUrl);
         }
       }
+    } catch (IOException e) {
+      if (Reflections.log != null) {
+        Reflections.log.error(
+            "Error scanning for resources named " + resourcePathname, e);
+      }
     }
 
     return resultUrlSet;

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/distribution/pom.xml
----------------------------------------------------------------------
diff --git a/distribution/pom.xml b/distribution/pom.xml
index c08efc7..f4a17ac 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -158,6 +158,11 @@
           </exclusions>
         </dependency>
         <dependency>
+          <groupId>org.apache.drill.contrib</groupId>
+          <artifactId>drill-jdbc-storage</artifactId>
+          <version>${project.version}</version>
+        </dependency>
+        <dependency>
           <groupId>org.apache.drill.contrib.storage-hive</groupId>
           <artifactId>drill-storage-hive-core</artifactId>
           <version>${project.version}</version>

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/java-exec/src/main/java/org/apache/drill/exec/compile/QueryClassLoader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/QueryClassLoader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/QueryClassLoader.java
index c4eaae8..3df8f84 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/compile/QueryClassLoader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/compile/QueryClassLoader.java
@@ -74,7 +74,7 @@ public class QueryClassLoader extends URLClassLoader {
   private ConcurrentMap<String, byte[]> customClasses = new MapMaker().concurrencyLevel(4).makeMap();
 
   public QueryClassLoader(DrillConfig config, OptionManager sessionOptions) {
-    super(new URL[0]);
+    super(new URL[0], Thread.currentThread().getContextClassLoader());
     compilerSelector = new ClassCompilerSelector(config, sessionOptions);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
index 120c0d0..4530dba 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/server/BootStrapContext.java
@@ -30,9 +30,9 @@ import org.apache.drill.exec.rpc.TransportCheck;
 
 import com.codahale.metrics.MetricRegistry;
 
-// TODO:  Doc.  What kind of context?  (For what aspects, RPC?  What kind of data?)
+
 public class BootStrapContext implements Closeable {
-  //private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(BootStrapContext.class);
+  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(BootStrapContext.class);
 
   private final DrillConfig config;
   private final EventLoopGroup loop;
@@ -70,7 +70,11 @@ public class BootStrapContext implements Closeable {
 
   @Override
   public void close() {
-    DrillMetrics.resetMetrics();
+    try {
+      DrillMetrics.resetMetrics();
+    } catch (Error | Exception e) {
+      logger.warn("failure resetting metrics.", e);
+    }
     loop.shutdownGracefully();
     allocator.close();
   }

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java b/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
index 1381949..cb137ee 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/BaseTestQuery.java
@@ -300,7 +300,7 @@ public class BaseTestQuery extends ExecTest {
     QueryTestUtil.testWithListener(client, type, query, resultListener);
   }
 
-  protected static void testNoResult(String query, Object... args) throws Exception {
+  public static void testNoResult(String query, Object... args) throws Exception {
     testNoResult(1, query, args);
   }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/jdbc-all/pom.xml
----------------------------------------------------------------------
diff --git a/exec/jdbc-all/pom.xml b/exec/jdbc-all/pom.xml
index ed49cfb..5ef6e07 100644
--- a/exec/jdbc-all/pom.xml
+++ b/exec/jdbc-all/pom.xml
@@ -28,99 +28,29 @@
   <name>JDBC JAR with all dependencies</name>
 
   <dependencies>
-  
-    <!-- start parent dependencies -->
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-handler</artifactId>
-      <version>4.0.27.Final</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>14.0.1</version>
-      <scope>provided</scope>
-    </dependency>
 
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>${dep.slf4j.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jul-to-slf4j</artifactId>
-      <version>${dep.slf4j.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jcl-over-slf4j</artifactId>
-      <version>${dep.slf4j.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>log4j-over-slf4j</artifactId>
-      <version>${dep.slf4j.version}</version>
-      <scope>provided</scope>
     </dependency>
 
     <dependency>
-      <groupId>com.googlecode.jmockit</groupId>
-      <artifactId>jmockit</artifactId>
-      <version>1.3</version>
-      <scope>provided</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>${dep.junit.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <version>1.9.5</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
-      <version>1.0.13</version>
-      <scope>provided</scope>
-    </dependency>
-    
-    <dependency>
-      <groupId>de.huxhorn.lilith</groupId>
-      <artifactId>de.huxhorn.lilith.logback.appender.multiplex-classic</artifactId>
-      <version>0.9.44</version>
-      <scope>provided</scope>
-    </dependency>
-        
-    <!-- end parent dependencies -->
-            
-    <dependency>
-      <groupId>net.hydromatic</groupId>
-      <artifactId>optiq-avatica</artifactId>
-      <version>0.9-drill-r20</version>
-      <scope>provided</scope>
+      <groupId>org.apache.drill</groupId>
+      <artifactId>drill-common</artifactId>
+      <version>${project.version}</version>
+      <exclusions>
+        <exclusion>
+          <artifactId>javassist</artifactId>
+          <groupId>javassist</groupId>
+        </exclusion>
+      </exclusions>
     </dependency>
 
     <dependency>
       <groupId>org.apache.drill.exec</groupId>
       <artifactId>drill-java-exec</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
       <exclusions>
         <exclusion>
           <groupId>log4j</groupId>
@@ -208,7 +138,6 @@
       <groupId>org.apache.drill</groupId>
       <artifactId>drill-common</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
       <exclusions>
         <exclusion>
           <artifactId>javassist</artifactId>
@@ -220,7 +149,6 @@
       <groupId>org.apache.drill.exec</groupId>
       <artifactId>drill-jdbc</artifactId>
       <version>${project.version}</version>
-      <scope>provided</scope>
       <exclusions>
         <exclusion>
           <artifactId>drill-storage-hive-core</artifactId>
@@ -237,148 +165,267 @@
       <groupId>org.codehaus.janino</groupId>
       <artifactId>janino</artifactId>
       <version>2.6.1</version>
-      <scope>provided</scope>
+      <scope>test</scope>
     </dependency>
     <!-- Specify xalan and xerces versions to avoid setXIncludeAware error. -->
     <dependency>
       <groupId>xerces</groupId>
       <artifactId>xercesImpl</artifactId>
-      <scope>provided</scope>
       <exclusions>
-        <exclusion>
-          <groupId>xml-apis</groupId>
-          <artifactId>xml-apis</artifactId>
-        </exclusion>
+        <!-- <exclusion> -->
+        <!-- <groupId>xml-apis</groupId> -->
+        <!-- <artifactId>xml-apis</artifactId> -->
+        <!-- </exclusion> -->
       </exclusions>
     </dependency>
     <dependency>
       <groupId>xalan</groupId>
       <artifactId>xalan</artifactId>
-      <scope>provided</scope>
       <exclusions>
-        <exclusion>
-          <groupId>xml-apis</groupId>
-          <artifactId>xml-apis</artifactId>
-        </exclusion>
+        <!-- <exclusion> -->
+        <!-- <groupId>xml-apis</groupId> -->
+        <!-- <artifactId>xml-apis</artifactId> -->
+        <!-- </exclusion> -->
       </exclusions>
     </dependency>
+
+
+    <!-- Test Dependencies -->
     <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
-      <version>1.0.13</version>
+      <groupId>org.apache.drill</groupId>
+      <artifactId>drill-common</artifactId>
+      <classifier>tests</classifier>
+      <version>${project.version}</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-core</artifactId>
-      <version>1.0.13</version>
+      <groupId>org.apache.drill.exec</groupId>
+      <artifactId>drill-java-exec</artifactId>
+      <classifier>tests</classifier>
+      <version>${project.version}</version>
       <scope>provided</scope>
     </dependency>
+
   </dependencies>
 
   <build>
     <plugins>
+     
+      <plugin>
+        <artifactId>maven-antrun-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>define-classpath</id>
+            <phase>integration-test</phase>
+            <goals>
+              <goal>run</goal>
+            </goals>
+            <configuration>
+              <exportAntProperties>true</exportAntProperties>
+              <target>
+                <property name="app.class.path" refid="maven.test.classpath" />
+              </target>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
 
       <plugin>
-        <groupId>com.github.wvengen</groupId>
-        <artifactId>proguard-maven-plugin</artifactId>
-        <version>2.0.7</version>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <version>2.18.1</version>
         <executions>
           <execution>
-            <phase>package</phase>
             <goals>
-              <goal>proguard</goal>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
             </goals>
           </execution>
         </executions>
-        <dependencies>
-          <dependency>
-            <groupId>net.sf.proguard</groupId>
-            <artifactId>proguard-base</artifactId>
-            <version>5.0</version>
-            <scope>runtime</scope>
-          </dependency>
-        </dependencies>
+
         <configuration>
-          <proguardVersion>5.0</proguardVersion>
-          <obfuscate>false</obfuscate>
-          <includeDependencyInjar>true</includeDependencyInjar>
-          <outjar>${project.build.finalName}-dirty.jar</outjar>
-          <outputDirectory>${project.build.directory}</outputDirectory>
-          <maxMemory>6g</maxMemory>
-          <options>
-            <option>-dontobfuscate</option>
-            <option>-dontoptimize</option>
-            <option>-ignorewarnings</option>
-            <option>-keep class org.apache.drill.exec.proto.** { *; }</option>
-            <option>-keep class org.apache.drill.common.types.** { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.Driver { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.DrillConnection { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.DrillStatement { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.DrillResultSet { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.impl.DrillJdbc40Factory { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.impl.DrillJdbc41Factory { *; }</option>
-            <option>-keep class org.apache.drill.jdbc.proxy.TracingProxyDriver { *; }</option>
-            <option>-keep class org.apache.drill.common.config.CommonConstants { *; }</option>
-            <option>-keep class org.apache.drill.common.config.ConfigProvider { *; }</option>
-            <option>-keep class org.apache.drill.common.config.DrillConfig { *; }</option>
-            <option>-keep class org.apache.drill.common.config.NestedConfig { *; }</option>
+          <argLine>-Xms512m -Xmx3g -Ddrill.exec.http.enabled=false -Djava.net.preferIPv4Stack=true
+            -Ddrill.exec.sys.store.provider.local.write=false
+            -Dorg.apache.drill.exec.server.Drillbit.system_options="org.apache.drill.exec.compile.ClassTransformer.scalar_replacement=on"
+            -XX:MaxPermSize=256M -XX:MaxDirectMemorySize=3072M
+            -XX:+CMSClassUnloadingEnabled -ea</argLine>
+          <additionalClasspathElements>
+            <additionalClasspathElements>${settings.localRepository}/junit/junit/4.11/junit-4.11.jar</additionalClasspathElements>
+            <additionalClasspathElements>${settings.localRepository}/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar</additionalClasspathElements>
+            <additionalClasspathElements>${project.build.directory}/test-classes/</additionalClasspathElements>
+          </additionalClasspathElements>
+          <classpathDependencyExcludes>
+            <classpathDependencyExcludes>*:*</classpathDependencyExcludes>
+          </classpathDependencyExcludes>
 
-            <option>-keep class ch.qos.logback.** { *; }</option>
-            <option>-keep class org.slf4j.** { *; }</option>
-            <option>-keep class * implements com.fasterxml.jackson.databind.cfg.ConfigFeature { *; }</option>
-            <option>-keep class * implements com.fasterxml.jackson.databind.jsontype.TypeIdResolver { *; }</option>
-            <!-- do not mess with enums, Java doesn't like it -->
-            <option>-keep enum ** { *; }</option>
-          </options>
-          <exclusions>
-            <exclusion>
-              <groupId>org.slf4j</groupId>
-              <artifactId>jcl-over-slf4j</artifactId>
-            </exclusion>
-            <exclusion>
-              <groupId>net.hydromatic</groupId>
-              <artifactId>eigenbase-properties</artifactId>
-            </exclusion>
-          </exclusions>
-          <libs>
-            <lib>${java.home}/lib/rt.jar</lib>
-            <lib>${java.home}/lib/jsse.jar</lib>
-          </libs>
+          <systemPropertyVariables>
+            <java.io.tmpdir>${project.build.directory}</java.io.tmpdir>
+            <app.class.path>${app.class.path}</app.class.path>
+            <project.version>${project.version}</project.version>
+          </systemPropertyVariables>
         </configuration>
       </plugin>
 
       <plugin>
-        <artifactId>maven-antrun-plugin</artifactId>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>2.4.1</version>
         <executions>
           <execution>
             <phase>package</phase>
-            <configuration>
-              <target>
-                <delete dir="${project.build.directory}/dirty"/>
-                <mkdir dir="${project.build.directory}/dirty"/>
-                <unzip src="${project.build.directory}/${project.build.finalName}-dirty.jar" dest="${project.build.directory}/dirty">
-                  <patternset>
-                    <exclude name="**/*.java"/>
-                    <exclude name="org.codehaus.commons.compiler.properties"/> <!-- This leads jad-ui to not parse classes under 'org/' -->
-                    <exclude name="**/*.SF"/>
-                    <exclude name="**/*.RSA"/>
-                    <exclude name="**/*.DSA"/>
-                    <exclude name="META-INF/services/*"/>
-                    <exclude name="META-INF/*.SF"/>
-                    <exclude name="META-INF/*.RSA"/>
-                    <exclude name="META-INF/*.DSA"/>
-                  </patternset>
-                </unzip>
-                <jar destfile="${project.build.directory}/${project.build.finalName}.jar" basedir="${project.build.directory}/dirty"/>
-                <delete dir="${project.build.directory}/dirty"/>
-              </target>
-            </configuration>
             <goals>
-              <goal>run</goal>
+              <goal>shade</goal>
             </goals>
           </execution>
         </executions>
+        <configuration>
+          <shadedArtifactAttached>false</shadedArtifactAttached>
+          <createDependencyReducedPom>true</createDependencyReducedPom>
+          <dependencyReducedPomLocation>${project.build.directory}/dependency-reduced-pom.xml</dependencyReducedPomLocation>
+          <minimizeJar>false</minimizeJar>
+          
+          <artifactSet>
+            <includes>
+              <include>*:*</include>
+            </includes>
+            <excludes>
+              <exclude>org.slf4j:jcl-over-slf4j</exclude>
+              <exclude>com.dyuproject.protostuff:*</exclude>
+              <exclude>org.apache.calcite:*</exclude>
+              <exclude>org.pentaho:*</exclude>
+              <exclude>org.msgpack:*</exclude>
+              <exclude>com.googlecode.json-simple:*</exclude>
+              <exclude>dom4j:*</exclude>
+              <exclude>org.hibernate:*</exclude>
+              <exclude>javax.validation:*</exclude>
+              <exclude>antlr:*</exclude>
+              <exclude>org.ow2.asm:*</exclude>
+              <exclude>com.univocity:*</exclude>
+              <exclude>net.sf.jpam:*</exclude>
+              <exclude>com.twitter:*</exclude>
+              <exclude>javax.inject:*</exclude>
+              <exclude>com.beust:*</exclude>
+              <exclude>org.codehaus.jackson:*</exclude>
+              <exclude>jline:*</exclude>
+              <exclude>io.netty:netty:jar:3.7.0.Final</exclude>
+              <exclude>org.xerial.snappy:*</exclude>
+              <exclude>org.apache.avro:*</exclude>
+              <exclude>org.tukaani:*</exclude>
+              <exclude>org.apache.velocity:*</exclude>
+              <exclude>net.hydromatic:linq4j</exclude>
+              <exclude>org.codehaus.janino:*</exclude>
+              <exclude>org.mortbay.jetty:*</exclude>
+              <exclude>org.slf4j:jul-to-slf4j</exclude>
+              <exclude>org.slf4j:log4j-over-slf4j</exclude>
+              <exclude>org.hamcrest:hamcrest-core</exclude>
+              <exclude>org.mockito:mockito-core</exclude>
+              <exclude>org.objenesis:objenesis</exclude>
+            </excludes>
+          </artifactSet>
+          <relocations>
+            <!-- Relocate Drill classes to minimize classloader hell. -->
+            <relocation><pattern>org.apache.drill.exec.</pattern><shadedPattern>oadd.org.apache.drill.exec.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.drill.common.</pattern><shadedPattern>oadd.org.apache.drill.common.</shadedPattern></relocation>
+            
+            <!-- Move dependencies out of path -->
+            <relocation><pattern>antlr.</pattern><shadedPattern>oadd.antlr.</shadedPattern></relocation>
+            <relocation><pattern>antlr.</pattern><shadedPattern>oadd.antlr.</shadedPattern></relocation>
+            <relocation><pattern>io.</pattern><shadedPattern>oadd.io.</shadedPattern></relocation>
+            <relocation><pattern>javacc.</pattern><shadedPattern>oadd.javacc.</shadedPattern></relocation>
+            <relocation><pattern>java_cup.</pattern><shadedPattern>oadd.java_cup.</shadedPattern></relocation>
+            <relocation><pattern>javassist.</pattern><shadedPattern>oadd.javassist.</shadedPattern></relocation>
+            <relocation><pattern>jline.</pattern><shadedPattern>oadd.jline.</shadedPattern></relocation>
+            <relocation><pattern>license.</pattern><shadedPattern>oadd.license.</shadedPattern></relocation>
+            <relocation><pattern>net.</pattern><shadedPattern>oadd.net.</shadedPattern></relocation>
+            <relocation><pattern>parquet.</pattern><shadedPattern>oadd.parquet.</shadedPattern></relocation>
+            <relocation><pattern>test.</pattern><shadedPattern>oadd.test.</shadedPattern></relocation>
+            <relocation><pattern>trax.</pattern><shadedPattern>oadd.trax.</shadedPattern></relocation>
+            <relocation><pattern>org.antlr.</pattern><shadedPattern>oadd.org.antlr.</shadedPattern></relocation>
+            <relocation><pattern>org.codehaus.</pattern><shadedPattern>oadd.org.codehaus.</shadedPattern></relocation>
+            <relocation><pattern>org.eigenbase.</pattern><shadedPattern>oadd.org.eigenbase.</shadedPattern></relocation>
+            <relocation><pattern>org.hamcrest.</pattern><shadedPattern>oadd.org.hamcrest.</shadedPattern></relocation>
+            <relocation><pattern>org.jboss.</pattern><shadedPattern>oadd.org.jboss.</shadedPattern></relocation>
+            <relocation><pattern>org.joda.</pattern><shadedPattern>oadd.org.joda.</shadedPattern></relocation>
+            <relocation><pattern>org.json.</pattern><shadedPattern>oadd.org.json.</shadedPattern></relocation>
+            <relocation><pattern>org.mockito.</pattern><shadedPattern>oadd.org.mockito.</shadedPattern></relocation>
+            <relocation><pattern>org.msgpack.</pattern><shadedPattern>oadd.org.msgpack.</shadedPattern></relocation>
+            <relocation><pattern>org.objectweb.</pattern><shadedPattern>oadd.org.objectweb.</shadedPattern></relocation>
+            <relocation><pattern>org.objensis.</pattern><shadedPattern>oadd.org.objensis.</shadedPattern></relocation>
+            <relocation><pattern>org.pentaho.</pattern><shadedPattern>oadd.org.pentaho.</shadedPattern></relocation>
+            <relocation><pattern>org.reflections.</pattern><shadedPattern>oadd.org.reflections.</shadedPattern></relocation>
+            <relocation><pattern>org.tukaani.</pattern><shadedPattern>oadd.org.tukaani.</shadedPattern></relocation>
+            <relocation><pattern>org.xerial.</pattern><shadedPattern>oadd.org.xerial.</shadedPattern></relocation>
+            <relocation><pattern>com.beust.</pattern><shadedPattern>oadd.com.beust.</shadedPattern></relocation>
+            <relocation><pattern>com.carrotsearch.</pattern><shadedPattern>oadd.com.carrotsearch.</shadedPattern></relocation>
+            <relocation><pattern>com.codahale.</pattern><shadedPattern>oadd.com.codahale.</shadedPattern></relocation>
+            <relocation><pattern>com.dyuproject.</pattern><shadedPattern>oadd.com.dyuproject.</shadedPattern></relocation>
+            <relocation><pattern>com.fasterxml.</pattern><shadedPattern>oadd.com.fasterxml.</shadedPattern></relocation>
+            <relocation><pattern>com.google.</pattern><shadedPattern>oadd.com.google.</shadedPattern></relocation>
+            <relocation><pattern>com.thoughtworks.</pattern><shadedPattern>oadd.com.thoughtworks.</shadedPattern></relocation>
+            <relocation><pattern>com.typesafe.</pattern><shadedPattern>oadd.com.typesafe.</shadedPattern></relocation>
+            <relocation><pattern>com.univocity.</pattern><shadedPattern>oadd.com.univocity.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.avro.</pattern><shadedPattern>oadd.org.apache.avro.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.bcel.</pattern><shadedPattern>oadd.org.apache.bcel.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.calcite.</pattern><shadedPattern>oadd.org.apache.calcite.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.commons.</pattern><shadedPattern>oadd.org.apache.commons.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.curator.</pattern><shadedPattern>oadd.org.apache.curator.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.html.</pattern><shadedPattern>oadd.org.apache.html.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.jute.</pattern><shadedPattern>oadd.org.apache.jute.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.log4j.</pattern><shadedPattern>oadd.org.apache.log4j.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.regexp.</pattern><shadedPattern>oadd.org.apache.regexp.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.velocity.</pattern><shadedPattern>oadd.org.apache.velocity.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.wml.</pattern><shadedPattern>oadd.org.apache.wml.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.xalan.</pattern><shadedPattern>oadd.org.apache.xalan.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.xerces.</pattern><shadedPattern>oadd.org.apache.xerces.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.xml.</pattern><shadedPattern>oadd.org.apache.xml.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.xmlcommons.</pattern><shadedPattern>oadd.org.apache.xmlcommons.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.xpath.</pattern><shadedPattern>oadd.org.apache.xpath.</shadedPattern></relocation>
+            <relocation><pattern>org.apache.zookeeper.</pattern><shadedPattern>oadd.org.apache.zookeeper.</shadedPattern></relocation>
+          </relocations>
+          <transformers>
+            <transformer
+              implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+              <resource>drill-module.conf</resource>
+            </transformer>
+          </transformers>
+         <filters>
+           <filter>
+             <artifact>*:*</artifact>
+             <excludes>
+                <exclude>**/logback.xml</exclude>
+                <exclude>**/LICENSE.txt</exclude>
+                <exclude>**/*.java</exclude>
+                <exclude>**/META-INF/**</exclude>
+                <exclude>**/org.codehaus.commons.compiler.properties</exclude>
+                <exclude>**/*.SF</exclude>
+                <exclude>**/*.RSA</exclude>
+                <exclude>**/*.DSA</exclude>
+                <exclude>javax/**</exclude>
+                <exclude>rest/**</exclude>
+                <exclude>*.tokens</exclude>
+                <exclude>com/google/common/math</exclude>
+                <exclude>com/google/common/net</exclude>
+                <exclude>com/google/common/primitives</exclude>
+                <exclude>com/google/common/reflect</exclude>
+                <exclude>com/google/common/util</exclude>
+                <exclude>com/google/common/cache</exclude>
+                <exclude>com/google/common/collect/Tree*</exclude>
+                <exclude>com/google/common/collect/Standard*</exclude>
+                <exclude>org/apache/drill/exec/expr/annotations/**</exclude>
+                <exclude>org/apache/drill/exec/expr/fn/**</exclude>
+                <exclude>org/apache/drill/exec/proto/beans/**</exclude>
+                <exclude>org/apache/drill/exec/compile/**</exclude>
+                <exclude>org/apache/drill/exec/planner/**</exclude>
+                <exclude>org/apache/drill/exec/physical/**</exclude>
+                <exclude>org/apache/drill/exec/store/**</exclude>
+                <exclude>org/apache/drill/exec/server/rest/**</exclude>
+                <exclude>org/apache/drill/exec/rpc/data/**</exclude>
+                <exclude>org/apache/drill/exec/rpc/control/**</exclude>
+                <exclude>org/apache/drill/exec/work/**</exclude>
+              </excludes>
+           </filter>
+         </filters>
+        </configuration>
       </plugin>
 
     </plugins>
@@ -400,11 +447,13 @@
   </pluginRepositories>
 
   <profiles>
-    <!-- mondrian data includes 10s of MBs of JSON file
-        if you want to include them run maven with -Pwith-mondrian-data -->
+    <!-- mondrian data includes 10s of MBs of JSON file if you want to include 
+      them run maven with -Pwith-mondrian-data -->
     <profile>
       <id>with-mondrian-data</id>
-      <activation><activeByDefault>false</activeByDefault></activation>
+      <activation>
+        <activeByDefault>false</activeByDefault>
+      </activation>
       <dependencies>
         <dependency>
           <groupId>net.hydromatic</groupId>

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/DrillbitClassLoader.java
----------------------------------------------------------------------
diff --git a/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/DrillbitClassLoader.java b/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/DrillbitClassLoader.java
new file mode 100644
index 0000000..0ff3a99
--- /dev/null
+++ b/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/DrillbitClassLoader.java
@@ -0,0 +1,106 @@
+/**
+ * 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.drill.jdbc;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DrillbitClassLoader extends URLClassLoader {
+
+  public DrillbitClassLoader() {
+    super(URLS);
+  }
+
+  private static final URL[] URLS;
+
+  static {
+    ArrayList<URL> urlList = new ArrayList<URL>();
+    final String classPath = System.getProperty("app.class.path");
+    final String[] st = fracture(classPath, File.pathSeparator);
+    final int l = st.length;
+    for (int i = 0; i < l; i++) {
+      try {
+        if (st[i].length() == 0) {
+          st[i] = ".";
+        }
+        urlList.add(new File(st[i]).toURI().toURL());
+      } catch (MalformedURLException e) {
+        assert false : e.toString();
+      }
+    }
+    urlList.toArray(new URL[urlList.size()]);
+
+    List<URL> urls = new ArrayList<>();
+    for (URL url : urlList) {
+      urls.add(url);
+    }
+    URLS = urls.toArray(new URL[urls.size()]);
+  }
+
+  /**
+   * Helper method to avoid StringTokenizer using.
+   *
+   * Taken from Apache Harmony
+   */
+  private static String[] fracture(String str, String sep) {
+    if (str.length() == 0) {
+      return new String[0];
+    }
+    ArrayList<String> res = new ArrayList<String>();
+    int in = 0;
+    int curPos = 0;
+    int i = str.indexOf(sep);
+    int len = sep.length();
+    while (i != -1) {
+      String s = str.substring(curPos, i);
+      res.add(s);
+      in++;
+      curPos = i + len;
+      i = str.indexOf(sep, curPos);
+    }
+
+    len = str.length();
+    if (curPos <= len) {
+      String s = str.substring(curPos, len);
+      in++;
+      res.add(s);
+    }
+
+    return res.toArray(new String[in]);
+  }
+
+  @Override
+  protected Class<?> findClass(String name) throws ClassNotFoundException {
+    return super.findClass(name);
+  }
+
+  @Override
+  public Class<?> loadClass(String name) throws ClassNotFoundException {
+    return super.loadClass(name);
+  }
+
+  @Override
+  protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+    return super.loadClass(name, resolve);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/ITTestShadedJar.java
----------------------------------------------------------------------
diff --git a/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/ITTestShadedJar.java b/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/ITTestShadedJar.java
new file mode 100644
index 0000000..97a0984
--- /dev/null
+++ b/exec/jdbc-all/src/test/java/org/apache/drill/jdbc/ITTestShadedJar.java
@@ -0,0 +1,189 @@
+/**
+ * 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.drill.jdbc;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.Vector;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ITTestShadedJar {
+
+  private static DrillbitClassLoader drillbitLoader;
+  private static URLClassLoader rootClassLoader;
+
+  private static URL getJdbcUrl() throws MalformedURLException {
+    return new URL(
+        String.format("%s../../target/drill-jdbc-all-%s.jar",
+            ClassLoader.getSystemClassLoader().getResource("").toString(),
+            System.getProperty("project.version")
+            ));
+
+  }
+
+  @Test
+  public void executeJdbcAllQuery() throws Exception {
+
+    // print class path for debugging
+    System.out.println("java.class.path:");
+    System.out.println(System.getProperty("java.class.path"));
+
+    final URLClassLoader loader = (URLClassLoader) ClassLoader.getSystemClassLoader();
+    Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
+    method.setAccessible(true);
+    method.invoke(loader, getJdbcUrl());
+
+    Class<?> clazz = loader.loadClass("org.apache.drill.jdbc.Driver");
+    try {
+      Driver driver = (Driver) clazz.newInstance();
+      try (Connection c = driver.connect("jdbc:drill:drillbit=localhost:31010", null);
+          Statement s = c.createStatement();
+          ResultSet result = s.executeQuery("select * from (VALUES 1)");) {
+        while (result.next()) {
+          System.out.println(result.getObject(1));
+        }
+      }
+    } catch (Exception ex) {
+      throw ex;
+    }
+
+  }
+
+
+
+  @BeforeClass
+  public static void setupDefaultTestCluster() throws Exception {
+    drillbitLoader = new DrillbitClassLoader();
+    rootClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
+    try {
+    runWithLoader("DrillbitStartThread", drillbitLoader);
+    } catch (Exception e) {
+      printClassesLoaded("root", rootClassLoader);
+      throw e;
+    }
+  }
+
+  @AfterClass
+  public static void closeClient() throws Exception {
+    runWithLoader("DrillbitStopThread", drillbitLoader);
+  }
+
+  private static int getClassesLoadedCount(ClassLoader classLoader) {
+    try {
+      Field f = ClassLoader.class.getDeclaredField("classes");
+      f.setAccessible(true);
+      Vector<Class> classes = (Vector<Class>) f.get(classLoader);
+      return classes.size();
+    } catch (Exception e) {
+      System.out.println("Failure while loading class count.");
+      return -1;
+    }
+  }
+
+  private static void printClassesLoaded(String prefix, ClassLoader classLoader) {
+    try {
+      Field f = ClassLoader.class.getDeclaredField("classes");
+      f.setAccessible(true);
+      Vector<Class> classes = (Vector<Class>) f.get(classLoader);
+      for (Class<?> c : classes) {
+        System.out.println(prefix + ": " + c.getName());
+      }
+    } catch (Exception e) {
+      System.out.println("Failure while printing loaded classes.");
+    }
+  }
+
+  private static void runWithLoader(String name, ClassLoader loader) throws Exception {
+    Class<?> clazz = loader.loadClass(ITTestShadedJar.class.getName() + "$" + name);
+    Object o = clazz.getDeclaredConstructors()[0].newInstance(loader);
+    clazz.getMethod("go").invoke(o);
+  }
+
+  public abstract static class AbstractLoaderThread extends Thread {
+    private Exception ex;
+    protected final ClassLoader loader;
+
+    public AbstractLoaderThread(ClassLoader loader) {
+      this.setContextClassLoader(loader);
+      this.loader = loader;
+    }
+
+    @Override
+    public final void run() {
+      try {
+        internalRun();
+      } catch (Exception e) {
+        this.ex = e;
+      }
+    }
+
+    protected abstract void internalRun() throws Exception;
+
+    public void go() throws Exception {
+      start();
+      join();
+      if (ex != null) {
+        throw ex;
+      }
+    }
+  }
+
+  public static class DrillbitStartThread extends AbstractLoaderThread {
+
+    public DrillbitStartThread(ClassLoader loader) {
+      super(loader);
+    }
+
+    @Override
+    protected void internalRun() throws Exception {
+      Class<?> clazz = loader.loadClass("org.apache.drill.BaseTestQuery");
+      clazz.getMethod("setupDefaultTestCluster").invoke(null);
+
+      // loader.loadClass("org.apache.drill.exec.exception.SchemaChangeException");
+
+      // execute a single query to make sure the drillbit is fully up
+      clazz.getMethod("testNoResult", String.class, new Object[] {}.getClass())
+          .invoke(null, "select * from (VALUES 1)", new Object[] {});
+
+    }
+
+  }
+
+  public static class DrillbitStopThread extends AbstractLoaderThread {
+
+    public DrillbitStopThread(ClassLoader loader) {
+      super(loader);
+    }
+
+    @Override
+    protected void internalRun() throws Exception {
+      Class<?> clazz = loader.loadClass("org.apache.drill.BaseTestQuery");
+      clazz.getMethod("setupDefaultTestCluster").invoke(null);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/jdbc-all/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/exec/jdbc-all/src/test/resources/logback.xml b/exec/jdbc-all/src/test/resources/logback.xml
new file mode 100644
index 0000000..54ccb42
--- /dev/null
+++ b/exec/jdbc-all/src/test/resources/logback.xml
@@ -0,0 +1,54 @@
+<?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.
+-->
+<configuration>
+  <appender name="SOCKET"
+    class="de.huxhorn.lilith.logback.appender.ClassicMultiplexSocketAppender">
+    <Compressing>true</Compressing>
+    <ReconnectionDelay>10000</ReconnectionDelay>
+    <IncludeCallerData>true</IncludeCallerData>
+    <RemoteHosts>${LILITH_HOSTNAME:-localhost}</RemoteHosts>
+  </appender>
+
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+      </pattern>
+    </encoder>
+  </appender>
+
+  <logger name="org.apache.drill" additivity="false">
+    <level value="debug" />
+    <appender-ref ref="SOCKET" />
+  </logger>
+
+  <logger name="query.logger" additivity="false">
+    <level value="info" />
+    <appender-ref ref="SOCKET" />
+  </logger>
+
+<!--   <logger name="io.netty" additivity="false"> -->
+<!--     <level value="debug" /> -->
+<!--     <appender-ref ref="SOCKET" /> -->
+<!--   </logger> -->
+
+  <root>
+    <level value="error" />
+    <appender-ref ref="STDOUT" />
+  </root>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/drill/blob/4e3b7dc0/exec/jdbc/src/main/java/org/apache/drill/jdbc/Driver.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/Driver.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/Driver.java
index 1ef84c4..0d0300e 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/Driver.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/Driver.java
@@ -26,15 +26,12 @@ import java.util.Properties;
 
 import org.apache.drill.jdbc.impl.DriverImpl;
 
-import org.slf4j.Logger;
-import static org.slf4j.LoggerFactory.getLogger;
-
 
 /**
  * Main class of Apache Drill JDBC driver.
  */
 public class Driver implements java.sql.Driver {
-  private static final Logger logger = getLogger( Driver.class );
+  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Driver.class);
 
   /** Delegate for everything except registration with DriverManager. */
   private final DriverImpl impl;
@@ -46,13 +43,10 @@ public class Driver implements java.sql.Driver {
 
   static {
     // Upon loading of class, register an instance with DriverManager.
-
     try {
-      DriverManager.registerDriver( new Driver() );
-    }
-    catch ( SQLException e ) {
-      logger.error( "Error in registering Drill JDBC driver {}: {}",
-                    Driver.class, e, e );
+      DriverManager.registerDriver(new Driver());
+    } catch (Error | SQLException e) {
+      logger.warn("Error in registering Drill JDBC driver {}: {}", Driver.class, e, e);
     }
   }