2014-11-04 115 views
1

我想从Java调用Perl脚本,但似乎我无法做到这一点。无法从Java调用Perl脚本

这是我的Perl脚本,它创建一个文件。这是一个简单的脚本。

use strict; 
use warnings; 
open(my $fh, '>', 'report.txt'); 
print $fh "My first report generated by perl\n"; 
close $fh; 
print "done\n"; 

这是我在上面调用Perl脚本的Java代码。

package perlfromjava; 

import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class PerlFromJava { 

public static void main(String[] args) { 
    try { 

     String command = "perl $HOME/Documents/hello.pl"; 
     System.out.println(command); 
     Process proc = Runtime.getRuntime().exec(command); 
    } catch (IOException ex) { 
     Logger.getLogger(PerlFromJava.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

} 

当我运行从命令一样,它是工作完美,但,当我从Java调用Perl脚本,不获取创建report.txt档Perl的纸条。

为什么会发生?

感谢

+0

您应经常检查'电话open'是是否成功:'开放的(我的$跳频, '>', 'REPORT.TXT')或死 “无法打开REPORT.TXT:$!”; '你也可以在你的Perl脚本的顶部添加'use autodie;'来自动执行这些检查。 – ThisSuitIsBlackNot 2014-11-04 20:47:13

+0

明白了。谢谢:)但是,当我从Java调用Perl脚本的问题,report.txt文件没有得到创建? – user3745870 2014-11-04 20:53:34

+0

可能。更新您的Perl脚本并重新运行您的Java代码以查看。如果它仍然不起作用,您至少排除了您的问题的一个可能的来源。如果'open'失败,'$!'变量会给出确切的原因。 – ThisSuitIsBlackNot 2014-11-04 20:56:20

回答

1

其实你的代码工作。但问题是perl的创建的文件在生成你文件。如果您使用的是IDE则文件肯定。如果你搜索“REPORT.TXT”你会发现file.to明白改变你的perl脚本

该项目文件夹内创建运行java

intead给report.txt给你完整的路径,你想在perl脚本中创建report.txt文件,并看到它的工作。

try { 

    String command = "perl C:\\Users\\Madhawa.se\\Desktop\\js\\mm.pl"; 
    Process process = Runtime.getRuntime().exec(command); 
    process.waitFor(); 
    if (process.exitValue() == 0) { 
     System.out.println("Command Successful"); 
    } else { 
     System.out.println("Command Failure"); 
    } 
} catch (Exception e) { 
    System.out.println("Exception: " + e.toString()); 
} 
1

无法从Java Runtime使用$ HOME变量。在Java中,你可以使用System.getenv("HOME")或跨平台System.getProperty(String)得到它,就像

String command = "perl " + System.getProperty("user.home") 
     + "/Documents/hello.pl"; 

可用System Properties列表包含在Java教程。

编辑

不要忘了等待Process完成,

try { 
    Process proc = Runtime.getRuntime().exec(command); 
    proc.waitFor(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+0

使用此仍不起作用 – user3745870 2014-11-04 21:30:07

+0

@ user3745870编辑添加'waitFor'。 – 2014-11-04 21:34:04