<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.9.1 from target/generated-site/xdoc/start-mojo.xml
 | Rendered using Apache Maven Fluido Skin 1.8
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="generator" content="Apache Maven Doxia Site Renderer 1.9.1" />
    <title>Apache Accumulo Maven Plugin &#x2013; accumulo2:start</title>
    <link rel="stylesheet" href="./css/apache-maven-fluido-1.8.min.css" />
    <link rel="stylesheet" href="./css/site.css" />
    <link rel="stylesheet" href="./css/print.css" media="print" />
    <script src="./js/apache-maven-fluido-1.8.min.js"></script>
  </head>
  <body class="topBarDisabled">
    <div class="container-fluid">
      <header>
        <div id="banner">
          <div class="pull-left"><div id="bannerLeft"><h2>Apache Accumulo Maven Plugin</h2>
</div>
</div>
          <div class="pull-right"></div>
          <div class="clear"><hr/></div>
        </div>

        <div id="breadcrumbs">
          <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2019-08-07<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.0.0</li>
          </ul>
        </div>
      </header>
      <div class="row-fluid">
        <header id="leftColumn" class="span2">
          <nav class="well sidebar-nav">
  <ul class="nav nav-list">
   <li class="nav-header">Overview</li>
    <li><a href="../" title="Accumulo Home"><span class="none"></span>Accumulo Home</a></li>
    <li><a href="index.html" title="Introduction"><span class="none"></span>Introduction</a></li>
    <li><a href="plugin-info.html" title="Goals"><span class="none"></span>Goals</a></li>
   <li class="nav-header">Project Documentation</li>
    <li><a href="project-info.html" title="Project Information"><span class="icon-chevron-right"></span>Project Information</a></li>
    <li><a href="project-reports.html" title="Project Reports"><span class="icon-chevron-right"></span>Project Reports</a></li>
  </ul>
          </nav>
          <div class="well sidebar-nav">
            <hr />
            <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
            </div>
          </div>
        </header>
        <main id="bodyColumn"  class="span10" >

  
    <section>
<h2><a name="accumulo2:start"></a>accumulo2:start</h2>
      
<p><b>Full name</b>:</p>
      
<p>org.apache.accumulo:accumulo2-maven-plugin:1.0.0:start</p>
      
<p><b>Description</b>:</p>
      
<div>Goal which starts an instance of MiniAccumuloCluster.</div>
      
<p><b>Attributes</b>:</p>
      
<ul>
        
<li>Requires a Maven project to be executed.</li>
        
<li>Requires dependency resolution of artifacts in scope: test.</li>
        
<li>Binds by default to the <a class="externalLink" href="http://maven.apache.org/ref/current/maven-core/lifecycles.html">lifecycle phase</a>: pre-integration-test.</li>
      </ul>
      <section>
<h3><a name="Required_Parameters"></a>Required Parameters</h3>
        
<table class="table table-striped" border="0">
          
<tr class="a">
            
<th>Name</th>
            
<th>Type</th>
            
<th>Since</th>
            
<th>Description</th>
          </tr>
          
<tr class="b">
            
<td><a href="#instanceName">&lt;instanceName&gt;</a></td>
            
<td>String</td>
            
<td>1.0.0</td>
            
<td>Specifies the instance name the Accumulo instance will use for
itself, which clients use to connect. It is also used to create the
working directory for MiniAccumuloCluster, which will contain the
client properties file which clients can use to connect. See <a href="#outputDirectory">outputDirectory</a>.<br /><b>Default value is</b>: testInstance.<br /><b>User property is</b>: accumulo.instanceName.<br /><b>Alias is</b>: instanceName.</td>
          </tr>
          
<tr class="a">
            
<td><a href="#outputDirectory">&lt;outputDirectory&gt;</a></td>
            
<td>File</td>
            
<td>1.0.0</td>
            
<td>Specifies the output directory in which this plugin will create
files for its runtime use. This plugin will create a client
properties file inside a subdirectory named after this plugin and
the specified instance name. This property defaults to your Maven
target directory. 

<p>For example:
${outputDirectory}/accumulo2-maven-plugin/instanceName</p>

<p>The client properties file can be used to construct an Accumulo
client in your test code like:</p>

<div>
<pre>

String instanceName = &quot;plugin-it-instance&quot;;
String outputDir = &quot;target&quot;;
File propsFile = new File(outputDir + &quot;/accumulo2-maven-plugin/&quot; + instanceName);
Properties props = MiniAccumuloCluster.getClientProperties(propsFile);
AccumuloClient client = Accumulo.newClient().from(props).build();

</pre></div><br /><b>Default value is</b>: ${project.build.directory}.<br /><b>User property is</b>: accumulo.outputDirectory.<br /><b>Alias is</b>: outputDirectory.</td>
          </tr>
        </table>
      </section>
      <section>
<h3><a name="Optional_Parameters"></a>Optional Parameters</h3>
        
<table class="table table-striped" border="0">
          
<tr class="a">
            
<th>Name</th>
            
<th>Type</th>
            
<th>Since</th>
            
<th>Description</th>
          </tr>
          
<tr class="b">
            
<td><a href="#rootPassword">&lt;rootPassword&gt;</a></td>
            
<td>String</td>
            
<td>1.0.0</td>
            
<td>Specifies the root user's initial password for clients to connect
and perform additional operations.<br /><b>Default value is</b>: secret.<br /><b>User property is</b>: accumulo.rootPassword.<br /><b>Alias is</b>: rootPassword.</td>
          </tr>
          
<tr class="a">
            
<td><a href="#skip">&lt;skip&gt;</a></td>
            
<td>boolean</td>
            
<td>1.0.0</td>
            
<td>Instructs this plugin to skip execution.<br /><b>Default value is</b>: false.<br /><b>User property is</b>: accumulo.skip.<br /><b>Alias is</b>: skip.</td>
          </tr>
          
<tr class="b">
            
<td><a href="#zooKeeperPort">&lt;zooKeeperPort&gt;</a></td>
            
<td>int</td>
            
<td>1.0.0</td>
            
<td>Specifies the client port on which ZooKeeper listens. If not
specified, MiniAccumuloCluster will select an available port on its
own.<br /><b>Default value is</b>: 0.<br /><b>User property is</b>: accumulo.zooKeeperPort.<br /><b>Alias is</b>: zooKeeperPort.</td>
          </tr>
        </table>
      </section>
      <section>
<h3><a name="Parameter_Details"></a>Parameter Details</h3>
        <section>
<h4><a name="a.3CinstanceName.3E"></a><b><a name="instanceName">&lt;instanceName&gt;</a></b></h4>
        
<div>Specifies the instance name the Accumulo instance will use for
itself, which clients use to connect. It is also used to create the
working directory for MiniAccumuloCluster, which will contain the
client properties file which clients can use to connect. See <a href="#outputDirectory">outputDirectory</a>.</div>
        
<ul>
          
<li><b>Type</b>: java.lang.String</li>
          
<li><b>Since</b>: 1.0.0</li>
          
<li><b>Required</b>: Yes</li>
          
<li><b>User Property</b>: accumulo.instanceName</li>
          
<li><b>Default</b>: testInstance</li>
          
<li><b>Alias</b>: instanceName</li>
        </ul><hr /></section><section>
<h4><a name="a.3CoutputDirectory.3E"></a><b><a name="outputDirectory">&lt;outputDirectory&gt;</a></b></h4>
        
<div>Specifies the output directory in which this plugin will create
files for its runtime use. This plugin will create a client
properties file inside a subdirectory named after this plugin and
the specified instance name. This property defaults to your Maven
target directory. 

<p>For example:
${outputDirectory}/accumulo2-maven-plugin/instanceName</p>

<p>The client properties file can be used to construct an Accumulo
client in your test code like:</p>

<div>
<pre>

String instanceName = &quot;plugin-it-instance&quot;;
String outputDir = &quot;target&quot;;
File propsFile = new File(outputDir + &quot;/accumulo2-maven-plugin/&quot; + instanceName);
Properties props = MiniAccumuloCluster.getClientProperties(propsFile);
AccumuloClient client = Accumulo.newClient().from(props).build();

</pre></div></div>
        
<ul>
          
<li><b>Type</b>: java.io.File</li>
          
<li><b>Since</b>: 1.0.0</li>
          
<li><b>Required</b>: Yes</li>
          
<li><b>User Property</b>: accumulo.outputDirectory</li>
          
<li><b>Default</b>: ${project.build.directory}</li>
          
<li><b>Alias</b>: outputDirectory</li>
        </ul><hr /></section><section>
<h4><a name="a.3CrootPassword.3E"></a><b><a name="rootPassword">&lt;rootPassword&gt;</a></b></h4>
        
<div>Specifies the root user's initial password for clients to connect
and perform additional operations.</div>
        
<ul>
          
<li><b>Type</b>: java.lang.String</li>
          
<li><b>Since</b>: 1.0.0</li>
          
<li><b>Required</b>: No</li>
          
<li><b>User Property</b>: accumulo.rootPassword</li>
          
<li><b>Default</b>: secret</li>
          
<li><b>Alias</b>: rootPassword</li>
        </ul><hr /></section><section>
<h4><a name="a.3Cskip.3E"></a><b><a name="skip">&lt;skip&gt;</a></b></h4>
        
<div>Instructs this plugin to skip execution.</div>
        
<ul>
          
<li><b>Type</b>: boolean</li>
          
<li><b>Since</b>: 1.0.0</li>
          
<li><b>Required</b>: No</li>
          
<li><b>User Property</b>: accumulo.skip</li>
          
<li><b>Default</b>: false</li>
          
<li><b>Alias</b>: skip</li>
        </ul><hr /></section><section>
<h4><a name="a.3CzooKeeperPort.3E"></a><b><a name="zooKeeperPort">&lt;zooKeeperPort&gt;</a></b></h4>
        
<div>Specifies the client port on which ZooKeeper listens. If not
specified, MiniAccumuloCluster will select an available port on its
own.</div>
        
<ul>
          
<li><b>Type</b>: int</li>
          
<li><b>Since</b>: 1.0.0</li>
          
<li><b>Required</b>: No</li>
          
<li><b>User Property</b>: accumulo.zooKeeperPort</li>
          
<li><b>Default</b>: 0</li>
          
<li><b>Alias</b>: zooKeeperPort</li>
        </ul>
      </section></section>
    </section>
  

        </main>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
            <p>Copyright &#169;      2013&#x2013;2019<a href="https://www.apache.org">The Apache Software Foundation</a>.
.</p>
        </div>
      </div>
    </footer>
  </body>
</html>
