【问题标题】:invoke the jar file command from Flex从 Flex 调用 jar 文件命令
【发布时间】:2014-01-23 09:59:08
【问题描述】:

我正在尝试从 AIR 应用程序调用 .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.

请帮帮我。

【问题讨论】:

    标签: java actionscript-3 apache-flex


    【解决方案1】:

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

    确保您需要在应用程序描述符 XML 文件中添加 &lt;supportedProfiles&gt;extendedDesktop desktop&lt;/supportedProfiles&gt;

    还要确保在环境变量中分配了 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>
    

    【讨论】:

    • jaganath,感谢您的回复。它工作得很好,但据我所知,我想知道您为什么使用 processArgs.push("/c") 作为参数?
    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2010-10-31
    • 2012-06-29
    • 2011-05-08
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多