从Flex调用jar文件命令

时间:2014-01-23 09:59:09

标签: java actionscript-3 flex

我正在尝试从AIR app调用.jar文件。我们可以通过NativeProcess执行此操作。我的代码是下一个

<?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 nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
                var file:File = File.userDirectory.resolvePath("xyz.jar");

                nativeProcessStartupInfo.executable = file;

                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>

在调试时,它会抛出以下错误

Error: Error #3219: The NativeProcess could not be started. '%1 is not a valid Win32 application.

Plz帮助我。

1 个答案:

答案 0 :(得分:2)

通常我们不能直接运行JAR文件所以在这里我们运行命令提示符。然后找到cmd.exe路径然后只需按照下面的代码就可以了。它只适用于Windows,如果想要运行MacOS然后执行shell脚本(.sh)。

确保您需要在应用程序描述符XML文件中添加<supportedProfiles>extendedDesktop desktop</supportedProfiles>

还要确保在环境变量中分配java类路径。

<?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;
            private var process:NativeProcess;
            private function init():void
            {
                if (NativeProcess.isSupported) 
                {
                    Alert.show("suport native process.");
                    setupAndLaunch();
                }
            }
            private function setupAndLaunch():void
            {
                var cmdFile:File = new File("c:\\Windows\\System32\\cmd.exe");

                var processArgs:Vector.<String> = new Vector.<String>;               
                processArgs.push("/c"); //Note here
                processArgs.push("java -jar xyz.jar");              

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

                process = new NativeProcess();              
                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);

                process.start(nativeProcessStartupInfo);
            }

            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>