You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by st...@apache.org on 2020/11/24 07:14:46 UTC

[phoenix-tephra] branch release/0.16.0 created (now 708a937)

This is an automated email from the ASF dual-hosted git repository.

stoty pushed a change to branch release/0.16.0
in repository https://gitbox.apache.org/repos/asf/phoenix-tephra.git.


      at 708a937  TEPHRA-315 tephra-example maven setup is broken

This branch includes the following new commits:

     new 708a937  TEPHRA-315 tephra-example maven setup is broken

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[phoenix-tephra] 01/01: TEPHRA-315 tephra-example maven setup is broken

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

stoty pushed a commit to branch release/0.16.0
in repository https://gitbox.apache.org/repos/asf/phoenix-tephra.git

commit 708a937a1165d9a7805de0ba3e5d8d5ba51703cd
Author: Istvan Toth <st...@apache.org>
AuthorDate: Mon Nov 16 09:50:26 2020 +0100

    TEPHRA-315 tephra-example maven setup is broken
    
    fix examples maven structure
    update some maven plugin versions
---
 pom.xml                                            |  70 +----
 tephra-core-shaded/pom.xml                         |  41 +--
 tephra-core/pom.xml                                |   1 -
 .../tephra-examples-post-1.3/hbase-1.3/pom.xml     |   1 -
 .../tephra-examples-post-1.3/hbase-1.4/pom.xml     |   8 +-
 .../org/apache/tephra/examples/BalanceBooks.java   | 341 ---------------------
 .../org/apache/tephra/examples/package-info.java   |  40 ---
 .../apache/tephra/examples/BalanceBooksTest.java   | 137 ---------
 .../tephra-examples-post-1.3/hbase-1.5/pom.xml     |   8 +-
 .../tephra-examples-post-1.3/hbase-1.6/pom.xml     |   8 +-
 .../tephra-examples-post-1.3/hbase-2.0/pom.xml     |  29 +-
 .../org/apache/tephra/examples/BalanceBooks.java   | 341 ---------------------
 .../org/apache/tephra/examples/package-info.java   |  40 ---
 .../apache/tephra/examples/BalanceBooksTest.java   | 137 ---------
 .../tephra-examples-post-1.3/hbase-2.1/pom.xml     |  29 +-
 .../tephra-examples-post-1.3/hbase-2.2/pom.xml     |  29 +-
 .../tephra-examples-post-1.3/hbase-2.3/pom.xml     |  29 +-
 tephra-examples/tephra-examples-post-1.3/pom.xml   |   1 -
 tephra-examples/tephra-examples-pre-1.3/pom.xml    |   1 -
 tephra-hbase-compat-1.1-base/pom.xml               |   1 -
 tephra-hbase-compat-1.4-base/pom.xml               |   1 -
 tephra-hbase-compat-2.0-base/pom.xml               |   1 -
 22 files changed, 99 insertions(+), 1195 deletions(-)

diff --git a/pom.xml b/pom.xml
index 0acd1bd..f923fe6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -407,7 +407,6 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.1</version>
           <configuration>
             <source>1.7</source>
             <target>1.7</target>
@@ -418,7 +417,6 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.14.1</version>
           <configuration>
             <argLine>-Xmx4096m -Djava.awt.headless=true -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true</argLine>
             <redirectTestOutputToFile>${surefire.redirectTestOutputToFile}</redirectTestOutputToFile>
@@ -441,11 +439,16 @@
           </configuration>
         </plugin>
 
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>build-helper-maven-plugin</artifactId>
+          <version>3.2.0</version>
+        </plugin>
+
         <!-- License check -->
         <plugin>
           <groupId>org.apache.rat</groupId>
           <artifactId>apache-rat-plugin</artifactId>
-          <version>0.10</version>
           <executions>
             <execution>
               <id>rat-check</id>
@@ -516,7 +519,6 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-release-plugin</artifactId>
-          <version>2.5</version>
           <configuration>
             <tagNameFormat>v@{project.version}</tagNameFormat>
             <allowTimestampedSnapshots>true</allowTimestampedSnapshots>
@@ -538,22 +540,18 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.14.1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.rat</groupId>
         <artifactId>apache-rat-plugin</artifactId>
-        <version>0.10</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>2.12.1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -652,62 +650,6 @@
         </plugins>
       </build>
     </profile>
-
-    <!-- Profile to generate apache release -->
-    <profile>
-      <id>apache-release</id>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-assembly-plugin</artifactId>
-            <configuration>
-              <finalName>apache-tephra-${project.version}</finalName>
-              <formats>
-                <format>tar.gz</format>
-              </formats>
-            </configuration>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-remote-resources-plugin</artifactId>
-            <configuration>
-              <!-- Disable this plugin so that it won't generate a DEPENDENCIES file in the source tar -->
-              <skip>true</skip>
-            </configuration>
-          </plugin>
-
-          <!-- Compute checksum of release artifact -->
-          <plugin>
-            <inherited>false</inherited>
-            <groupId>net.ju-n.maven.plugins</groupId>
-            <artifactId>checksum-maven-plugin</artifactId>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>files</goal>
-                </goals>
-              </execution>
-            </executions>
-            <configuration>
-              <algorithms>
-                <algorithm>MD5</algorithm>
-                <algorithm>SHA-512</algorithm>
-              </algorithms>
-              <fileSets>
-                <fileSet>
-                  <directory>${project.build.directory}</directory>
-                  <includes>
-                    <include>apache-tephra-${project.version}-${sourceReleaseAssemblyDescriptor}.tar.gz</include>
-                  </includes>
-                </fileSet>
-              </fileSets>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-
   </profiles>
 
 </project>
diff --git a/tephra-core-shaded/pom.xml b/tephra-core-shaded/pom.xml
index 3e63b24..33a1ae6 100644
--- a/tephra-core-shaded/pom.xml
+++ b/tephra-core-shaded/pom.xml
@@ -45,6 +45,21 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
         <configuration>
+          <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+            <dependencyReducedPomLocation>${basedir}/target/dependency-reduced-pom.xml</dependencyReducedPomLocation>
+            <createSourcesJar>true</createSourcesJar>
+            <artifactSet>
+              <includes>
+                <include>org.apache.tephra:tephra-core</include>
+                <include>org.apache.twill:twill-api</include>
+                <include>org.apache.twill:twill-common</include>
+                <include>org.apache.twill:twill-core</include>
+                <include>org.apache.twill:twill-discovery-api</include>
+                <include>org.apache.twill:twill-discovery-core</include>
+                <include>org.apache.twill:twill-zookeeper</include>
+                <include>com.google.guava:guava</include>
+              </includes>
+            </artifactSet>
           <filters>
             <filter>
               <artifact>*:*</artifact>
@@ -74,32 +89,6 @@
             </transformer>
           </transformers>
         </configuration>
-        <executions>
-          <execution>
-            <id>default-shaded</id>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
-              <dependencyReducedPomLocation>${basedir}/target/dependency-reduced-pom.xml</dependencyReducedPomLocation>
-              <createSourcesJar>true</createSourcesJar>
-              <artifactSet>
-                <includes>
-                  <include>org.apache.tephra:tephra-core</include>
-                  <include>org.apache.twill:twill-api</include>
-                  <include>org.apache.twill:twill-common</include>
-                  <include>org.apache.twill:twill-core</include>
-                  <include>org.apache.twill:twill-discovery-api</include>
-                  <include>org.apache.twill:twill-discovery-core</include>
-                  <include>org.apache.twill:twill-zookeeper</include>
-                  <include>com.google.guava:guava</include>
-                </includes>
-              </artifactSet>
-            </configuration>
-          </execution>
-        </executions>
       </plugin>
     </plugins>
   </build>
diff --git a/tephra-core/pom.xml b/tephra-core/pom.xml
index c6f9443..f419364 100644
--- a/tephra-core/pom.xml
+++ b/tephra-core/pom.xml
@@ -128,7 +128,6 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
-        <version>2.4</version>
         <executions>
           <execution>
             <id>test-jar</id>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml
index f6cc10d..637d392 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml
@@ -31,7 +31,6 @@
   <properties>
     <hadoop.version>2.5.1</hadoop.version>
     <hbase13.version>1.3.1</hbase13.version>
-    <hbase.scrdir>src-1.3</hbase.scrdir>
   </properties>
 
   <build>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml
index 3e343b1..058bcc8 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml
@@ -34,8 +34,12 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/BalanceBooks.java b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/BalanceBooks.java
deleted file mode 100644
index b970598..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/BalanceBooks.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * 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.tephra.examples;
-
-import com.google.common.io.Closeables;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.tephra.TransactionConflictException;
-import org.apache.tephra.TransactionContext;
-import org.apache.tephra.TransactionFailureException;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.distributed.TransactionServiceClient;
-import org.apache.tephra.hbase.TransactionAwareHTable;
-import org.apache.tephra.hbase.coprocessor.TransactionProcessor;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.ConfigurationFactory;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Simple example application that launches a number of concurrent clients, one per "account".  Each client attempts to
- * make withdrawals from other clients, and deposit the same amount to its own account in a single transaction.
- * Since this means the client will be updating both its own row and the withdrawee's row, this will naturally lead to
- * transaction conflicts.  All clients will run for a specified number of iterations.  When the processing is complete,
- * the total sum of all rows should be zero, if transactional integrity was maintained.
- *
- * <p>
- *   You can run the BalanceBooks application with the following command:
- *   <pre>
- *     ./bin/tephra run org.apache.tephra.examples.BalanceBooks [num clients] [num iterations]
- *   </pre>
- *   where <code>[num clients]</code> is the number of concurrent client threads to use, and
- *   <code>[num iterations]</code> is the number of "transfer" operations to perform per client thread.
- * </p>
- */
-public class BalanceBooks implements Closeable {
-  private static final Logger LOG = LoggerFactory.getLogger(BalanceBooks.class);
-
-  private static final int MAX_AMOUNT = 100;
-  private static final byte[] TABLE = Bytes.toBytes("testbalances");
-  private static final byte[] FAMILY = Bytes.toBytes("f");
-  private static final byte[] COL = Bytes.toBytes("b");
-
-  private final int totalClients;
-  private final int iterations;
-
-  private Configuration conf;
-  private ZKClientService zkClient;
-  private TransactionServiceClient txClient;
-  private Connection conn;
-
-  public BalanceBooks(int totalClients, int iterations) {
-    this(totalClients, iterations, new ConfigurationFactory().get());
-  }
-
-  public BalanceBooks(int totalClients, int iterations, Configuration conf) {
-    this.totalClients = totalClients;
-    this.iterations = iterations;
-    this.conf = conf;
-  }
-
-  /**
-   * Sets up common resources required by all clients.
-   */
-  public void init() throws IOException {
-    Injector injector = Guice.createInjector(
-        new ConfigModule(conf),
-        new ZKModule(),
-        new DiscoveryModules().getDistributedModules(),
-        new TransactionModules().getDistributedModules(),
-        new TransactionClientModule()
-    );
-
-    zkClient = injector.getInstance(ZKClientService.class);
-    zkClient.startAndWait();
-    txClient = injector.getInstance(TransactionServiceClient.class);
-    conn = ConnectionFactory.createConnection(conf);
-    createTableIfNotExists(conf, TABLE, new byte[][]{ FAMILY });
-  }
-
-  /**
-   * Runs all clients and waits for them to complete.
-   */
-  public void run() throws IOException, InterruptedException {
-    List<Client> clients = new ArrayList<>(totalClients);
-    for (int i = 0; i < totalClients; i++) {
-      Client c = new Client(i, totalClients, iterations);
-      c.init(txClient, conn.getTable(TableName.valueOf(TABLE)));
-      c.start();
-      clients.add(c);
-    }
-
-    for (Client c : clients) {
-      c.join();
-      Closeables.closeQuietly(c);
-    }
-  }
-
-  /**
-   * Validates the current state of the data stored at the end of the test.  Each update by a client consists of two
-   * parts: a withdrawal of a random amount from a randomly select other account, and a corresponding to deposit to
-   * the client's own account.  So, if all the updates were performed consistently (no partial updates or partial
-   * rollbacks), then the total sum of all balances at the end should be 0.
-   */
-  public boolean verify() {
-    boolean success = false;
-    try {
-      TransactionAwareHTable table = new TransactionAwareHTable(conn.getTable(TableName.valueOf(TABLE)));
-      TransactionContext context = new TransactionContext(txClient, table);
-
-      LOG.info("VERIFYING BALANCES");
-      context.start();
-      long totalBalance = 0;
-
-      try (ResultScanner scanner = table.getScanner(new Scan())) {
-        for (Result r : scanner) {
-          if (!r.isEmpty()) {
-            int rowId = Bytes.toInt(r.getRow());
-            long balance = Bytes.toLong(r.getValue(FAMILY, COL));
-            totalBalance += balance;
-            LOG.info("Client #{}: balance = ${}", rowId, balance);
-          }
-        }
-      }
-      if (totalBalance == 0) {
-        LOG.info("PASSED!");
-        success = true;
-      } else {
-        LOG.info("FAILED! Total balance should be 0 but was {}", totalBalance);
-      }
-      context.finish();
-    } catch (Exception e) {
-      LOG.error("Failed verification check", e);
-    }
-    return success;
-  }
-
-  /**
-   * Frees up the underlying resources common to all clients.
-   */
-  public void close() {
-    try {
-      if (conn != null) {
-        conn.close();
-      }
-    } catch (IOException ignored) { }
-
-    if (zkClient != null) {
-      zkClient.stopAndWait();
-    }
-  }
-
-  protected void createTableIfNotExists(Configuration conf, byte[] tableName, byte[][] columnFamilies)
-      throws IOException {
-    try (Admin admin = this.conn.getAdmin()) {
-      HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
-      for (byte[] family : columnFamilies) {
-        HColumnDescriptor columnDesc = new HColumnDescriptor(family);
-        columnDesc.setMaxVersions(Integer.MAX_VALUE);
-        desc.addFamily(columnDesc);
-      }
-      desc.addCoprocessor(TransactionProcessor.class.getName());
-      admin.createTable(desc);
-    }
-  }
-
-  public static void main(String[] args) {
-    if (args.length != 2) {
-      System.err.println("Usage: java " + BalanceBooks.class.getName() + " <num clients> <iterations>");
-      System.err.println("\twhere <num clients> >= 2");
-      System.exit(1);
-    }
-
-    try (BalanceBooks bb = new BalanceBooks(Integer.parseInt(args[0]), Integer.parseInt(args[1]))) {
-      bb.init();
-      bb.run();
-      bb.verify();
-    } catch (Exception e) {
-      LOG.error("Failed during BalanceBooks run", e);
-    }
-  }
-
-  /**
-   * Represents a single client actor in the test.  Each client runs as a separate thread.
-   *
-   * For the given number of iterations, the client will:
-   * <ol>
-   *   <li>select a random other client from which to withdraw</li>
-   *   <li>select a random amount from 0 to MAX_AMOUNT</li>
-   *   <li>start a new transaction and: deduct the amount from the other client's acccount, and deposit
-   *       the same amount to its own account.</li>
-   * </ol>
-   *
-   * Since multiple clients operate concurrently and contend over a set of constrained resources
-   * (the client accounts), it is expected that a portion of the attempted transactions will encounter
-   * conflicts, due to a simultaneous deduction from or deposit to one the same accounts which has successfully
-   * committed first.  In this case, the updates from the transaction encountering the conflict should be completely
-   * rolled back, leaving the data in a consistent state.
-   */
-  private static class Client extends Thread implements Closeable {
-    private final int id;
-    private final int totalClients;
-    private final int iterations;
-
-    private final Random random = new Random();
-
-    private TransactionContext txContext;
-    private TransactionAwareHTable txTable;
-
-
-    public Client(int id, int totalClients, int iterations) {
-      this.id = id;
-      this.totalClients = totalClients;
-      this.iterations = iterations;
-    }
-
-    /**
-     * Sets up any resources needed by the individual client.
-     *
-     * @param txClient the transaction client to use in accessing the transaciton service
-     * @param table the HBase table instance to use for accessing storage
-     */
-    public void init(TransactionSystemClient txClient, Table table) {
-      txTable = new TransactionAwareHTable(table);
-      txContext = new TransactionContext(txClient, txTable);
-    }
-
-    public void run() {
-      try {
-        for (int i = 0; i < iterations; i++) {
-          runOnce();
-        }
-      } catch (TransactionFailureException e) {
-        LOG.error("Client #{}: Failed on exception", id, e);
-      }
-    }
-
-    /**
-     * Runs a single iteration of the client logic.
-     */
-    private void runOnce() throws TransactionFailureException {
-      int withdrawee = getNextWithdrawee();
-      int amount = getAmount();
-
-      try {
-        txContext.start();
-        long withdraweeBalance = getCurrentBalance(withdrawee);
-        long ownBalance = getCurrentBalance(id);
-        long withdraweeNew = withdraweeBalance - amount;
-        long ownNew = ownBalance + amount;
-
-        setBalance(withdrawee, withdraweeNew);
-        setBalance(id, ownNew);
-        LOG.debug("Client #{}: Withdrew ${} from #{}; withdrawee old={}, new={}; own old={}, new={}",
-            id, amount, withdrawee, withdraweeBalance, withdraweeNew, ownBalance, ownNew);
-        txContext.finish();
-
-      } catch (IOException ioe) {
-        LOG.error("Client #{}: Unhandled client failure", id, ioe);
-        txContext.abort();
-      } catch (TransactionConflictException tce) {
-        LOG.debug("CONFLICT: client #{} attempting to withdraw from #{}", id, withdrawee);
-        txContext.abort(tce);
-      } catch (TransactionFailureException tfe) {
-        LOG.error("Client #{}: Unhandled transaction failure", id, tfe);
-        txContext.abort(tfe);
-      }
-    }
-
-    private long getCurrentBalance(int id) throws IOException {
-      Result r = txTable.get(new Get(Bytes.toBytes(id)));
-      byte[] balanceBytes = r.getValue(FAMILY, COL);
-      if (balanceBytes == null) {
-        return 0;
-      }
-      return Bytes.toLong(balanceBytes);
-    }
-
-    private void setBalance(int id, long balance) throws IOException {
-      txTable.put(new Put(Bytes.toBytes(id)).addColumn(FAMILY, COL, Bytes.toBytes(balance)));
-    }
-
-    private int getNextWithdrawee() {
-      int next;
-      do {
-        next = random.nextInt(totalClients);
-      } while (next == id);
-      return next;
-    }
-
-    private int getAmount() {
-      return random.nextInt(MAX_AMOUNT);
-    }
-
-    public void close() throws IOException {
-      txTable.close();
-    }
-  }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/package-info.java b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/package-info.java
deleted file mode 100644
index a0e67d5..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/package-info.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * This package contains example applications for Tephra designed to illustrate sample Tephra usage
- * and provide out-of-the-box sample applications which can be run to test cluster functionality.
- *
- * <p>Currently the following applications are provided:
- *
- * <ul>
- *   <li><strong>BalanceBooks</strong> - this application runs a specified number of concurrent clients in separate
- *     threads, which perform transactions to make withdrawals from each other's accounts and deposits to their own
- *     accounts.  At the end of the test, the total value of all account balances is verified to be equal to zero,
- *     which confirms that transactional integrity was not violated.
- *   </li>
- * </ul>
- * </p>
- *
- * <p>
- *   Note that, for simplicity, the examples package is currently hardcoded to compile against a specific HBase
- *   version (currently 2.0).  In the future, we should provide Maven profiles to allow compiling the examples
- *   against each of the supported HBase versions.
- * </p>
- */
-package org.apache.tephra.examples;
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
deleted file mode 100644
index 4dfe107..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.tephra.examples;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Scopes;
-import com.google.inject.util.Modules;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.TxConstants;
-import org.apache.tephra.distributed.TransactionService;
-import org.apache.tephra.persist.InMemoryTransactionStateStorage;
-import org.apache.tephra.persist.TransactionStateStorage;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.Tests;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests the {@link BalanceBooks} program.
- */
-public class BalanceBooksTest {
-  private static final Logger LOG = LoggerFactory.getLogger(BalanceBooksTest.class);
-  private static HBaseTestingUtility testUtil;
-  private static TransactionService txService;
-  private static ZKClientService zkClientService;
-
-  @ClassRule
-  public static TemporaryFolder tmpFolder = new TemporaryFolder();
-
-  @BeforeClass
-  public static void setup() throws Exception {
-    testUtil = new HBaseTestingUtility();
-    Configuration conf = testUtil.getConfiguration();
-    conf.setBoolean(TxConstants.Manager.CFG_DO_PERSIST, false);
-    conf.set(TxConstants.Manager.CFG_TX_SNAPSHOT_DIR, tmpFolder.newFolder().getAbsolutePath());
-
-    // Tune down the connection thread pool size
-    conf.setInt("hbase.hconnection.threads.core", 5);
-    conf.setInt("hbase.hconnection.threads.max", 10);
-    // Tunn down handler threads in regionserver
-    conf.setInt("hbase.regionserver.handler.count", 10);
-
-    // Set to random port
-    conf.setInt("hbase.master.port", 0);
-    conf.setInt("hbase.master.info.port", 0);
-    conf.setInt("hbase.regionserver.port", 0);
-    conf.setInt("hbase.regionserver.info.port", 0);
-
-    testUtil.startMiniCluster();
-
-    String zkClusterKey = testUtil.getClusterKey(); // hostname:clientPort:parentZnode
-    String zkQuorum = zkClusterKey.substring(0, zkClusterKey.lastIndexOf(':'));
-    LOG.info("Zookeeper Quorum is running at {}", zkQuorum);
-    conf.set(TxConstants.Service.CFG_DATA_TX_ZOOKEEPER_QUORUM, zkQuorum);
-
-    Injector injector = Guice.createInjector(
-        new ConfigModule(conf),
-        new ZKModule(),
-        new DiscoveryModules().getDistributedModules(),
-        Modules.override(new TransactionModules().getDistributedModules())
-            .with(new AbstractModule() {
-              @Override
-              protected void configure() {
-                bind(TransactionStateStorage.class).to(InMemoryTransactionStateStorage.class).in(Scopes.SINGLETON);
-              }
-            }),
-        new TransactionClientModule()
-    );
-
-    zkClientService = injector.getInstance(ZKClientService.class);
-    zkClientService.startAndWait();
-
-    // start a tx server
-    txService = injector.getInstance(TransactionService.class);
-    try {
-      LOG.info("Starting transaction service");
-      txService.startAndWait();
-    } catch (Exception e) {
-      LOG.error("Failed to start service: ", e);
-      throw e;
-    }
-
-    Tests.waitForTxReady(injector.getInstance(TransactionSystemClient.class));
-  }
-
-  @AfterClass
-  public static void tearDown() throws Exception {
-    if (txService != null) {
-      txService.stopAndWait();
-    }
-    if (zkClientService != null) {
-      zkClientService.stopAndWait();
-    }
-    testUtil.shutdownMiniCluster();
-  }
-
-  @Test
-  public void testBalanceBooks() throws Exception {
-    try (BalanceBooks bb = new BalanceBooks(5, 100, testUtil.getConfiguration())) {
-      bb.init();
-      bb.run();
-      assertTrue(bb.verify());
-    }
-  }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml
index 74667c1..e3fe9a3 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml
@@ -34,8 +34,12 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml
index 849447b..28e8a19 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml
@@ -34,8 +34,12 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml
index c6eae5b..f3fc1a3 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml
@@ -33,20 +33,21 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
-      <plugins>
-        <!-- Compiler -->
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.1</version>
-          <configuration>
-            <source>1.8</source>
-            <target>1.8</target>
-          </configuration>
-        </plugin>
-      </plugins>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+      <!-- Compiler -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/BalanceBooks.java b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/BalanceBooks.java
deleted file mode 100644
index b970598..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/BalanceBooks.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * 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.tephra.examples;
-
-import com.google.common.io.Closeables;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.tephra.TransactionConflictException;
-import org.apache.tephra.TransactionContext;
-import org.apache.tephra.TransactionFailureException;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.distributed.TransactionServiceClient;
-import org.apache.tephra.hbase.TransactionAwareHTable;
-import org.apache.tephra.hbase.coprocessor.TransactionProcessor;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.ConfigurationFactory;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Simple example application that launches a number of concurrent clients, one per "account".  Each client attempts to
- * make withdrawals from other clients, and deposit the same amount to its own account in a single transaction.
- * Since this means the client will be updating both its own row and the withdrawee's row, this will naturally lead to
- * transaction conflicts.  All clients will run for a specified number of iterations.  When the processing is complete,
- * the total sum of all rows should be zero, if transactional integrity was maintained.
- *
- * <p>
- *   You can run the BalanceBooks application with the following command:
- *   <pre>
- *     ./bin/tephra run org.apache.tephra.examples.BalanceBooks [num clients] [num iterations]
- *   </pre>
- *   where <code>[num clients]</code> is the number of concurrent client threads to use, and
- *   <code>[num iterations]</code> is the number of "transfer" operations to perform per client thread.
- * </p>
- */
-public class BalanceBooks implements Closeable {
-  private static final Logger LOG = LoggerFactory.getLogger(BalanceBooks.class);
-
-  private static final int MAX_AMOUNT = 100;
-  private static final byte[] TABLE = Bytes.toBytes("testbalances");
-  private static final byte[] FAMILY = Bytes.toBytes("f");
-  private static final byte[] COL = Bytes.toBytes("b");
-
-  private final int totalClients;
-  private final int iterations;
-
-  private Configuration conf;
-  private ZKClientService zkClient;
-  private TransactionServiceClient txClient;
-  private Connection conn;
-
-  public BalanceBooks(int totalClients, int iterations) {
-    this(totalClients, iterations, new ConfigurationFactory().get());
-  }
-
-  public BalanceBooks(int totalClients, int iterations, Configuration conf) {
-    this.totalClients = totalClients;
-    this.iterations = iterations;
-    this.conf = conf;
-  }
-
-  /**
-   * Sets up common resources required by all clients.
-   */
-  public void init() throws IOException {
-    Injector injector = Guice.createInjector(
-        new ConfigModule(conf),
-        new ZKModule(),
-        new DiscoveryModules().getDistributedModules(),
-        new TransactionModules().getDistributedModules(),
-        new TransactionClientModule()
-    );
-
-    zkClient = injector.getInstance(ZKClientService.class);
-    zkClient.startAndWait();
-    txClient = injector.getInstance(TransactionServiceClient.class);
-    conn = ConnectionFactory.createConnection(conf);
-    createTableIfNotExists(conf, TABLE, new byte[][]{ FAMILY });
-  }
-
-  /**
-   * Runs all clients and waits for them to complete.
-   */
-  public void run() throws IOException, InterruptedException {
-    List<Client> clients = new ArrayList<>(totalClients);
-    for (int i = 0; i < totalClients; i++) {
-      Client c = new Client(i, totalClients, iterations);
-      c.init(txClient, conn.getTable(TableName.valueOf(TABLE)));
-      c.start();
-      clients.add(c);
-    }
-
-    for (Client c : clients) {
-      c.join();
-      Closeables.closeQuietly(c);
-    }
-  }
-
-  /**
-   * Validates the current state of the data stored at the end of the test.  Each update by a client consists of two
-   * parts: a withdrawal of a random amount from a randomly select other account, and a corresponding to deposit to
-   * the client's own account.  So, if all the updates were performed consistently (no partial updates or partial
-   * rollbacks), then the total sum of all balances at the end should be 0.
-   */
-  public boolean verify() {
-    boolean success = false;
-    try {
-      TransactionAwareHTable table = new TransactionAwareHTable(conn.getTable(TableName.valueOf(TABLE)));
-      TransactionContext context = new TransactionContext(txClient, table);
-
-      LOG.info("VERIFYING BALANCES");
-      context.start();
-      long totalBalance = 0;
-
-      try (ResultScanner scanner = table.getScanner(new Scan())) {
-        for (Result r : scanner) {
-          if (!r.isEmpty()) {
-            int rowId = Bytes.toInt(r.getRow());
-            long balance = Bytes.toLong(r.getValue(FAMILY, COL));
-            totalBalance += balance;
-            LOG.info("Client #{}: balance = ${}", rowId, balance);
-          }
-        }
-      }
-      if (totalBalance == 0) {
-        LOG.info("PASSED!");
-        success = true;
-      } else {
-        LOG.info("FAILED! Total balance should be 0 but was {}", totalBalance);
-      }
-      context.finish();
-    } catch (Exception e) {
-      LOG.error("Failed verification check", e);
-    }
-    return success;
-  }
-
-  /**
-   * Frees up the underlying resources common to all clients.
-   */
-  public void close() {
-    try {
-      if (conn != null) {
-        conn.close();
-      }
-    } catch (IOException ignored) { }
-
-    if (zkClient != null) {
-      zkClient.stopAndWait();
-    }
-  }
-
-  protected void createTableIfNotExists(Configuration conf, byte[] tableName, byte[][] columnFamilies)
-      throws IOException {
-    try (Admin admin = this.conn.getAdmin()) {
-      HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
-      for (byte[] family : columnFamilies) {
-        HColumnDescriptor columnDesc = new HColumnDescriptor(family);
-        columnDesc.setMaxVersions(Integer.MAX_VALUE);
-        desc.addFamily(columnDesc);
-      }
-      desc.addCoprocessor(TransactionProcessor.class.getName());
-      admin.createTable(desc);
-    }
-  }
-
-  public static void main(String[] args) {
-    if (args.length != 2) {
-      System.err.println("Usage: java " + BalanceBooks.class.getName() + " <num clients> <iterations>");
-      System.err.println("\twhere <num clients> >= 2");
-      System.exit(1);
-    }
-
-    try (BalanceBooks bb = new BalanceBooks(Integer.parseInt(args[0]), Integer.parseInt(args[1]))) {
-      bb.init();
-      bb.run();
-      bb.verify();
-    } catch (Exception e) {
-      LOG.error("Failed during BalanceBooks run", e);
-    }
-  }
-
-  /**
-   * Represents a single client actor in the test.  Each client runs as a separate thread.
-   *
-   * For the given number of iterations, the client will:
-   * <ol>
-   *   <li>select a random other client from which to withdraw</li>
-   *   <li>select a random amount from 0 to MAX_AMOUNT</li>
-   *   <li>start a new transaction and: deduct the amount from the other client's acccount, and deposit
-   *       the same amount to its own account.</li>
-   * </ol>
-   *
-   * Since multiple clients operate concurrently and contend over a set of constrained resources
-   * (the client accounts), it is expected that a portion of the attempted transactions will encounter
-   * conflicts, due to a simultaneous deduction from or deposit to one the same accounts which has successfully
-   * committed first.  In this case, the updates from the transaction encountering the conflict should be completely
-   * rolled back, leaving the data in a consistent state.
-   */
-  private static class Client extends Thread implements Closeable {
-    private final int id;
-    private final int totalClients;
-    private final int iterations;
-
-    private final Random random = new Random();
-
-    private TransactionContext txContext;
-    private TransactionAwareHTable txTable;
-
-
-    public Client(int id, int totalClients, int iterations) {
-      this.id = id;
-      this.totalClients = totalClients;
-      this.iterations = iterations;
-    }
-
-    /**
-     * Sets up any resources needed by the individual client.
-     *
-     * @param txClient the transaction client to use in accessing the transaciton service
-     * @param table the HBase table instance to use for accessing storage
-     */
-    public void init(TransactionSystemClient txClient, Table table) {
-      txTable = new TransactionAwareHTable(table);
-      txContext = new TransactionContext(txClient, txTable);
-    }
-
-    public void run() {
-      try {
-        for (int i = 0; i < iterations; i++) {
-          runOnce();
-        }
-      } catch (TransactionFailureException e) {
-        LOG.error("Client #{}: Failed on exception", id, e);
-      }
-    }
-
-    /**
-     * Runs a single iteration of the client logic.
-     */
-    private void runOnce() throws TransactionFailureException {
-      int withdrawee = getNextWithdrawee();
-      int amount = getAmount();
-
-      try {
-        txContext.start();
-        long withdraweeBalance = getCurrentBalance(withdrawee);
-        long ownBalance = getCurrentBalance(id);
-        long withdraweeNew = withdraweeBalance - amount;
-        long ownNew = ownBalance + amount;
-
-        setBalance(withdrawee, withdraweeNew);
-        setBalance(id, ownNew);
-        LOG.debug("Client #{}: Withdrew ${} from #{}; withdrawee old={}, new={}; own old={}, new={}",
-            id, amount, withdrawee, withdraweeBalance, withdraweeNew, ownBalance, ownNew);
-        txContext.finish();
-
-      } catch (IOException ioe) {
-        LOG.error("Client #{}: Unhandled client failure", id, ioe);
-        txContext.abort();
-      } catch (TransactionConflictException tce) {
-        LOG.debug("CONFLICT: client #{} attempting to withdraw from #{}", id, withdrawee);
-        txContext.abort(tce);
-      } catch (TransactionFailureException tfe) {
-        LOG.error("Client #{}: Unhandled transaction failure", id, tfe);
-        txContext.abort(tfe);
-      }
-    }
-
-    private long getCurrentBalance(int id) throws IOException {
-      Result r = txTable.get(new Get(Bytes.toBytes(id)));
-      byte[] balanceBytes = r.getValue(FAMILY, COL);
-      if (balanceBytes == null) {
-        return 0;
-      }
-      return Bytes.toLong(balanceBytes);
-    }
-
-    private void setBalance(int id, long balance) throws IOException {
-      txTable.put(new Put(Bytes.toBytes(id)).addColumn(FAMILY, COL, Bytes.toBytes(balance)));
-    }
-
-    private int getNextWithdrawee() {
-      int next;
-      do {
-        next = random.nextInt(totalClients);
-      } while (next == id);
-      return next;
-    }
-
-    private int getAmount() {
-      return random.nextInt(MAX_AMOUNT);
-    }
-
-    public void close() throws IOException {
-      txTable.close();
-    }
-  }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/package-info.java b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/package-info.java
deleted file mode 100644
index a0e67d5..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/package-info.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.
- */
-
-/**
- * This package contains example applications for Tephra designed to illustrate sample Tephra usage
- * and provide out-of-the-box sample applications which can be run to test cluster functionality.
- *
- * <p>Currently the following applications are provided:
- *
- * <ul>
- *   <li><strong>BalanceBooks</strong> - this application runs a specified number of concurrent clients in separate
- *     threads, which perform transactions to make withdrawals from each other's accounts and deposits to their own
- *     accounts.  At the end of the test, the total value of all account balances is verified to be equal to zero,
- *     which confirms that transactional integrity was not violated.
- *   </li>
- * </ul>
- * </p>
- *
- * <p>
- *   Note that, for simplicity, the examples package is currently hardcoded to compile against a specific HBase
- *   version (currently 2.0).  In the future, we should provide Maven profiles to allow compiling the examples
- *   against each of the supported HBase versions.
- * </p>
- */
-package org.apache.tephra.examples;
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
deleted file mode 100644
index 4dfe107..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.tephra.examples;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Scopes;
-import com.google.inject.util.Modules;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.TxConstants;
-import org.apache.tephra.distributed.TransactionService;
-import org.apache.tephra.persist.InMemoryTransactionStateStorage;
-import org.apache.tephra.persist.TransactionStateStorage;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.Tests;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests the {@link BalanceBooks} program.
- */
-public class BalanceBooksTest {
-  private static final Logger LOG = LoggerFactory.getLogger(BalanceBooksTest.class);
-  private static HBaseTestingUtility testUtil;
-  private static TransactionService txService;
-  private static ZKClientService zkClientService;
-
-  @ClassRule
-  public static TemporaryFolder tmpFolder = new TemporaryFolder();
-
-  @BeforeClass
-  public static void setup() throws Exception {
-    testUtil = new HBaseTestingUtility();
-    Configuration conf = testUtil.getConfiguration();
-    conf.setBoolean(TxConstants.Manager.CFG_DO_PERSIST, false);
-    conf.set(TxConstants.Manager.CFG_TX_SNAPSHOT_DIR, tmpFolder.newFolder().getAbsolutePath());
-
-    // Tune down the connection thread pool size
-    conf.setInt("hbase.hconnection.threads.core", 5);
-    conf.setInt("hbase.hconnection.threads.max", 10);
-    // Tunn down handler threads in regionserver
-    conf.setInt("hbase.regionserver.handler.count", 10);
-
-    // Set to random port
-    conf.setInt("hbase.master.port", 0);
-    conf.setInt("hbase.master.info.port", 0);
-    conf.setInt("hbase.regionserver.port", 0);
-    conf.setInt("hbase.regionserver.info.port", 0);
-
-    testUtil.startMiniCluster();
-
-    String zkClusterKey = testUtil.getClusterKey(); // hostname:clientPort:parentZnode
-    String zkQuorum = zkClusterKey.substring(0, zkClusterKey.lastIndexOf(':'));
-    LOG.info("Zookeeper Quorum is running at {}", zkQuorum);
-    conf.set(TxConstants.Service.CFG_DATA_TX_ZOOKEEPER_QUORUM, zkQuorum);
-
-    Injector injector = Guice.createInjector(
-        new ConfigModule(conf),
-        new ZKModule(),
-        new DiscoveryModules().getDistributedModules(),
-        Modules.override(new TransactionModules().getDistributedModules())
-            .with(new AbstractModule() {
-              @Override
-              protected void configure() {
-                bind(TransactionStateStorage.class).to(InMemoryTransactionStateStorage.class).in(Scopes.SINGLETON);
-              }
-            }),
-        new TransactionClientModule()
-    );
-
-    zkClientService = injector.getInstance(ZKClientService.class);
-    zkClientService.startAndWait();
-
-    // start a tx server
-    txService = injector.getInstance(TransactionService.class);
-    try {
-      LOG.info("Starting transaction service");
-      txService.startAndWait();
-    } catch (Exception e) {
-      LOG.error("Failed to start service: ", e);
-      throw e;
-    }
-
-    Tests.waitForTxReady(injector.getInstance(TransactionSystemClient.class));
-  }
-
-  @AfterClass
-  public static void tearDown() throws Exception {
-    if (txService != null) {
-      txService.stopAndWait();
-    }
-    if (zkClientService != null) {
-      zkClientService.stopAndWait();
-    }
-    testUtil.shutdownMiniCluster();
-  }
-
-  @Test
-  public void testBalanceBooks() throws Exception {
-    try (BalanceBooks bb = new BalanceBooks(5, 100, testUtil.getConfiguration())) {
-      bb.init();
-      bb.run();
-      assertTrue(bb.verify());
-    }
-  }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml
index 6b348b3..2ca170c 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml
@@ -33,20 +33,21 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
-      <plugins>
-        <!-- Compiler -->
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.1</version>
-          <configuration>
-            <source>1.8</source>
-            <target>1.8</target>
-          </configuration>
-        </plugin>
-      </plugins>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+      <!-- Compiler -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml
index a7627d8..b34f898 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml
@@ -33,20 +33,21 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
-      <plugins>
-        <!-- Compiler -->
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.1</version>
-          <configuration>
-            <source>1.8</source>
-            <target>1.8</target>
-          </configuration>
-        </plugin>
-      </plugins>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+      <!-- Compiler -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml
index 704249c..380b0a0 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml
@@ -33,20 +33,21 @@
   </properties>
 
   <build>
-    <sourceDirectory>src/main/java</sourceDirectory>
-    <testSourceDirectory>src/test/java</testSourceDirectory>
-      <plugins>
-        <!-- Compiler -->
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.1</version>
-          <configuration>
-            <source>1.8</source>
-            <target>1.8</target>
-          </configuration>
-        </plugin>
-      </plugins>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+      </plugin>
+      <!-- Compiler -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+    </plugins>
   </build>
 
   <dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/pom.xml b/tephra-examples/tephra-examples-post-1.3/pom.xml
index a3985c4..7a14e81 100644
--- a/tephra-examples/tephra-examples-post-1.3/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/pom.xml
@@ -46,7 +46,6 @@
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>build-helper-maven-plugin</artifactId>
-          <version>3.0.0</version>
           <executions>
             <execution>
               <id>add-source</id>
diff --git a/tephra-examples/tephra-examples-pre-1.3/pom.xml b/tephra-examples/tephra-examples-pre-1.3/pom.xml
index 2c6306d..3155dca 100644
--- a/tephra-examples/tephra-examples-pre-1.3/pom.xml
+++ b/tephra-examples/tephra-examples-pre-1.3/pom.xml
@@ -42,7 +42,6 @@
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>build-helper-maven-plugin</artifactId>
-          <version>3.0.0</version>
           <executions>
             <execution>
               <id>add-source</id>
diff --git a/tephra-hbase-compat-1.1-base/pom.xml b/tephra-hbase-compat-1.1-base/pom.xml
index b337015..6b6d0d8 100644
--- a/tephra-hbase-compat-1.1-base/pom.xml
+++ b/tephra-hbase-compat-1.1-base/pom.xml
@@ -157,7 +157,6 @@
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>build-helper-maven-plugin</artifactId>
-          <version>3.0.0</version>
           <executions>
             <execution>
               <id>add-source</id>
diff --git a/tephra-hbase-compat-1.4-base/pom.xml b/tephra-hbase-compat-1.4-base/pom.xml
index cf5daf1..bfbd5bd 100644
--- a/tephra-hbase-compat-1.4-base/pom.xml
+++ b/tephra-hbase-compat-1.4-base/pom.xml
@@ -180,7 +180,6 @@
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>build-helper-maven-plugin</artifactId>
-          <version>3.0.0</version>
           <executions>
             <execution>
               <id>add-source</id>
diff --git a/tephra-hbase-compat-2.0-base/pom.xml b/tephra-hbase-compat-2.0-base/pom.xml
index 46ad9cf..611655e 100644
--- a/tephra-hbase-compat-2.0-base/pom.xml
+++ b/tephra-hbase-compat-2.0-base/pom.xml
@@ -167,7 +167,6 @@
         <plugin>
           <groupId>org.codehaus.mojo</groupId>
           <artifactId>build-helper-maven-plugin</artifactId>
-          <version>3.0.0</version>
           <executions>
             <execution>
               <id>add-source</id>