eclipse项目从编程到打jar包到编写BashShell执行
一、创建Java项目,并编写项目(带额外jar包)
二、打jar包
三、编写BashShell执行
一、创建Java项目,并编写项目(带额外jar包)
项目目录如下所示:
代码如下所示:
我设计了三个类,分别是 PersonData.java、Data2Json.java以及 TestData2Json.java,具体代码如下所示:
PersonData.java是个人员数据类,主要存储人员数据的。
package com.zc.dataclass.main;
import java.io.Serializable;
public class PersonData implements Serializable {
private static final long serialVersionUID = 1L;
private String xm; //姓名
private String xb; //性别
private String sr; //生日
public String getXm() {
return xm;
}
public void setXm(String xm) {
this.xm = xm;
}
public String getXb() {
return xb;
}
public void setXb(String xb) {
this.xb = xb;
}
public String getSr() {
return sr;
}
public void setSr(String sr) {
this.sr = sr;
}
}
Data2Json.java 主要是将数据类转换成JSON
package com.zc.data2json.trans.main;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* @author zhangchao
* @date 2018-08-22
* 将数据(类)转换成Json格式数据
*/
public class Data2Json {
/**
* 将 Object 转换成 JSONObject
* @param obj
* @return
*/
public JSONObject data2JsonObj(Object obj) {
JSONObject jsonObj = JSONObject.fromObject(obj);
return jsonObj;
}
/* 错误的例子
public JSONObject data2JsonObj(List<Object> list) {
JSONObject jsonObj = JSONObject.fromObject(list);
return jsonObj;
}*/
/**
* 将 Object 转换成 JSONArray
* @param obj
* @return
*/
public JSONArray data2JsonArr(Object obj) {
JSONArray jsonArr = JSONArray.fromObject(obj);
return jsonArr;
}
/**
* 将 List<Object> 转换成 JSONArray
* @param list
* @return
*/
public JSONArray data2JsonArr(List<Object> list) {
JSONArray jsonArr = JSONArray.fromObject(list);
return jsonArr;
}
/*public JSONArray data2JsonArr2(List<Object> list) {
JSONArray json = new JSONArray();
for(Object pLog : list){
JSONObject jo = new JSONObject();
jo.put("id", pLog.getId());
jo.put("time", pLog.getBeginTime());
// 注意add和element的区别
json.add(jo);
}
return json;
}*/
/**
* 将数组转换成JSONArray
* @param arr
* @return
*/
public JSONArray data2JsonArr(Object[] arr) {
JSONArray jsonArr = JSONArray.fromObject(arr);
return jsonArr;
}
}
TestData2Json.java 测试
package com.zc.data2json.trans.test;
import java.util.ArrayList;
import java.util.List;
import com.zc.data2json.trans.main.Data2Json;
import com.zc.dataclass.main.PersonData;
import net.sf.json.JSONArray;
public class TestData2Json {
private final static long heartbeat = 10; // 设置心跳10s
static long i=1;
public static void main(String[] args) {
while(true) {
PersonData pD = getPersonData();
Data2Json dcj = new Data2Json();
JSONArray jsonArr = dcj.data2JsonArr(pD);
System.out.println(jsonArr.toString());
try {
Thread.sleep(heartbeat*1000); //ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* 获取类数据
*/
public static PersonData getPersonData() {
PersonData pd1 = new PersonData();
pd1.setXm("张"+i++);
//(数据类型)(最小值+Math.random()*(最大值-最小值+1))
int sex = (int)(1+Math.random()*(2-1+1));
if(sex==1)
pd1.setXb("男");
else
pd1.setXb("女");
pd1.setSr("1991-01-12");
return pd1;
}
/*
* 获取类数据
*/
public static List<PersonData> getPersonDataList() {
PersonData pd1 = new PersonData();
pd1.setXm("张"+i++);
pd1.setXb("男");
pd1.setSr("1991-01-12");
List<PersonData> pd = new ArrayList<PersonData>();
pd.add(pd1);
return pd;
}
}
二、打jar包
用第三种方式打jar包
三、编写BashShell执行
首先先创建一个名为ZcData2Json的文件夹,该文件夹如下所示:
bin:其中放着运行程序的脚本文件 data2json
conf:放着配置文件 data2json.conf
data2json:放着第二步生成的jar包以及lib包
lib:用于存放jar包,暂为空
logs:用于存储生成的日志文件
run:用于存储运行进程的pid文件 data2json.pid
data2json文件内容如下所示:
bin中 data2json 内容如下所示:
#!/usr/bin/env bash
# DATA2JSON, 参考neo4j
#版本号
DATA2JSON_VERSION="data2json version \"1.0\""
#获取该文件的名称
declare -r PROGRAM="$(basename "$0")"
#echo $PROGRAM
#获取该文件的路径
bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin"; pwd`
# get arguments 获取参数
command=$1
#echo ${command}
# 获取用户名
#执行程序启动所使用的系统用户,考虑到安全,推荐不使用root帐号
#USERNAME=$(users)
USERNAME=$USER
#echo $USERNAME
# 获取主机名
HOSTNAME=$(hostname)
#echo $HOSTNAME
set -o errexit -o nounset -o pipefail
[[ "${TRACE:-}" ]] && set -o xtrace
# Callers may provide the following environment variables to customize this script:
# * JAVA_HOME
# * JAVA_OPTS
# * JAVA_CMD
###################################
#环境变量及程序执行参数
#需要根据实际环境以及Java程序名称来修改这些参数
###################################
#JDK所在路径
#JAVA_HOME=$JAVA_HOME
#JAVA_HOME="/usr/lib/jvm/java"
#echo $JAVA_HOME
# 检测系统
function detect_os() {
if uname -s | grep -q Darwin; then
DIST_OS="macosx"
elif [[ -e /etc/gentoo-release ]]; then
DIST_OS="gentoo"
else
DIST_OS="other"
fi
}
#detect_os
#echo $DIST_OS
# 检测java
function check_java() {
_find_java_cmd
version_command=("${JAVA_CMD}" "-version")
[[ -n "${JAVA_MEMORY_OPTS:-}" ]] && version_command+=("${JAVA_MEMORY_OPTS[@]}")
JAVA_VERSION=$("${version_command[@]}" 2>&1 | awk -F '"' '/version/ {print $2}')
if [[ "${JAVA_VERSION}" < "1.8" ]]; then
echo "ERROR! DATA2JSON cannot be started using java version ${JAVA_VERSION}. "
_show_java_help
exit 1
fi
if ! ("${version_command[@]}" 2>&1 | egrep -q "(Java HotSpot\\(TM\\)|OpenJDK|IBM) (64-Bit Server|Server|Client|J9) VM"); then
echo "WARNING! You are using an unsupported Java runtime. "
_show_java_help
fi
}
# 查找Java命令
function _find_java_cmd() {
[[ "${JAVA_CMD:-}" ]] && return
detect_os
_find_java_home
if [[ "${JAVA_HOME:-}" ]] ; then
JAVA_CMD="${JAVA_HOME}/bin/java"
if [[ ! -f "${JAVA_CMD}" ]]; then
echo "ERROR: JAVA_HOME is incorrectly defined as ${JAVA_HOME} (the executable ${JAVA_CMD} does not exist)"
exit 1
fi
else
if [ "${DIST_OS}" != "macosx" ] ; then
# Don't use default java on Darwin because it displays a misleading dialog box
JAVA_CMD="$(which java || true)"
fi
fi
if [[ ! "${JAVA_CMD:-}" ]]; then
echo "ERROR: Unable to find Java executable."
_show_java_help
exit 1
fi
}
# 查找Java home目录
function _find_java_home() {
[[ "${JAVA_HOME:-}" ]] && return
case "${DIST_OS}" in
"macosx")
JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
;;
"gentoo")
JAVA_HOME="$(java-config --jre-home)"
;;
esac
}
function _show_java_help() {
echo "* Please use Oracle(R) Java(TM) 8, OpenJDK(TM) or IBM J9 to run DATA2JSON."
}
# 设置 CLASSPATH
function build_classpath() {
CLASSPATH="${DATA2JSON_HOME}:${DATA2JSON_CONF}:${DATA2JSON_LIB}"
# augment with tools.jar, will need JDK
if [ "${JAVA_HOME:-}" ]; then
JAVA_TOOLS="${JAVA_HOME}/lib/tools.jar"
if [[ -e $JAVA_TOOLS ]]; then
CLASSPATH="${CLASSPATH}:${JAVA_TOOLS}"
fi
fi
}
# 设置 JAVA_OPTS
function setup_java_opts() {
JAVA_OPTS=("-server")
JAVA_OPTS+=" -Xms512m -Xmx512m -Xmn256m -Djava.awt.headless=true -XX:MaxNewSize=256m"
}
# Sets up the standard environment for running Neo4j shell scripts.
#
# Provides these environment variables:
# DATA2JSON_HOME
# DATA2JSON_CONF
# DATA2JSON_DATA
# DATA2JSON_LIB
# DATA2JSON_LOGS
# DATA2JSON_PIDFILE
# DATA2JSON_RUN
# DATA_START_WAIT
# one per config setting, with dots converted to underscores
#
#usage="-e Usage: DATA2JSON\n\t
# [--config <conf-dir>] {start|stop|restart|status|version}\n\t
# [--version | version | -v]\n\t
# [--help | -help | help]"
usage="Usage: $PROGRAM { start | stop | restart | status | version | help }"
# if no args specified, show usage
function print_usage() {
if [ $# -le 1 ]; then
echo $usage
exit 1
fi
}
#设置环境
function setup_environment() {
_setup_calculated_paths
#_read_config
_setup_configurable_paths
}
# 设置HOME以及CONF目录
function _setup_calculated_paths() {
#echo "_setup_calculated_paths()"
if [[ -z "${DATA2JSON_HOME:-}" ]]; then
DATA2JSON_HOME="$(cd "$(dirname "$0")"/.. && pwd)"
fi
: "${DATA2JSON_CONF:="${DATA2JSON_HOME}/conf"}"
readonly DATA2JSON_HOME DATA2JSON_CONF
}
# Resolve a path relative to $DATA2JSON_HOME. Don't resolve if
# the path is absolute.
function resolve_path() {
orig_filename=$1
if [[ ${orig_filename} == /* ]]; then
filename="${orig_filename}"
else
filename="${DATA2JSON_HOME}/${orig_filename}"
fi
echo "${filename}"
}
# 读取配置文件
function _read_config() {
# - plain key-value pairs become environment variables
# - keys have '.' chars changed to '_'
# - keys of the form KEY.# (where # is a number) are concatenated into a single environment variable named KEY
parse_line() {
line="$1"
if [[ "${line}" =~ ^([^#\s][^=]+)=(.+)$ ]]; then
key="${BASH_REMATCH[1]//./_}"
value="${BASH_REMATCH[2]}"
#echo "${key}=${value}"
if [[ "${key}" =~ ^(.*)_([0-9]+)$ ]]; then
key="${BASH_REMATCH[1]}"
fi
if [[ "${!key:-}" ]]; then
export ${key}="${!key} ${value}"
#echo "if ${key}"
else
export ${key}="${value}"
#echo "else $key"
fi
fi
}
for file in "data2json.conf"; do
path="${DATA2JSON_CONF}/${file}"
echo $path
if [ -e "${path}" ]; then
while read line; do
parse_line "${line}"
done <"${path}"
fi
done
}
#function _setup_configurable_paths() {
# DATA2JSON_LIB=$(resolve_path "$DATA2JSON_HOME/lib")
## get log directory
# if [ "$DATA2JSON_LOGS" = "" ]; then
# export DATA2JSON_LOGS="$DATA2JSON_HOME/logs"
# fi
# if [ ! -w "$DATA2JSON_LOGS" ] ; then
# mkdir -p "$DATA2JSON_LOGS"
# chown $USER $DATA2JSON_LOGS
# fi
# DATA2JSON_LOGS=$(resolve_path "$DATA2JSON_HOME/logs")
## get run directory
# if [ "$DATA2JSON_RUN" = "" ]; then
# export DATA2JSON_RUN="$DATA2JSON_HOME/run"
# fi
# if [ ! -w "$DATA2JSON_RUN" ] ; then
# mkdir -p "$DATA2JSON_RUN"
# chown $USER $DATA2JSON_RUN
# fi
# DATA2JSON_RUN=$(resolve_path "$DATA2JSON_HOME/run")
#
# readonly DATA2JSON_DATA DATA2JSON_LIB DATA2JSON_LOGS DATA2JSON_RUN
#}
# 引入配置文件的设置
_setup_configurable_paths() {
DATA2JSON_LIB=$(resolve_path "${data2json_directories_lib:-lib}")
DATA2JSON_LOGS=$(resolve_path "${data2json_directories_logs:-logs}")
DATA2JSON_RUN=$(resolve_path "${data2json_directories_run:-run}")
readonly DATA2JSON_LIB DATA2JSON_LOGS DATA2JSON_RUN
}
function print_configurable_paths() {
cat <<EOF
Directories in use:
home: ${DATA2JSON_HOME}
config: ${DATA2JSON_CONF}
logs: ${DATA2JSON_LOGS}
run: ${DATA2JSON_RUN}
EOF
}
function print_path() {
echo "home: $DATA2JSON_HOME"
echo "conf: $DATA2JSON_CONF"
echo "lib: $DATA2JSON_LIB"
echo "logs: $DATA2JSON_LOGS"
echo "run: $DATA2JSON_RUN"
}
function check_status() {
if [ -e "${DATA2JSON_PIDFILE}" ] ; then
DATA2JSON_PID=$(cat "${DATA2JSON_PIDFILE}")
kill -0 "${DATA2JSON_PID}" 2>/dev/null || unset DATA2JSON_PID
fi
}
function check_limits() {
detect_os
#echo "detect_os"
if [ "${DIST_OS}" != "macosx" ] ; then
ALLOWED_OPEN_FILES="$(ulimit -n)"
#echo ${ALLOWED_OPEN_FILES}
#echo ${MIN_ALLOWED_OPEN_FILES}
if [ "${ALLOWED_OPEN_FILES}" -lt "${MIN_ALLOWED_OPEN_FILES}" ]; then
echo "WARNING: Max ${ALLOWED_OPEN_FILES} open files allowed, minimum of ${MIN_ALLOWED_OPEN_FILES} recommended."
fi
fi
}
function set_mainjar() {
if [ -f "$DATA2JSON_HOME/data2json/data2json.jar" ] ; then
MAIN_JAR="$DATA2JSON_HOME/data2json/data2json.jar"
else
echo "jarfile doesn't exist"
fi
}
function assemble_command_line() {
#retval=("${JAVA_CMD}" "-jar" "${JAVA_OPTS[@]}" "-Dfile.encoding=UTF-8" "${MAIN_JAR}" \
#"--home-dir=${DATA2JSON_HOME}" "--config-dir=${DATA2JSON_CONF}")
retval=("${JAVA_CMD}" "-jar" "-Dfile.encoding=UTF-8" "${MAIN_JAR}")
}
###################################
#(函数)判断程序是否已启动
#
#说明:
#使用JDK自带的JPS命令及grep命令组合,准确查找pid
#jps 加 l 参数,表示显示java的完整包路径
#使用awk,分割出pid ($1部分),及Java程序名称($2部分)
###################################
#初始化psid变量(全局)
psid=0
function checkpid() {
javaps=`ps -ef | grep data2json.jar | grep -v "grep"`
echo $javaps
if [ -n "$javaps" ]; then
psid=`echo $javaps | awk '{print $2}'`
else
psid=0
fi
}
# 启动程序
function do_start() {
check_status
if [[ "${DATA2JSON_PID:-}" ]] ; then
echo "DATA2JSON is already running (pid ${DATA2JSON_PID})."
exit 0
fi
echo "Starting DATA2JSON."
#check_limits
build_classpath
assemble_command_line
command_line=("${retval[@]}")
# 输出到日志文件
#nohup "${command_line[@]}">>"${DATA2JSON_LOG}" 2>&1 &
##nohup "${command_line[@]}">>"${DATA2JSON_LOG}" 2>&1 < /dev/null &
#显示该文件末尾10行的内容
#tailf ${DATA2JSON_LOG}
# 输出到终端
(${command_line[@]} &)
#echo "$!" >"${DATA2JSON_PIDFILE}"
checkpid
#echo $psid
echo $psid >${DATA2JSON_PIDFILE}
: "${DATA_START_WAIT:=5}"
end="$((SECONDS+DATA_START_WAIT))"
while true; do
check_status
if [[ "${DATA2JSON_PID:-}" ]]; then
break
fi
if [[ "${SECONDS}" -ge "${end}" ]]; then
echo "Unable to start. See ${DATA2JSON_LOG} for details."
rm "${DATA2JSON_PIDFILE}"
return 1
fi
sleep 1
done
#print_start_message
#echo "See ${DATA2JSON_LOG} for current status."
}
# 关闭程序
function do_stop() {
check_status
if [[ ! "${DATA2JSON_PID:-}" ]] ; then
echo "data2json not running"
[ -e "${DATA2JSON_PIDFILE}" ] && rm "${DATA2JSON_PIDFILE}"
return 0
else
echo -n "Stopping data2json."
SHUTDOWN_TIMEOUT=20
end="$((SECONDS+SHUTDOWN_TIMEOUT))"
while true; do
check_status
if [[ ! "${DATA2JSON_PID:-}" ]]; then
echo " stopped"
[ -e "${DATA2JSON_PIDFILE}" ] && rm "${DATA2JSON_PIDFILE}"
return 0
fi
kill "${DATA2JSON_PID}" 2>/dev/null || true
if [[ "${SECONDS}" -ge "${end}" ]]; then
echo " failed to stop"
echo "data2json (pid ${DATA2JSON_PID}) took more than ${SHUTDOWN_TIMEOUT} seconds to stop."
echo "Please see ${DATA2JSON_LOG} for details."
return 1
fi
echo -n "."
sleep 1
done
fi
}
function do_status() {
check_status
if [[ ! "${DATA2JSON_PID:-}" ]] ; then
echo "data2json is not running"
exit 3
else
echo "data2json is running at pid ${DATA2JSON_PID}"
fi
}
function do_version() {
echo "${DATA2JSON_VERSION}"
}
#function do_version() {
# build_classpath
#
# assemble_command_line
# command_line=("${retval[@]}" "--version")
# exec "${command_line[@]}"
#}
function main() {
#print_usage
setup_environment
#print_path
DATA2JSON_LOG="${DATA2JSON_LOGS}/data2json-$USER-$HOSTNAME.log"
DATA2JSON_PIDFILE="${DATA2JSON_RUN}/data2json.pid"
readonly DATA2JSON_LOG DATA2JSON_PIDFILE
setup_java_opts
check_java
set_mainjar
#echo "end set_mainjar"
case "${1:-}" in
start)
print_configurable_paths
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
status)
do_status
;;
version|--version|-v)
do_version
;;
help|--help|-help)
echo "Usage: ${PROGRAM} { start | stop | restart | status | version | help }"
;;
*)
echo >&2 "Usage: ${PROGRAM} { start | stop | restart | status | version | help }"
exit 1
;;
esac
}
#运行main函数
main "$@"
最后,运行,在命令行输入:
#启动,在data2json目录下
./data2json start
#关闭,在data2json目录下
./data2json stop