我尝试从.mpp-File加载“任务”。
如果我按java.util.Date
获取当前日期,则可以正常访问JAVA
,但如果我尝试访问MPPReader,则会收到错误消息:
CreateInstance failed: new net.sf.mpxj.mpp.MPPReader. Cause: java.lang.ClassNotFoundException
这是我的测试用例的代码。
define("JAVA_SERVLET", false);
define("JAVA_HOSTS", 9267);
$mpxjPath = getcwd()."/libs/java/mpxj-5.6.0.jar";
exec("java -cp $mpxjPath");
require_once("libs/java/Java.inc");
$date = new java('java.util.Date');
echo $date;
$project = new java('net.sf.mpxj.mpp.MPPReader');
这是浏览器中的输出
Wed Feb 01 08:53:43 CET 2017
Fatal error: Uncaught [[o:Exception]:"java.lang.Exception: CreateInstance failed: new net.sf.mpxj.mpp.MPPReader. Cause: java.lang.ClassNotFoundException: net.sf.mpxj.mpp.MPPReader VM: 1.7.0_55@http://java.oracle.com/" at:
#-15 java.net.URLClassLoader$1.run(URLClassLoader.java:366)
#-14 java.net.URLClassLoader$1.run(URLClassLoader.java:355)
...
输出显示java可以访问。但是我如何访问MPPReader?
更新
服务器:CentOS 7
这是我index.php
目前的代码。
<?php
define("JAVA_HOSTS", 9267);
define("JAVA_SERVLET", false);
require_once("libs/java/Java.inc");
echo "<pre>";
$date = new java('java.util.Date');
echo $date;
$project = new java('net.sf.mpxj.mpp.MPPReader');
?>
在Standalone
CentOS 7
命令
java -cp "ext/JavaBridge.jar:libs/java/mpxj-5.6.0.jar" php.java.bridge.Standalone SERVLET:9267
这是错误。
Thu Feb 02 07:11:45 CET 2017PHP Fatal error: Uncaught [[o:Exception]:"java.lang.Exception: CreateInstance failed: new java.net.sf.mpxj.mpp.MPPReader. Cause: java.lang.ClassNotFoundException: java.net.sf.mpxj.mpp.MPPReader VM: 1.7.0_55@http://java.oracle.com/" at:
#-15 java.net.URLClassLoader$1.run(URLClassLoader.java:366)
#-14 java.net.URLClassLoader$1.run(URLClassLoader.java:355)
#-13 java.security.AccessController.doPrivileged(Native Method)
#-12 java.net.URLClassLoader.findClass(URLClassLoader.java:354)
#-11 java.lang.ClassLoader.loadClass(ClassLoader.java:425)
#-10 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
#-9 java.lang.ClassLoader.loadClass(ClassLoader.java:358)
#-8 java.lang.Class.forName0(Native Method)
#-7 java.lang.Class.forName(Class.java:270)
#-6 php.java.bridge.Util.classForName(Util.java:1518)
#-5 php.java.bridge.JavaBridge.CreateObject(JavaBridge.java:445)
#-4 php.java.bridge.Request.handleRequest(Request.java:458)
#-3 php.java.bridge.Request.handleRequests(Request.java:500)
#-2 php.java.bridge.http.ContextRunner.run(Co in http://127.0.0.1:9267/JavaBridge/java/Java.inc on line 195
答案 0 :(得分:0)
看看你试图加载mpxj-5.6.0.jar
,我注意到你试图从客户端(PHP)将它提供给JVM:
$mpxjPath = getcwd()."/libs/java/mpxj-5.6.0.jar";
exec("java -cp $mpxjPath");
require_once("libs/java/Java.inc");
这个想法看起来很吸引人,但遗憾的是不能这样做。
请记住,java-bridge由两部分组成,客户端(Java.inc / PHP)和服务器(PHPJavaBridge /通常是servlet)。因此,如果要将类库添加到类路径中,则必须在服务器端(可供JVM使用)完成。
从您的代码示例(define("JAVA_SERVLET", false)
),我假设您没有通过Tomcat / servlet env启动桥接,而是使用独立服务器。在这种情况下,您必须在启动服务器时在类路径上添加*.jar
。
你最终会做类似这样的事情来启动服务器:
$ java -cp "./JavaBridge.jar:/path/to/mpxj-5.6.0.jar" php.java.bridge.Standalone SERVLET:9267
编辑:用jar的正确位置替换/ path / to / in。
如果您正在Linux / Mac上工作,请查看pjbserver-tools项目。它为独立服务器提供了一个php-wrapper,您可以在其中轻松配置deps。
请注意以下两点:
Java.inc
在PHP7上运行并且支持不会被继续...至少需要时间考虑使用重新设计的客户端:soluble-japha。使用它可能更容易,但当然,作为作者,我有偏见。自己检查;)servlet tomcat的注意事项:
对于servlet tomcat安装,同样的想法适用。只需确保您的.jar文件存在于WEB-INF\lib
目录中。另请参阅unoffical php-java-bridge fork以获取最新的.war模板。