最近在折騰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 = On 2 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");是等價的。