使用php-java-brigde与JAVA通信
前些天因为要开发有关网银的应用,签名一定要用java的API,花了点时间研究。
环境
- Centos 6.5
实施过程:
运行java需要安装JDK,这个步骤本文省略,请自行安装
1.下载php-java-brigde应用包
- 地址:http://osdn.jp/projects/sfnet_php-java-bridge/releases/
- 本文应用版本:php-java-bridge_6.2.1_documentation.zip
2.解压php-java-brigde
- 解压出 documentation、JavaBridge.war 两个文件(夹)
- 命令:unzip php-java-bridge_6.2.1_documentation.zip
- 根据文档:documentation/README 中的描述执行以下命令
- 命令:java -classpath JavaBridge.war TestInstallation
- 经上面命令后,从javabridge.war中得出以下文件:
php-java
├── documentation
├── ext
├── java
├── JavaBridge.war
├── RESULT.html
└── test.php
- 经上面命令后,从javabridge.war中得出以下文件:
- 命令:java -classpath JavaBridge.war TestInstallation
3.启动JavaBridge.jar
- 如何启动javaBridge.jar呢?:
- 使用: java -jar ext/JavaBridge.jar –h 查看帮助,得知启动方式
- Example 1: java -jar JavaBridge.jar
- Example 2: java -jar JavaBridge.jar HTTP_LOCAL:8080 3 JavaBridge.log
- Example 3: java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=YOURPASSWD -jar JavaBridge.jar HTTPS:8443 3 JavaBridge.log
- 使用: java -jar ext/JavaBridge.jar –h 查看帮助,得知启动方式
- 本文参考Example 2 来启动:
- java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log
- 如需后台运行请在命令后加 “&”:
- java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log &
4.准备完毕,测试是否成功
vim test.php
require_once './java/Java.inc';
$javaObj = new Java('java.lang.System');
var_dump($javaObj);
只要正常打印出对象就说明已经链接成功了!
5.调用自定义的jar包
创建一个java文件Demo.java
/*一个简单的测试*/
class Demo
{
// 返回两数和
public int test(int num1,int num2)
{
return num1+num2;
}
}
编译Demo.java和打包成jar
- 编译:
- javac Demo.java
- 生成 Demo.class
- 打包成jar
- jar -cvf /usr/java/packages/lib/ext/Demo.jar Demo.class
- jar -cvf [目标] [源]
- 为什么上面的目标位置是/usr/java/packages/lib/ext/? 在启动JavaBridge.jar时会显示如下信息:
- 标黑的那一行会告诉你,自定义的jar包该放在哪个位置
l@y:/home/www/html/php-java$ java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log
java.io.FileNotFoundException: /var/log/JavaBridge.log (权限不够)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(FileOutputStream.java:221)
at java.io.FileOutputStream.(FileOutputStream.java:110)
at php.java.bridge.Util.redirectJavaOutput(Util.java:1320)
at php.java.bridge.Util.redirectOutput(Util.java:1314)
at php.java.bridge.JavaBridge.initLog(JavaBridge.java:264)
at php.java.bridge.Standalone.checkServlet(Standalone.java:206)
at php.java.bridge.Standalone.init(Standalone.java:172)
at php.java.bridge.Standalone.main(Standalone.java:302)
Aug 20 02:34:22 JavaBridge INFO : VM : 1.7.0_79@http://java.oracle.com/
Aug 20 02:34:22 JavaBridge INFO : JavaBridge version : 6.2.1
Aug 20 02:34:22 JavaBridge INFO : logFile : /var/log/JavaBridge.log
Aug 20 02:34:22 JavaBridge INFO : default logLevel : 3
Aug 20 02:34:22 JavaBridge INFO : socket : SERVLET_LOCAL:8080
Aug 20 02:34:22 JavaBridge INFO : java.ext.dirs : /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext:/usr/java/packages/lib/ext
Aug 20 02:34:22 JavaBridge INFO : php.java.bridge.base: /home/l
Aug 20 02:34:22 JavaBridge INFO : thread pool size : 20
Aug 20 02:34:22 JavaBridge INFO : JavaBridgeRunner started on port INET_LOCAL:8080
调用刚刚写好的方法
——注:当新增自定义jar包到扩展目录时,请重新启动JavaBridge
vim test.php
require_once './java/Java.inc';
$javaObj = new Java('Demo'); //创建Demo实例
echo $javaObj->test(3,5); //求两数之和
结果输出:8
这样我们就完成了一次PHP JAVA的简单通信,深入研究请看documentaction/README 或查阅更多资料