Archive for 三月, 2010

HelloWorld Java 2: Arguments & Signal

使用apache的commons.cli解析命令行参数
Java Code:

package test.helloworld.cmd;
// fallseir 2010-03-26
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class Cli {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GnuParser parser=new GnuParser();
		Options opts=getCmdOptions();
		CommandLine line=null;
		try {
			line=parser.parse(opts,args);
		} catch (ParseException e) {
			//e.printStackTrace();
			System.err.println(e.getMessage());
			HelpFormatter helper=new HelpFormatter();
			helper.printHelp("cmdLineSyntax", opts);
		}
		if(line==null) return ;
		if(line.hasOption("h")){
			HelpFormatter helper=new HelpFormatter();
			//helper.printHelp("cmdLineSyntax", opts);
			helper.printHelp(80, "tester", "header", opts, "footer");
			return;
		}
		boolean debug=false;
		if(line.hasOption("debug")){
			debug=true;
			System.out.println("debug is set");
		}
		if(line.hasOption("arg")){
			String arg=line.getOptionValue("arg");
			System.out.println("arg "+arg);
		}
	}

	private static Options getCmdOptions() {
		Options options=new Options();
		Option opt=OptionBuilder.create("debug");
		options.addOption(opt);
		opt=OptionBuilder.isRequired()
					.hasArg()
					.withArgName("arg")
					.withDescription("arg description")
					.withLongOpt("argument")
					.withValueSeparator()
					.create("arg");
		options.addOption(opt);
		options.addOption(new Option("h","help",false,"print help"));
		return options;
	}

}

Signal Shell下基于信号的应用通信
使用 sun.misc.Signal ,但 sun 已经提示Signal将在其后版本剥离
建议使用 socket 进行通信吧

package test.helloworld.cmd;
// fallseir 2010-03-26
import sun.misc.Signal;
import sun.misc.SignalHandler;

public class SignalHandle {
	public static void main(String args[]){
		System.out.println("start");
		SignalHandle cmd=new SignalHandle();
		if(cmd.isLinux()){
			cmd.installSignalHandler("QUIT");
			cmd.installSignalHandler("HUP");
			cmd.installSignalHandler("USR1");
			cmd.installSignalHandler("USR2");
			cmd.installSignalHandler("PIPE");
		}
		cmd.installSignalHandler("TERM");
		cmd.installSignalHandler("ABRT");
		cmd.installSignalHandler("INT");
		try{
			Thread.sleep(1000*10*10);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
	private void handleSignal(String signal){
		System.out.println("handleSignal "+signal);
	}
	private boolean isLinux() {
		return System.getProperty("os.name").indexOf("Linux")>=0;
	}
	private void installSignalHandler(String signal){
		System.out.println("installCheckSignal "+signal);
		SimpleSignalHandler shandler=new SimpleSignalHandler();
		try{
			SignalHandler old = Signal.handle( new Signal( signal ), shandler);
			shandler.setOld(old);
		}catch(Exception e){
			System.err.println("installShutdownSignal "+signal+" "+e);
		}
	}
	class SimpleSignalHandler implements SignalHandler{
		SignalHandler old=null;
		public SimpleSignalHandler() {
		}
		public void handle( Signal sig ) {
			try{
				System.out.println("Handle Signal "+sig.getName() );
				handSignal(sig);
				if( old != null && old != SIG_DFL && old != SIG_IGN ) {  //chain back to previous handler if one exists
					old.handle( sig );
				}
			}
			catch( Throwable t ) {
				System.out.println(String.format("ShutdownSignalHandler.handle %s : %s",sig.getName(),t.getMessage())+t);
			}
		}
		protected void handSignal(Signal sig) {
			handleSignal(sig.getName());
		}
		public void setOld(SignalHandler old){
			this.old=old;
		}
	}
}

HelloWorld Java 1: ShutdownHook & start/stop Script

Java 代码:

package test.helloworld.cmd;
// by fallseir 2010-03-26
public class ShutdownHook {
	public static void main(String args[]){
		System.out.println("start");
		ShutdownHook cmd=new ShutdownHook();
		cmd.installShutdownHook();
		try{
			Thread.sleep(1000*10*10);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
	private void shutdown(){
		System.out.println("shutdown");
	}
	private void installShutdownHook(){
		Runtime.getRuntime().addShutdownHook(new Thread(){
			public void run(){
				shutdown();
			}
		});
	}
}

sh 代码:

#!/bin/sh
# -----------------------------------------------------------------------------
# fallseir 2010-03-26
# Start/Stop Script for the test.helloworld.cmd.ShutdownHook system
# run.sh start|stop|check
#
base="."
lib="$base/lib"
log="$base/log"

app="run"
mainCls="test.helloworld.cmd.ShutdownHook"
pid="$app"".pid"

cp=""
#cp="$cp:$lib/log4j-1.2.13.jar"

cmd="java -cp $cp $mainCls $args"

ARG=$1
if [ "x$ARG" = "x" ] ; then
  ARG="start"
else
  shift
fi

if [ ! -d "$log" ] ; then
  mkdir "$log"
fi

if [ "$ARG" = "start" ] ; then
  AppErr="$log/$app.err"
  AppOut="$log/$app.out"
  # 备份历史日志
  if [ -f "$AppErr" ] ; then
    mv "$AppErr" "$AppErr".`date +%Y%m%d`"."$$
  fi
  if [ -f "$AppOut" ] ; then
    mv "$AppOut" "$AppOut".`date +%Y%m%d`"."$$
  fi
  # 在后台启动应用
  echo "$cmd $@ > $AppOut 2> $AppErr"
  $cmd "$@" > "$AppOut" 2> "$AppOut" &
  # 记录进程ID
  if [ ! -z "$pid" ] ; then
    echo $! > $pid
  fi
# 使用USR2 进行简单通信
#elif [ "$ARG" = "check" ] ; then
#  if [ ! -z "$pid" ]; then
#    echo "check: `cat $pid`"
#    kill -USR2 `cat $pid`
#  else
#    echo "Kill failed: \$pid not set"
#  fi
elif [ "$ARG" = "stop" ] ; then
  # kill 应用进程
  if [ ! -z "$pid" ]; then
    echo "Killing: `cat $pid`"
    kill -15 `cat $pid`
    rm $pid
  else
    echo "Kill failed: \$pid not set"
  fi
fi

AIR Helloworld 2 ,使用 Ant 脚本打包AIR程序

尝试多样化安装
== 安装并了解 Ant ==
Ant Helloworld
- http://blog.fallseir.com/2010/03/ant-helloworld/
== 配置 Air Ant 样例 ==
1、移动文件到项目指定的位置
2、配置build.xml
# 设置SDK_HOME 为安装的Air的路径
3、测试helloworld
> ant test
4、生成数字签名
> ant keystore
# 密码设置为 samplePassword
5、打包项目
> ant package
# 在控制台输入数字签名密码 samplePassword
# air安装包 在release目录中
——————————————-
build.xml 文件内容

<project>
    <!-- SDK properties -->
    <property name="SDK_HOME" value="D:\Program Files\Adobe\AdobeAIRSDK"/>
    <property name="ADL" value="${SDK_HOME}/bin/adl.exe"/>
    <property name="ADT.JAR" value="${SDK_HOME}/lib/adt.jar"/> 

    <!-- Project properties -->
    <property name="PROJ_ROOT_DIR" value="."/>
    <property name="APP_NAME" value="helloworld"/>
    <property name="APP_ROOT_DIR" value="${PROJ_ROOT_DIR}/src/html"/>
    <property name="APP_ROOT_FILE" value="${APP_NAME}.html"/>
    <property name="APP_DESCRIPTOR" value="${PROJ_ROOT_DIR}/${APP_NAME}-app.xml"/>
    <property name="AIR_NAME" value="${APP_NAME}.air"/>
    <property name="release"  location="${PROJ_ROOT_DIR}/release"/>
    <property name="assets"  location="${PROJ_ROOT_DIR}/src/assets"/>
    <property name="STORETYPE" value="pkcs12"/>
    <property name="KEYSTORE" value="sampleCert.p12"/> 

    <target name="init" depends="clean">
        <mkdir dir="${release}"/>
    </target> 

    <target name="test">
        <exec executable="${ADL}">
            <arg value="${APP_DESCRIPTOR}"/>
            <arg value="${APP_ROOT_DIR}"/>
        </exec>
    </target> 

    <target name="keystore" depends="init">
        <java jar="${ADT.JAR}" fork="true" failonerror="true">
            <arg value="-certificate"/>
            <arg value="-cn"/>
            <arg value="SelfSigned"/>
            <arg value="1024-RSA"/>
            <arg value="sampleCert.p12"/>
            <arg value="samplePassword"/>
        </java>
    </target> 

    <target name="package" depends="init">
        <java jar="${ADT.JAR}" fork="true" failonerror="true">
            <arg value="-package"/>
            <arg value="-storetype"/>
            <arg value="${STORETYPE}"/>
            <arg value="-keystore"/>
            <arg value="${KEYSTORE}"/>
            <arg value="${release}/${AIR_NAME}"/>
            <arg value="${APP_DESCRIPTOR}"/>
            <arg value="-C"/>
            <arg value="${APP_ROOT_DIR}"/>
            <arg value="${APP_ROOT_FILE}"/>
            <arg value="-C"/>
            <arg value="${assets}"/>
            <arg value="icons"/>
        </java>
    </target> 

    <target name="clean" description="clean up">
        <delete dir="${release}"/>
    </target> 

</project>

Ant Helloworld

使用Ant快速开始一个Helloworld程序

== 安装ant ==
1)、 下载最新版本的ant
2)、 安装ant
* 将ant安装包解压到安装目录
本文使用ant版本为 apache-ant-1.8.0
安装位置为 D:\Program Files\apache-ant-1.8.0
* 配置环境变量
添加变量 ANT_HOME = D:\Program Files\apache-ant-1.8.0
更新变量 PATH 在原有值后面添加 ;%ANT_HOME%\bin
* 测试
在命令行下输入 ant -v 查看ant版本
== 运行 Helloworld for java ==
* 编写 Helloworld.java
位置 E:\learn\ant\helloworld\src\oata\Helloworld.java

package oata;
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

* 编译并运行HelloWorld程序

# 创建目标路径
> mkdir \a build\classes
# 编译java源文件
> javac -sourcepath src -d build\classes src\oata\HelloWorld.java
# 执行helloworld程序
> java -cp build\classes oata.HelloWorld
# 构建 jar 文件
## 创建 jar 描述文件
> echo Main-Class: oata.HelloWorld>myManifest
## 打包jar文件
> mkdir build\jar
> jar cvfm build\jar\HelloWorld.jar myManifest -C build\classes .
## 通过jar 文件运行 helloworld 程序
> java -cp build\jar\HelloWorld.jar oata.HelloWorld

== 使用 ant 脚本 编译并执行 helloworld 程序 ==
- E:\learn\ant\helloworld\build.xml

<project>
    <target name="clean">
        <delete dir="build"/>
    </target>
    <target name="compile">
        <mkdir dir="build/classes"/>
        <javac srcdir="src" destdir="build/classes"/>
    </target>
    <target name="jar">
        <mkdir dir="build/jar"/>
        <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="oata.HelloWorld"/>
            </manifest>
        </jar>
    </target>
    <target name="run">
        <java jar="build/jar/HelloWorld.jar" fork="true"/>
    </target>
</project>

* 执行Ant脚本

# 执行ant脚本,编译打包并运行helloworld程序
> ant compile jar run
# 查看Ant项目中可用的Target
> ant -p

—————-
== 优化后的Ant脚本 ==

<project name="HelloWorld" basedir="." default="main">
    <property name="src.dir"     value="src"/>
    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>
    <property name="main-class"  value="oata.HelloWorld"/>
    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>
    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
    </target>
    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>
    <target name="run" depends="jar">
        <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
    </target>
    <target name="clean-build" depends="clean,jar"/>
    <target name="main" depends="clean,run"/>
</project>

参考:Hello World with Ant


AIR Helloworld

使用AIR快速开始一个Helloworld程序

关键步骤:
1、安装AIR环境
2、安装SDK
3、构建Helloworld项目
4、安装并测试Helloworld项目
==========================================
具体细节:
1、安装AIR环境
* 到Adobe下载AIR环境
* 安装AIR环境 ,本文使用的是 Adobe AIR 1.5.3.9130 版本
————————————————–
2、安装SDK
* 到Adobe下载SDK
* 将下载到的SDK包解压并放置到运行目录
本文下载的SDK版本为 adt version “1.5.3.9120″
本文SDK安装目录为 D:\Program Files\Adobe\AdobeAIRSDK
* 配置环境变量 将AIR SDK的工作路径添加到 PATH 变量中,(使adt和adl可以在任意目录以短路径方式启动)
PATH = [... 保持原有的PATH值不变];D:\Program Files\Adobe\AdobeAIRSDK\bin
————————————————–
3、构建Helloworld项目
* 创佳Helloworld项目
1)、创建Helloworld目录
本文全路径为 e:\learn\AIR\Helloworld
进入 Helloworld ,开始构建 helloworld 应用
除非明确说明 否则之后描述的文件和路径都是相对于此路径开始
2)、创建项目描述文件 HelloWorld-app.xml

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.5">
    <id>examples.html.HelloWorld</id>
    <version>0.1</version>
    <filename>HelloWorld</filename>
    <initialWindow>
        <content>HelloWorld.html</content>
        <visible>true</visible>
        <width>400</width>
        <height>200</height>
    </initialWindow>
</application>

3)、创建应用界面 HelloWorld.html

<html>
<head>
    <title>Hello World</title>
    <script type="text/javascript" src="AIRAliases.js"></script>
    <script type="text/javascript">
        function appLoad(){
            air.trace("Hello World");
        }
    </script> 

</head>
<body onLoad="appLoad()">
    <h1>Hello World</h1>
</body>
</html>

4)、测试应用
* 打开 cmd 并 cd 进入应用目录
* 运行命令 adl HelloWorld-app.xml
* > 系统将调用AIR运行时,启动一个400×200的窗口应用并呈现Helloworld字符
* > 系统在控制台输出 Hello World 字符
————————————————–
4、安装并测试Helloworld项目
1)、生成自签名证书和密钥对
* 运行命令 adt –certificate -cn SelfSigned 1024-RSA sampleCert.pfx samplePassword
* 系统将在当前目录生成密钥文件 sampleCert.pfx
2)、创建 AIR 安装文件
* 运行命令 adt -package -storetype pkcs12 -keystore sampleCert.pfx HelloWorld.air
HelloWorld-app.xml HelloWorld.html AIRAliases.js
* 根据系统提示输入密钥文件的密码 samplePassword
* 系统将根据 helloworld-app.xml 的描述生成AIR应用程序,并将helloworld.html 和 airaliases.js 当作附加资源嵌入AIR应用程序中
3)、安装 Helloworld 应用
* 双击 helloworld.air 或在命令行下执行 hellowrold.air 命令
* 系统调用本地的air运行时环境解释helloworld.air并开始应用安装
* 根据系统提示进行安装
4)、当安装完成后,通过双击helloworld的快捷方式或到安装目录打开helloworld.exe 即可运行helloworld应用
————————————————–
参考:
* 使用 AIR SDK 创建第一个基于 HTML 的 AIR 应用程序http://help.adobe.com/zh_CN/AIR/1.5/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7ecc.html
——————————————
资源:
* 使用 HTML 和 Ajax 开发 Adobe AIR 1.5 应用程序
* 针对 HTML 开发人员的 AIR 语言参考
* Flex 3.2 语言参考
* Adobe AIR 开发人员中心


Copyright © 1996-2010 飞扬轻狂's blog. All rights reserved.
iDream theme by Templates Next | Powered by WordPress