正 文:

 

有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法,一般飘易推荐的做法是采用php-java-bridge做桥接,本文就来介绍一下大致的实现方法。

先简单说下php-java-bridge做桥接的实现原理

先打开java的一个监听端口,php调用java的时候,将对应的方法调用转发到java的指定端口,由java执行后再将结果返回给php。这种模式是一种比较典型的代理模式,php在这里成为了一个代理转发器,把java的类调用转发给后端的java执行。

我们再来看看具体的流程

1、下载二进制的 JavaBridge.jar包、java/Java.inc库文件,下载地址:http://php-java-bridge.sourceforge.net/pjb/download.php

注意,当前最新版本是PHP/Java Bridge 6.2.1,但是这个版本也是2010-10-31更新的,现在都2016年了,都过去6年了,从这个更新日期来看,源码编译安装的方式只适合在此日期之前发布的PHP版本,比如PHP 5.3.3发布日期是2010-7-22,但是保守估计,源码编译安装的方式仅适合PHP 5.2以及更低的PHP版本,不适合PHP 5.3/PHP 5.4/PHP 5.5/PHP 5.6/PHP 7这些高版本的PHP了,源码编译最高只支持到PHP5.2。飘易这里不采用源码安装的方式,直接使用二进制包打开监听端口就可以了。

2、linux下安装java环境,具体安装方法就不说了,搜索下;飘易使用的是java-1.7,留意下环境配置:

文件 /etc/profile 末尾添加:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

然后,source /etc/profile 使之立即生效。

PS: 如何找到java安装路径呢?

3、将JAVA的jar包文件放置在java的库位置 $JAVA_HOME/jre/lib/ext/,如

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/lib/ext/app-security.jar

4、在JavaBridge.jar所在目录运行命令(先cd到所在目录)

java -jar JavaBridge.jar SERVLET_LOCAL:8081 &

(加&是让其在后台运行)

或者直接带上日志等级

java -jar JavaBridge.jar SERVLET:8081 3 JavaBridge.log &

执行后,我们使用命令netstat -nltp,发现linux已经开启了一个8081端口开始监听:

PS:如果需要开机启用,配置:

/etc/rc.local 添加开机启动

java -jar JavaBridge.jar所在绝对路径 SERVLET_LOCAL:8081 &

5、在web目录下放置 Java.inc文件,编写php测试代码 test.php

<?php header( 'Content-Type: text/html; charset=UTF-8' );

define("JAVA_DEBUG", true); //调试设置
define("JAVA_HOSTS", "127.0.0.1:8081"); //设置javabridge监听端口
/*0: Log nothing, not even fatal errors.
  1: Log fatal system errors such as "out of memory error".
  2: Log java exceptions.*/
define("JAVA_LOG_LEVEL", 2); //java.log_level: 0-6 require_once "Java.inc"; //php调用java的接口,与该脚本位于同一目录
java_set_file_encoding("UTF-8"); //设置JAVA编码。 try {
  /* invoke java.lang.System.getProperties() */
  $props = java("java.lang.System")->getProperties();
  
  /* convert the result object into a PHP array */
  $array = java_values($props);
  foreach($array as $k=>$v) {
    echo "$k=>$v"; echo "<br>\n";
  }
  echo "<br>\n";
  
  /* create a PHP class which implements the Java toString() method */
  class MyClass {
    function toString() { return "hello PHP from Java!"; }
  }
  
  /* create a Java object from the PHP object */
  $javaObject = java_closure(new MyClass());
  echo "PHP says that Java says: "; echo $javaObject;  echo "<br>\n";
  echo "<br>\n";   echo java("php.java.bridge.Util")->VERSION; echo "<br>\n"; } catch (JavaException $ex) {
  echo "An exception occured: "; echo $ex; echo "<br>\n";
}

6、PHP如何调用自己编写的java类呢?

$Des3 = new Java("com.ksoft.security.Des3"); //实例
try{    
    echo $Des3->encode('88290801', $key);
    echo "<hr>";
    echo $Des3->decode('S2JFP23v0zM=', $key);
}
catch(Exception $e) {
    echo($e);
}

【一些注意事项】:

关于PHP-Java-Bridge的各种函数使用:

1、高版本的java_require不再使用,也无法使用,由于放到java虚拟机下面,则不需要再手动引入包文件。

2、java_value()用于获取值,而且必须使用该函数获取值。

(特别注意:如果该值需要存入数据库,那么必须使用该java_value函数,不然会报错,或者无法存入数据库)

3、java_inspect()对实例化或者方法进行print_r类似的输出。

(注:请不要直接使用var_dump这样的输出方法输出java的类、方法、变量,需要使用java_inspect或者java_value,例如:var_dump(java_inspect($abc)))

4、实例化使用 $test = new Java("Test")的方式,如果实例化的方法中存在参数,可以这样new Java("Test","pram")

提醒

1、务必确保对java.inc的引用,确保引用正确

2、务必确保对jar包放在能引用的地方,比如java虚拟机jre下面

3、在PHP中调用Java使用PHP的的写法即可

【参考】:

1、PHP-Java-Bridge使用笔记

2、PHP-Java-Bridge的使用(平安银行支付功能专版)

3、使用php-java-bridge让PHP5支持java

4、Linux下配置php-java-bridge

 引用自 http://www.piaoyi.org/php/php-java-bridge-jar-class.html

PHP通过php-java-bridge调用JAVA的jar包里class类的更多相关文章

  1. 27 Java动态加载第三方jar包中的类

    我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String pr ...

  2. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  3. Java 操作jar包工具类以及如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  4. Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  5. jar包里查找指定的class文件,排查是否存在或重复,工具软件:Java Class Finder

    jar包里查找指定的class文件,排查是否存在或重复,工具软件:Java Class Finder 1,下载工具地址:www.idesksoft.com/classfinder.html,如图: 2 ...

  6. Intellij IDEA下导出Java工程的可运行JAR包

    Intellij IDEA下导出Java工程的可运行JAR包 昨天一直向导出一个Java工程的可运行JAR包,然后查阅网上的资料以及自己一遍一遍的尝试,均以失败告终.可以导出JAR包,但是导出的JAR ...

  7. 【原创】Java基础之简单修改jar包中的class

    有时需要修改很多jar(假设这些jar都位于lib目录)中其中一个jar中的某一个类,而且又没有原始代码或ide,这时最简单的方式是: 1 进入lib目录 # cd lib # ls test.jar ...

  8. Java项目生成可执行jar包、exe文件以及在Windows下的安装文件

    1.如何通过eclipse将Java项目生成可执行jar包 首先把在eclipse下的java项目导出jar file 下一步 下一步 下一步 最后点击完成,便生成了可执行的jar文件.可以在刚刚选择 ...

  9. java eclipse导出可运行jar包(java服务)和导入

    java   eclipse导出可运行jar包(java服务)和导入 二.导出可运行包步骤: 1.选择要导出的项目:  2.右键项目-单击export:  3.选择导出类型:(Runnable JAR ...

随机推荐

  1. vue添加滚动事件,解决简书Carol_笑一笑方案中vue移除滚动事件失效的问题

    在写项目的时候,遇到了需要添加滚动事件的问题,在简书Carol_笑一笑这里找到了解决方案.代码如下 <script> export default { name:"vue-scr ...

  2. lamp的动静分离部署

    一.lamp分离部署工作图 二.LAMP的安装与配置 1.环境准备 2.对 PHP 服务器进行部署 #以下为安装PHP及其依赖 [root@php ~ ]# .tar.gz -C /usr/src [ ...

  3. Linux下ping: unknown host www.baidu.com的解决办法

    如果ping域名的时候出现ping:unknown host  xxx.xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好, 查看一下配置文件/etc/resolv.conf ...

  4. mysql对数据的操作

    增: insert into 表名(字段,字段,字段) values(值,值,值): insert into 表名 values(值,值,值): insert into 表名 set 字段=值, 字段 ...

  5. JAVA实验报告及第八周总结

    JAVA第八周作业 实验报告六 实验一 编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常.在ca ...

  6. Docker 运行hello world

    Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world docker run ubuntu:15.10 /bin/echo ...

  7. 对pdf 表单域 或文本框的操作---动态填充PDF 文件内容

    前提:需要pdf模板:并且模板内容以pdf 文本框的形式填写 package com.test;import java.io.File;import java.io.FileOutputStream; ...

  8. navicat 使用 pymysql模块

    新健库 ,新增字段+类型+约束 设计表:外键(自增) 新建查询 建立表模型 /* 数据导入: Navicat Premium Data Transfer Source Server : localho ...

  9. 使用 ASP.NET Core 的 gRPC 服务

    将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...

  10. DisableThreadLibraryCalls与DLLMain死锁

    1.首先写个简单的DLL,用来验证 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserve ...