一、环境
操作系统:windows
java版本:1.8
php-java-bridge版本:7.2.1(最新版本)
服务器:nginx(用什么服务器应该不影响的)
二、操作
1、安装java:这个不用多说,网上很多教程,跟着操作安装和配置环境变量就可以了。
2、php环境:这个也有很多教程,相信如果需要看这个贴子的人,php环境是已经配置好了的。
3、解压php-java-bridge的压缩文件:
a.得到一个JavaBridge.war文件,将后缀改为jar
b.再解压刚刚的jar包,得到一个同名文件
c.JavaBridge\WEB-INF\lib刚刚解压得到的文件,这个文件路径找到JavaBridge.jar包,然后双击运行它。会启动一个监听端口,点击确定就会运行。在进程中可以看到
d.再将刚刚运行的JavaBridge.jar解压,得到同名文件夹JavaBridge。JavaBridge\META-INF将该文件夹路径下的java文件夹拷贝到php项目下。
e.运行下面一段代码,若有输出java的版本,当前时间等信息,则表示javabridge是正常运行的
<?php
require_once("java/Java.inc");
$system = new Java('java.lang.System');
$s = new Java("java.lang.String", "php-java-bridge config...<br><br>");
echo $s;
print 'Java version='.$system->getProperty('java.version').' <br>';
print 'Java vendor=' .$system->getProperty('java.vendor').' <br>';
print 'OS='.$system->getProperty('os.name').' '.
$system->getProperty('os.version').' on '.
$system->getProperty('os.arch').' <br>';
$formatter = new Java('java.text.SimpleDateFormat',
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
print $formatter->format(new Java('java.util.Date')).' <br>'.' <br>';
?>
运行结果:
三、引用java的包
1、在启动javabeidge时,会在同一个文件夹中生成一个同名的日志文件
打开日志文件,可以看到java.ext.dir的参数,后面的值是一个文件路径,就是放我们需要引用的jar包的地方。我的截图是null,之前我安装的是java15。后面重新装了java1.8就好了。这种问题没有太大的必要去纠结,不行换就好了,除非环境兼容的问题。
2、写一个简单的java类,然后打包,打包的命令也可以搜索到。如果报错“不是内部命令”的话,看一下classpath的设置有没有什么问题。
public class Test
{
private String name = "";
//setter and getter
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
//加法
public float add(float num1, float num2)
{
return num1 + num2;
}
}
3、将test.jar包放到对应的路径下面,重启一下javabridge。一定要重启,否则包不会生效。
<?php
require_once('java/Java.inc');
//下面是php调用自己编写的test.java的方法。
$test=new Java("test");
$test->setName("aaaaaaaaa");
echo $test->getName();
echo "bbb<br>";
?>
至此,大功告成
关于报错:
1、这种是包没有放对位置,或者放了包没有重启监听程序。我的理解是,当监听程序启动时,会去读取日志当中的路径下面的所有包。因为当监听程序打开后,我去删除包都删不掉,说的正在被使用。
2、这种是没有使用类的权限,可以看一下包本身的问题
Uncaught [[o:Exception]:"java.lang.Exception: Invoke failed: [[c:phpToJava]]->outPut([o:PhpParserString], [o:PhpParserString]). Cause:
php.java.bridge.util.NoSuchProcedureException: static outPut([o:PhpParserString],
[o:PhpParserString]). Candidates: [] VM: 1.8.0_181@http://java.oracle.com/" at: #-10
php.java.bridge.JavaBridge.checkM(JavaBridge.java:1109) #-9
php.java.bridge.JavaBridge.Invoke(JavaBridge.java:1048) #-8
php.java.bridge.parser.Request.handleRequest(Request.java:426) #-7
php.java.bridge.parser.Request.handleRequests(Request.java:509) #-6
php.java.bridge.JavaBridge.handleRequests(JavaBridge.java:173) #-5
php.java.bridge.http.JavaBridgeRunner.doPut(JavaBridgeRunner.java:203) #-4
php.java.bridge.http.HttpServer.service(HttpServer.java:289) #-3
php.java.bridge.http.HttpServer$Runner.run(HttpServer.java:205) #-2
php.java.bridge.util.ThreadPool$Delegate.run(ThreadPool.java:60) #-1
php.java.bridge.util.AppThreadPool$Delegate.run(AppThreadPool.java:58) #0
D:\zhubao\application\libraries\java\bridge\Java. in
D:\zhubao\application\libraries\java\bridge\Java.inc on line 223
虽然这个问题搞了一天多,网上有很多经验,眼睛已经看瞎。最后的结果是,平台给的那个java包根本就不能满足我们的需求,也就是说不用那个java包也行。我哭了。但是还是总结一下,如果有人需要就太好了。顺便也提醒自己,做事清前先看清楚,不要做了无用功。