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包
参考我的博客 Eclipse用Runnable JAR file方式打jar包,并用该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 "$")"
#echo $PROGRAM #获取该文件的路径
bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin"; pwd` # get arguments 获取参数
command=$
#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[@]}" >& | 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
fi if ! ("${version_command[@]}" >& | 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
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
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 ]; then
echo $usage
exit
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=$
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