php调用java类文件

最近在折腾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");是等价的。

时间: 2024-10-10 01:59:51

php调用java类文件的相关文章

kettle中调用java类

有时需要在kettle调用java类,如:验证.查询或自定义加密等.有时甚至连基本的数据访问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应用程序中,手工使用自定义的java客户端访问是唯一的方法.本文介绍如何在kettle中调用java类.示例代码在这里下载. 注:如果你使用kettle4.0及以上版本,也你也可以使用user defined java class 步骤实现.   Modified Java ScriptValue 步骤 关键要在kettle中使用M

mybatis调用java类

在mybatis的映射xml文件调用java类的方法: 使用的是OGNL表达式,表达式格式为:${@[email protected](传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只是演示如何使用,随便用到了一个工具类 [sql] view plain copy SELECT * FROM USER WHERE name='${@[email protected](name)}' 2.获取类里面的常量,获取的格式和上面一样,第二个@是常量 : [sql] view plain 

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

Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发.随着对oracle的了解越来越多,越来越禁不住oracle的诱惑,oracle技术真的是一门很有趣的学问.之前,我在博客中总结了挺多有关SQL.PL/SQL的,但是对于oracle数据库中Java类的调用却没有总结,也是因为之前不太会,这会儿总

C#调用Java类

C#调用Java类 (2011-01-07 14:02:05) 转载▼   分类: Java学习  1. 在Eclipse中新建名称为hello的java project,此工程仅包含一个文件hello.java,具体代码如下: public class hello { public String GetString(String str)throws Exception {   try   {    return "您好!" + str;   }   catch(Exception

(转)在JSP中调用JAVA类和使用JavaBean有什么区别?

在JSP中调用JAVA类和使用JavaBean有什么区别? 可以像使用一般的类一样使用JavaBean,Bean只是一种特殊的类.特殊在可以通过<jsp:useBean   />调用JavaBean而其他类,可以和一般java中一样使用.  Bean的参数中还可以指定范围, <jsp:useBean  scope="application"   />该Bean在服务器的JVM中将只有一个实例. Bean是和WebServer相关的,不同的页面可以通过Bean 交

Oracle调用Java类开发的存储过程、函数的方法

oracle调用java类的基本步骤 1. 编写java代码,后续可以直接使用java代码,class文件或者jar包 2. 将写好的java代码导入到oracle数据库中,有两种方法:一种是使用loadjava命令:另一种是在编写PL/SQL的时候编写 3. 编写存储过程.函数 来封装java代码,以实现后面对java功能的调用 4. 调用写好的存储过程和oracle函数 loadjava命令介绍 有关loadJava的各个参数的意思,可以使用:loadjava -help 命令来获得详细帮助

Eclipse或MyEclipse没有在java类文件上显示Spring图标的问题

Eclipse或MyEclipse没有在java类文件上显示接口图标的问题解决办法: 前: 后:

java 类文件类型

我们所看到的Java字节码是被封装在一个类文件中(扩展名为.class).在这个教程中,就让我们来看看类文件的内部构造. 数据是如何被写入类文件以及类文件的格式是怎样的呢,让我们首先图解看一看Java类文件. Java类文件结构示意图:  上图描绘的Java类文件被分为了不同的区段,包括魔术码(magic).版本(version).常量池(constant pool).访问标识(access flags).(this)类.(super)类.接口(interfaces).域(fields).方法(

javap -- Java 类文件解析器

参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javap.html 功能说明:Java 类文件解析器. 语法:javap [ 命令选项 ] class. . . 补充说明: javap 命令用于解析类文件.其输出取决于所用的选项.若没有使用选项,javap 将输出传递给它的类的 public 域及方法.ja