2017-02-01 5 views
0

Я пытаюсь загрузить «Задачи» из .mpp-файла. Если я получить текущую дату, java.util.Date она работает очень хорошо, чтобы получить доступ к JAVA, но если я пытаюсь получить доступ к MPPReader я получаю ошибку:Включить .jar-файл в PHPJAVA Bridge

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: [email protected]://java.oracle.com/" at: 
    #-15 java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    #-14 java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
... 

Выходные данные показывают, что Java достижим. Но как я могу получить доступ к MPPReader?


Update

Сервер: 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'); 

?> 

Run 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: [email protected]://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

Глядя на вашу попытку загрузить mpxj-5.6.0.jar, я заметил, что вы пытались сделать его доступным для виртуальной машины Java на стороне клиента (PHP):

$mpxjPath = getcwd()."/libs/java/mpxj-5.6.0.jar"; 
exec("java -cp $mpxjPath"); 
require_once("libs/java/Java.inc"); 

Идея выглядит привлекательно, но, к сожалению, не могу работа так.


Помните Java-мост выполнен из двух частей, клиента (Java.inc/PHP) и сервер (PHPJavaBridge/Вообще сервлет). Поэтому, если вы хотите добавить библиотеку в путь к классам, это должно быть сделано на стороне сервера (доступно 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 

edit: replace /path/to/ in by the correct location of the jar.


Если вы работаете на Linux/Mac, посмотрите на проект pjbserver-tools. Он предоставляет php-обертку вокруг автономного сервера, где вы можете легко конфигурировать deps.

Просто держать в курсе о двух вещах:

  • режим Servlet (.war/кот) является путь, если вы собираетесь использовать его в производстве.Если вы не знаете, как это работает, см. Раздел pjb-starter-gradle, содержащий документацию.
  • старшеJava.inc не будет работать на PHP7 и поддержки не будет, вероятно, будет продолжение ... По крайней мере, потребуется время, чтобы рассмотреть с использованием переработанного клиента: soluble-japha. С ним может быть даже легче работать, но, конечно, как автор, я предвзятый. Проверьте себя;)

Примечания для сервлета кота:

Для сервлета кота установки, применяется тем же идеи. Просто убедитесь, что ваши .jar-файлы находятся в каталоге WEB-INF\lib. См. Также unoffical php-java-bridge fork, чтобы получить последний шаблон .war.

+0

ну, добавьте .jar-файл в путь к классам на сервере. но если я запустил страницу index.php, я получаю ту же ошибку «Исключено: java.lang.ClassNotFoundException: net.sf.mpxj.mpp.MPPReader'. –

+0

Так что это еще не сделано;) Можете ли вы обновить описание своей проблемы и включить в нее, как вы запустите сервер (используемая командная строка, если применимо), платформа (windows/unix) и уточните режим Tomcat/Servlet или StandAlone? Таким образом, я мог бы быть более точным в ответе ... слишком много догадываться прямо сейчас;) _ (может быть приятно также быть уверенным, что вы называете index.php, это ваш пример сценария? Просто чтобы быть уверенным) _ –

+0

Just сделал небольшое редактирование, чтобы включить путь для jar в команде. Ты можешь попробовать ? –