最近在折腾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文件,设置这两个值处于开启状态:

 allow_url_fopen = On
allow_url_include = On(这个属性可能要添加)

一般的测试例子都会类似这样:

 <?php
require_once("http://localhost:8080/JavaBridge/java/Java.inc");
$system = new Java( 'java.lang.System' );
java_set_file_encoding("UTF-8"); //设置编码格式,避免出现乱码
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>' ;
$te = $system->getProperties();
echo $te;
?>

该例子如果运行成功会输出java的版本号以及一系列系统常量,这说明至少php调用java预定义的系统类以及没有问题了,结果会类似这样(截图只是截取了一部分):

要调用自定义的类,比如Test类,其源代码为:

 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;
}
}

需要使用打包命令,将编译好的Test.class文件打包成Test.jar文件,放在java安装目录F:\javaSetup\jre8\lib\ext下发,JavaBridge.jar文件不需要同时放入,原因可能是在Java.inc中有引用关系,在程序中通过java函数创建类的实例$test=new Java(‘Test’);,之后就可以像java一样调用其中的方法了,如下:

 $test=new Java("Test");
$test->setName("哈哈,PHP调用JAVA的方法!");
echo "调用类Test的getName方法,返回值为:".$test->getName()."<br>";
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包,此时会弹出一个选择框,一般选择默认的就可以(需要注意端口问题,避免被占用),运行以下代码,一般是没问题的:

 <?php
require_once("java/Java.inc");//引入java.inc文件 $system = new Java( 'java.lang.System' );
java_set_file_encoding("UTF-8"); //设置编码格式,避免出现乱码
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>' ;
$te = $system->getProperties();
echo $te;
?>

若成功,说明此时调用java系统类是可以的。

要调用自定义的java类,仍然以前面的Test.java为例,将其打包成Test.jar,放入F:\javaSetup\jre8\lib\ext(java安装目录)下,若JavaBridge.jar已经开始运行,需要重新启动,然后像下面这样调用即可:

 $test=new Java("Test");
$test->setName("哈哈,PHP调用JAVA的方法!");
echo "调用类Test的getName方法,返回值为:".$test->getName()."<br>";
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类文件的更多相关文章

  1. Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法

    在模板文件的表达式中,可以使用“${T(全限定类名).方法名(参数)}”这种格式来调用Java类的静态方法. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1. ...

  2. 如何在Mybatis的xml文件调用java类的方法

    在mybatis的映射xml文件调用java类的方法:使用的是OGNL表达式,表达式格式为:${@prefix@methodName(传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只是 ...

  3. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  4. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  5. C#调用Java类

    C#调用Java类 (2011-01-07 14:02:05) 转载▼   分类: Java学习  1. 在Eclipse中新建名称为hello的java project,此工程仅包含一个文件hell ...

  6. kettle中调用java类

    kettle中调用java类 有时须要在kettle调用java类,如:验证.查询或自己定义加密等.有时甚至连主要的数据訪问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应 ...

  7. Flex与Java交互(Flex调用java类展示数据)解析xml展示数据

    Flex与java通信最简单例子(详细说明了各种需要注意的配置):http://blog.csdn.net/u010011052/article/details/9116869 Flex与java通信 ...

  8. Matlab调用Java类

    第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: >> disp(java.lang.System.getPr ...

  9. loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试

    调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...

随机推荐

  1. mysql 时间戳按指定格式(Y-m-d)取出

    之前做采集脚本,把采集的时间按unix时间戳的形式取出    那么在写sql语句的时候,需要按时间查询相应的记录,页面传进来的$time 是'2014-01'之类的字符串,那么怎么写sql呢 $sql ...

  2. spring下配置dbcp,c3p0,proxool[转]

    不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不但可以通过JNDI获取应用 ...

  3. css3渐变详解

    今天总结渐变的问题,渐变分为线性渐变.径向渐变.呼呼,废话少说, 线性渐变:background:linear-gradient(设置渐变形式,第一个颜色起点,中间颜色点 中间颜色的位置,结束点颜色) ...

  4. Yii在nginx下多目录rewrite

    开发过程中,在root下有多个程序,采用一个域名,以目录的形式访问,可以采用如下的方法进行url重写: rewrite ^(\/[^\/]+)(.*) $1/index.php$2 last; 意为取 ...

  5. FMDB用法

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  6. 【STM32】用DMA实现多路ADC通道数据采集

    今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的 ...

  7. C语言的本质(24)——C标准库之输入与输出(下)

    4.读写二进制文件 C语言还提供了用于整块数据的读写函数.可用来读写一组数据,如一个数组元素,一个结构变量的值等. 读数据块函数调用的一般形式为: fread(buffer,size,count,fp ...

  8. HDU1181 变形课 (回溯法)

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submis ...

  9. CentOS bridge br0 kvm libvirt-xml

    1,kvm bridge br0配置文件内容实例: ifcfg-em1配置文件内容Example: DEVICE=em1 Bridge=br0 TYPE=Ethernet onboot=yes NM_ ...

  10. 让app在ios6上具有ios7的扁平效果

    使用cocoapods在工程中加入UI7Kit,关于UI7Kit请自行google. 加入到工程 如果没安装cocoapods,则安装.(http://www.cocoapods.org) 安装方法: ...