Shell执行/调用Java/Jar程序例子的实例详解

Shell执行/调用Java/Jar程序例子的实例详解

前言:

最近要写一个独立的Java程序去监控Hadoop和Oozie,通过Shell去调用.写代码到现在也4年多了,貌似就从来没在生产环境中写过一个独立的Java程序,不是部署到Tomcat就是直接丢给Hadoop.于是参考Hadoop等开源环境,自己写了一个demo,并且可以通过Ant打包生成可运行的程序.所以这里有三步:Java程序,Shell,Ant

     1.首先建立Java程序,由于是例子,所以这里很简单,只是输出传入参数的个数,

代码如下:


package com.guoyun.study.shell; 

public class ShellJavaAnt { 

  /**
   * @param args
   */
  public static void main(String[] args) {
    System.out.println("arguments length:"+args.length);
  } 

}

    2.Shell脚本

Shell代码

#!/bin/bash
#
PRG="${0}"
while [ -h "${PRG}" ]; do
 ls=`ls -ld "${PRG}"`
 link=`expr "$ls" : '.*-> \(.*\)$'`
 if expr "$link" : '/.*' > /dev/null; then
  PRG="$link"
 else
  PRG=`dirname "${PRG}"`/"$link"
 fi
done 

BASEDIR=`dirname ${PRG}`
BASEDIR=`cd ${BASEDIR}/..;pwd` 

if test -z ${JAVA_HOME}
then
  JAVA_BIN=java
else
  JAVA_BIN=${JAVA_HOME}/bin/java
fi 

CLASS_PATH=$BASEDIR/shell-run-java-by-ant-*.jar
SERVICE_CLASS="com.guoyun.study.shell.ShellJavaAnt" 

${JAVA_BIN} -cp $CLASS_PATH ${SERVICE_CLASS} "${@}" 

exit 0

  3.ANT

Xml代码

<project name="shell-run-java-by-ant" default="release-jar" basedir="."> 

 <property file="build.properties" /> 

 <property name="jar.name" value="shell-run-java-by-ant" />
 <property name="version" value="0.1" />
 <property name="package.name" value="${jar.name}-${version}" /> 

 <property name="build.dir" location="build" />
 <property name="build.cache.dir" location="${build.dir}/cache" />
 <property name="build.lib.dir" location="${build.dir}/lib" />
 <property name="javadoc.dir" location="javadoc" />
 <property name="dist.dir" location="dist" />
 <property name="dist.java.dir" location="${dist.jar}/java" />
 <property name="package.dir" location="${dist.dir}/${package.name}" />
 <property name="tar.file" location="${dist.dir}/${jar.name}-${version}.tar.gz" /> 

 <property name="src.dir" location="src" />
 <property name="java.src.dir" location="${src.dir}/java" />
 <property name="test.src.dir" location="${src.dir}/test" />
 <property name="classes.dir" location="${build.dir}/classes" />
 <property name="lib.dir" value="${basedir}/lib"/>
 <property name="script.dir" value="${basedir}/script"/> 

 <target name="release" description="sets properties for release builds.">
    <echo message="Building in release mode..."/>
    <property name="compile.mode" value="release"/>
    <property name="java.debug" value="false"/>
 </target> 

 <target name="init">
  <tstamp/>
  <mkdir dir="${build.dir}" />
  <mkdir dir="${classes.dir}" />
 </target> 

 <macrodef name="compile-source">
  <sequential>
  <javac srcdir="${java.src.dir}" destdir="${classes.dir}" debug="${java.debug}" debuglevel="lines,vars,source">
   <classpath>
    <fileset dir="lib">
     <include name="**/*.jar"/>
    </fileset>
   </classpath>
  </javac>
  </sequential>
 </macrodef> 

 <target name="compile" depends="init" description="compile the source">
  <compile-source />
 </target> 

 <target name="jar" depends="compile">
  <delete file="${build.dir}/${jar.name}-${version}.jar"/>
  <jar jarfile="${build.dir}/${jar.name}-${version}.jar">
   <fileset dir="${classes.dir}"/>
  </jar>
 </target> 

 <target name="package" depends="clean, jar">
  <mkdir dir="${package.dir}"/>
  <mkdir dir="${package.dir}/lib"/>
  <mkdir dir="${package.dir}/bin" /> 

  <copy todir="${package.dir}/lib" includeEmptyDirs="false">
   <fileset dir="${lib.dir}">
    <include name="**/*" />
   </fileset>
  </copy>
  <copy todir="${package.dir}">
   <fileset file="${build.dir}/${jar.name}-${version}.jar"/>
  </copy>
  <copy todir="${package.dir}/" file="build.xml"/>
  <copy todir="${package.dir}/bin" includeEmptyDirs="false">
      <fileset dir="${basedir}/script/shell">
        <include name="**/*" />
      </fileset>
  </copy> 

  <chmod file="${package.dir}/bin/*" perm="ugo+rx"/>
 </target> 

 <target name="tar" depends="package" description="Create release tarball">
  <tar compression="gzip" longfile="gnu" destfile="${tar.file}">
   <tarfileset dir="${package.dir}" mode="777" prefix="${package.name}">
    <exclude name="bin/*" />
    <exclude name="**/*.sh" />
    <include name="**" />
   </tarfileset>
   <tarfileset dir="${package.dir}" mode="777" prefix="${package.name}">
    <include name="**/*.sh" />
   </tarfileset>
  </tar>
  <delete dir="${package.dir}" />
 </target> 

 <target name="javadoc" depends="compile" description="generate documentation" >
  <delete dir="${javadoc.dir}" />
  <javadoc destdir="${javadoc.dir}">
   <fileset dir="${java.src.dir}" />
   <classpath>
    <fileset dir="${lib.dir}">
     <include name="**/*.jar"/>
    </fileset>
   </classpath>
  </javadoc>
 </target> 

 <target name="release-jar" description="Build release and jar" depends="release,jar"/> 

 <target name="clean" description="clean up">
  <delete dir="${build.dir}"/>
  <delete dir="${classes.dir}" />
  <delete dir="${dist.dir}"/>
 </target> 

</project>

由于比较简单,这里就不多做注释,完整例子,请见附件.使用的话,只要进入你的工程,运行ant package,便会将程序打包到$YOUR_PROJECT/dist目录下.之后进入该程序运行bin/shell-java-ant  a b c d e f g,就会得到arguments length:7
这样子的输出.

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • shell脚本运行java程序jar的方法

    在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本: #!/bin/sh export mypath=/root/project/wishnomal java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypat

  • Shell执行/调用Java/Jar程序例子的实例详解

    Shell执行/调用Java/Jar程序例子的实例详解 前言: 最近要写一个独立的Java程序去监控Hadoop和Oozie,通过Shell去调用.写代码到现在也4年多了,貌似就从来没在生产环境中写过一个独立的Java程序,不是部署到Tomcat就是直接丢给Hadoop.于是参考Hadoop等开源环境,自己写了一个demo,并且可以通过Ant打包生成可运行的程序.所以这里有三步:Java程序,Shell,Ant      1.首先建立Java程序,由于是例子,所以这里很简单,只是输出传入参数的个

  • java中Servlet程序下载文件实例详解

    对于一些普通的文件下载,想必大家都会去点击默认的链接进行资料获取.效率慢是一个方面,有时候下载的过程并不顺序.在学习了python中的一些程序后,我们可以选择使用Servlet进行文件的下载.下面我们先就Servlet进行简单的说明,然后带来有关的下载文件代码实例. 1.说明 Servlet是Sun公司开发的用于交互式地浏览和生成数据,生成动态Web的技术.狭义的Servlet是指Java语言实现的一个接口.但一般情况下,我们把实现了Servlet接口的Java程序叫做Servlet 2.使用s

  • java 中复合机制的实例详解

    java 中复合机制的实例详解 继承的缺陷 继承的缺陷是由它过于强大的功能所导致的.继承使得子类依赖于超类的实现,从这一点来说,就不符合封装的原则. 一旦超类随着版本的发布而有所变化,子类就有可能遭到破坏,即使它的代码完全没有改变. 为了说明的更加具体,假设我们现在程序中使用到了HashSet,我们需要增加一个功能,去统计这个HashSet自创建以来一共曾经添加过多少元素. 在还不知道继承的缺陷的情况下,我们设计了一个类,继承了HashSet,添加了一个属性addCount来进行统计,并且复写了

  • Java 中This用法的实例详解

     Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,Java提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.pr

  • Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别?    总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上编译成class文件,而javascript则直接在浏览器上加载运行. 2.由第一点可看出,java代码需要编译,而javascript不需要编译. 3.从语言性质来说,java是一种高级编程语言,对变量检查要求严格,javascript只是一个简单的解释性的脚本语言,对变量检查及要求很弱.

  • Java集合删除元素ArrayList实例详解

    Java集合删除元素ArrayList实例详解 AbstractCollection集合类中有一个remove方法,该方法为了适配多种不同的集合,允许删除空的元素,看这部分代码的时候产生了疑问,为什么这里直接用it.remove()就直接删除了? public boolean remove(Object o) { Iterator<E> it = iterator(); if (o==null) { while (it.hasNext()) { if (it.next()==null) { i

  • Java编程Retry重试机制实例详解

    本文研究的主要是Java编程Retry重试机制实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下 1.业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿到第一步结果或者捕捉异常,如果出现错误或异常实现重试上传逻辑,否则继续逻辑操作. 2.常规解决方案演化 1)try-catch-redo简单重试模式: 包装正

  • Java CAS底层实现原理实例详解

    这篇文章主要介绍了Java CAS底层实现原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.CAS(compareAndSwap)的概念 CAS,全称Compare And Swap(比较与交换),解决多线程并行情况下使用锁造成性能损耗的一种机制. CAS(V, A, B),V为内存地址.A为预期原值,B为新值.如果内存地址的值与预期原值相匹配,那么将该位置值更新为新值.否则,说明已经被其他线程更新,处理器不做任何操作:无论哪种情

  • JAVA类变量及类方法代码实例详解

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. public class C { public static void main(String[] args){ Child ch1 = new Child(12,"小小"

  • java中Spring Security的实例详解

    java中Spring Security的实例详解 spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案.并且可以很好与目前主流的认证框架(如CAS,中央授权系统)集成.使用spring security的初衷是解决不同用户登录不同应用程序的权限问题,说到权限包括两部分:认证和授权.认证是告诉系统你是谁,授权是指知道你是谁后是否有权限访问系统(授权后一般会在服务端创建一个token,之后用这个token进行后续行为的交互). spring

随机推荐