2014-11-04 104 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