#!/bin/sh
#
#/**
# * 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.
# */

# Environment Settings for BookKeeper CLI (experimental)

# Set JAVA_HOME here to override the environment setting
# JAVA_HOME=

########################################
# default settings for bookkeeper cli
########################################

# Configuration file of settings used in bookkeeper cli
# CLI_CONF=

# Extra options to be passed to the jvm
# CLI_EXTRA_OPTS=

# Add extra paths to the bookkeeper classpath
# CLI_EXTRA_CLASSPATH=

#################################
# CLI Logging Options
#################################

# Log4j configuration file
# CLI_LOG_CONF=

# Logs location
# CLI_LOG_DIR=

# Log file name
# CLI_LOG_FILE="bookkeeper-cli.log"

# Log level & appender
# CLI_ROOT_LOGGER="INFO,CONSOLE"

#################################
# JVM memory options
#################################

# CLI_MAX_HEAP_MEMORY=512M
# CLI_MIN_HEAP_MEMORY=256M
# CLI_MEM_OPTS=

# JVM GC options
# CLI_GC_OPTS=

# JVM GC logging options
# CLI_GC_LOGGING_OPTS=
