php調用java類檔案

來源:互聯網
上載者:User

標籤:

      最近在折騰php調用java類,網上查閱資料,最終選用JavaBridge,遇到的第一個問題是java_require() 函數引入自訂java打包而成的jar檔案,在新版本的JavaBridge中,該函數已被廢棄,使用會出錯。

網上搜尋的資料,大致有兩種方法,親測可行;

方法一

      從http://php-java-bridge.sourceforge.net/pjb/index.php下載php-java-bridge_6.2.1的war包,將其中的將war包放在tomcat的應用程式目錄webapps下,啟動tomcat,會自動解析出一個同名的檔案夾,其中的JavaBridge.jar和Java.inc是需要用到的。

      在程式中,一定要記得引入該Java.inc檔案,格式是require_once(“http://localhost:8080/JavaBridge/java/Java.inc”);注意,由於此時Tomcat已經運行,因而可以使用HTTP的方式請求,但是預設情況下php是不支援來自非本機伺服器的連結,所以需要修改php.ini檔案,設定這兩個值處於開啟狀態:

1 allow_url_fopen = On2 allow_url_include = On(這個屬性可能要添加)

      一般的測試例子都會類似這樣:

 1 <?php 2 require_once("http://localhost:8080/JavaBridge/java/Java.inc"); 3 $system  =  new  Java( ‘java.lang.System‘ ); 4 java_set_file_encoding("UTF-8");   //設定編碼格式,避免出現亂碼 5 print  ‘Java version=‘ . $system ->getProperty( ‘java.version‘ ). ‘ <br>‘ ;   6 print  ‘Java vendor=‘  . $system ->getProperty( ‘java.vendor‘ ). ‘ <br>‘ ;   7 print  ‘OS=‘ . $system ->getProperty( ‘os.name‘ ). ‘ ‘ .   8 $system ->getProperty( ‘os.version‘ ). ‘ on ‘ .   9 $system ->getProperty( ‘os.arch‘ ). ‘ <br>‘ ;  10 $te = $system->getProperties();11  echo $te;12 ?>

      該例子如果運行成功會輸出java的版本號碼以及一系列系統常量,這說明至少php調用java預定義的系統類別以及沒有問題了,結果會類似這樣(只是截取了一部分):

 

      要調用自訂的類,比如Test類,其原始碼為:

 1 public class Test 2 { 3     private String name = ""; 4  5     //setter and getter 6     public void setName(String name) 7     { 8         this.name = name; 9     }10 11     public String getName()12     {13         return this.name;14     }15 16     //加法17     public float add(float num1, float num2)18     {19         return num1 + num2;20     }21 }

      需要使用打包命令,將編譯好的Test.class檔案打包成Test.jar檔案,放在java安裝目錄F:\javaSetup\jre8\lib\ext下發,JavaBridge.jar檔案不需要同時放入,原因可能是在Java.inc中有參考關聯性,在程式中通過java函數建立類的執行個體$test=new Java(‘Test’);,之後就可以像java一樣調用其中的方法了,如下:

1 $test=new Java("Test");2 $test->setName("哈哈,PHP調用JAVA的方法!");3 echo "調用類Test的getName方法,傳回值為:".$test->getName()."<br>";4 echo "調用Test的add方法,傳回值為:".$test->add(11.2, 15.7)."<br>";

方法二

      第二種方法不需要整個war包,只需要其中的JavaBridge.jar和Java.inc,首先仍然需要引入Java.inc檔案,理論上放在哪裡都可以,只要路徑正確。然後在命令列切換到JavaBridge.jar的路徑,通過start javaw -jar JavaBridge.jar運行該jar包,此時會彈出一個選擇框,一般選擇預設的就可以(需要注意連接埠問題,避免被佔用),運行以下代碼,一般是沒問題的:

 1 <?php 2 require_once("java/Java.inc");//引入java.inc檔案 3 $system  =  new  Java( ‘java.lang.System‘ ); 4 java_set_file_encoding("UTF-8");   //設定編碼格式,避免出現亂碼 5 print  ‘Java version=‘ . $system ->getProperty( ‘java.version‘ ). ‘ <br>‘ ;   6 print  ‘Java vendor=‘  . $system ->getProperty( ‘java.vendor‘ ). ‘ <br>‘ ;   7 print  ‘OS=‘ . $system ->getProperty( ‘os.name‘ ). ‘ ‘ .   8 $system ->getProperty( ‘os.version‘ ). ‘ on ‘ .   9 $system ->getProperty( ‘os.arch‘ ). ‘ <br>‘ ;  10 $te = $system->getProperties();11  echo $te;12 ?>

若成功,說明此時調用java系統類別是可以的。

要調用自訂的java類,仍然以前面的Test.java為例,將其打包成Test.jar,放入F:\javaSetup\jre8\lib\ext(java安裝目錄)下,若JavaBridge.jar已經開始運行,需要重新啟動,然後像下面這樣調用即可:

1 $test=new Java("Test");2 $test->setName("哈哈,PHP調用JAVA的方法!");3 echo "調用類Test的getName方法,傳回值為:".$test->getName()."<br>";4 echo "調用Test的add方法,傳回值為:".$test->add(11.2, 15.7)."<br>";

      這裡有一個現象需要注意,在調用java系統類別輸出系統變數時,第一種方法的輸出明顯比第二種方法多很多。

      可能的問題:

      1.單檔案jar包的引用或許不會有大問題,然而如果需要許多自訂的jar可能會出問題

      2.在不啟動tomcat的情況下,是否依然可以呢???

      實驗證明,在第一種方式的情況下,這樣是不可以的,會出現如下錯誤,該錯誤與第二種方式不啟用JavaBridge.jar的錯誤是一樣的,這說明運行tomcat的時候,會附帶運行該jar檔案。 

      不過在引入Java.inc檔案時,該inc檔案可以不用放在tomcat的webapps下,理論上該檔案放在任何地方都可以:即

      require_once("http://localhost:8080/JavaBridge/java/Java.inc");和require_once("java/Java.inc");是等價的。

php調用java類檔案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.