0

我尝试从 .mpp 文件加载“任务”。如果我得到当前日期,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
4

1 回答 1

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

编辑:将 /path/to/ 替换为 jar 的正确位置。


如果您在 Linux/Mac 上工作,请查看pjbserver-tools项目。它在独立服务器周围提供了一个 php-wrapper,您可以在其中轻松配置 deps。

只需注意两点:

  • 如果您打算在生产中使用 Servlet 模式 (.war/tomcat),则可以选择。如果您不确定它是如何工作的,请参阅包含文档的pjb-starter-gradle 。
  • 旧的 Java.inc将无法在 PHP7 上运行,并且可能不会继续提供支持......至少需要时间考虑使用重新设计的客户端:可溶性japha。使用它甚至可能更容易,但当然,作为作者,我有偏见。检查自己;)

servlet tomcat 的注意事项:

对于 servlet tomcat 安装,同样的想法也适用。只需确保您的 .jar 文件存在于WEB-INF\lib目录中即可。另请参阅非官方的 php-java-bridge fork以获取最新的 .war 模板。

于 2017-02-01T11:10:43.823 回答