从Flex为mac os执行Shell脚本

时间:2014-01-31 09:56:37

标签: java macos actionscript-3 shell flex

我在这里处理NativeProcess,特别是在mac os.So中的命令。我在我的应用程序的同一目录中有一个.sh文件。这个shell脚本我试图执行.jarfile(同样的目录) 。不知怎的,我正在做一些错误,这就是为什么它不起作用。

我的代码是下一个

    <?xml version="1.0" encoding="utf-8"?>
    <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                           xmlns:s="library://ns.adobe.com/flex/spark" 
                           xmlns:mx="library://ns.adobe.com/flex/mx"
                           creationComplete="init()">
        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <fx:Script>
            <![CDATA[
                import mx.controls.Alert;
                var process:NativeProcess;
                private function init():void
                {
                    if (NativeProcess.isSupported) 
                    {
                        Alert.show("suport native process.");
                             setupAndLaunch();
                    }
                }
                private function setupAndLaunch():void
                {
                 var cmdFile:File = File.applicationDirectory.resolvePath("InvokeJar.sh");
                 Alert.show(cmdFile.nativePath,".Sh File Path");
                 var processArgs:Vector.<String> = new Vector.<String>; 
                 processArgs.push('chmod -x "'+cmdFile.nativePath+'"');

                    var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                nativeProcessStartupInfo.arguments = processArgs;
                nativeProcessStartupInfo.executable = cmdFile;
                nativeProcessStartupInfo.workingDirectory = File.applicationDirectory;

                    process = new NativeProcess();
                    process.start(nativeProcessStartupInfo);
                    process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
                    process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
                    process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
                    process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
                    process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
                }

                public function onOutputData(event:ProgressEvent):void
                {
                    trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable)); 
                }

                public function onErrorData(event:ProgressEvent):void
                {
                    trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable)); 
                }

                public function onExit(event:NativeProcessExitEvent):void
                {
                    trace("Process exited with ", event.exitCode);
                }

                public function onIOError(event:IOErrorEvent):void
                {
                    trace(event.toString());
                }
            ]]>
        </fx:Script>
    </s:WindowedApplication>

接下来是shell脚本部分

java -jar Test.jar

当我在mac系统上测试这个应用程序时,app显示警告框(问候.sh文件路径),但接下来没有其他事情发生。

使用NativeProcesses时没有太多可走的路。如果您发现任何错误或错误,请告诉我。

谢谢

2 个答案:

答案 0 :(得分:0)

你有没有在这里试试,你有任何错误吗? http://forums.adobe.com/thread/721724

答案 1 :(得分:0)

这是可以正常使用的代码

    <?xml version="1.0" encoding="utf-8"?>
        <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                               xmlns:s="library://ns.adobe.com/flex/spark" 
                               xmlns:mx="library://ns.adobe.com/flex/mx"
                               creationComplete="init()">
            <fx:Declarations>
                <!-- Place non-visual elements (e.g., services, value objects) here -->
            </fx:Declarations>
            <fx:Script>
                <![CDATA[
                    import mx.controls.Alert;
                    var process:NativeProcess;
                    private function init():void
                    {
                        if (NativeProcess.isSupported) 
                        {
                            Alert.show("suport native process.");
                                 setupAndLaunch();
                        }
                    }
                    private function setupAndLaunch():void
                    {
                     var shFilePath:String= File.applicationDirectory.resolvePath('invokeJAR.sh').nativePath;
                        Alert.show(shFilePath,".Sh File Path");
                        var cmdFile:File=new File('/bin/bash');
                        var processArgs:Vector.<String>= new Vector.<String>;
                        processArgs.push('-c');         
                        processArgs.push('bash invokeJAR.sh');
                        var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                    nativeProcessStartupInfo.arguments = processArgs;
                    nativeProcessStartupInfo.executable = cmdFile;
                    nativeProcessStartupInfo.workingDirectory = File.applicationDirectory;

                        process = new NativeProcess();
                        process.start(nativeProcessStartupInfo);
                        process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
                        process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
                        process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
                        process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
                        process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
              try
                {
                    process.start(nativeProcessStartupInfo);
                }
                catch(e:Error)
                {
                    Alert.show(e.message,"startup Error");
                }
                    }

                    public function onOutputData(event:ProgressEvent):void
                    {
                        trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable)); 
                    }

                    public function onErrorData(event:ProgressEvent):void
                    {
                        trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable)); 
                    }

                    public function onExit(event:NativeProcessExitEvent):void
                    {
                        trace("Process exited with ", event.exitCode);
                    }

                    public function onIOError(event:IOErrorEvent):void
                    {
                        trace(event.toString());
                    }
                ]]>
            </fx:Script>
        </s:WindowedApplication>