2017-02-01 136 views
0

我嘗試從.mpp文件中加載「任務」。 如果我得到java.util.Date它的工作原理很細的當前日期,訪問JAVA,但如果我嘗試訪問MPPReader我得到的錯誤:在PHPJAVA橋中包含.jar文件

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?


更新

服務器: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'); 

?> 

運行上CentOS 7

java -cp "ext/JavaBridge.jar:libs/java/mpxj-5.6.0.jar" php.java.bridge.Standalone SERVLET:9267 

Standalone此命令是錯誤。

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,我注意到你試圖從客戶端(PHP)將其提供給JVM:

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

的想法看起來吸引人,但遺憾的是不能這樣工作。


記住java的橋由兩個部分組成,客戶端(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 

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


如果你在Linux/Mac的工作,看看在pjbserver-tools項目。它提供了繞着獨立服務器,您可以輕鬆地配置DEPS一個php-包裝。

只要保持知道兩件事情:

  • Servlet的模式(的.war/Tomcat)的是,如果你打算在生產中使用它要走的路。如果您不確定其工作原理,請參閱包含說明文件的pjb-starter-gradle
  • 年長Java.inc不會在PHP7和支持運行不會可能繼續......至少使用重新設計的客戶端需要時間來考慮soluble-japha。使用它可能會更容易,但當然,作爲作者,我是有偏見的。檢查自己;)

注意事項的servlet的Tomcat:

對於servlet的Tomcat的安裝,同樣的想法適用。只要確保您的.jar文件存在於WEB-INF\lib目錄中。請參閱unoffical php-java-bridge fork以獲取最新的.war模板。

+0

好吧,將.jar-File添加到服務器中的類路徑中。但如果我運行index.php頁面,我收到相同的錯誤'發生異常:java.lang.ClassNotFoundException:net.sf.mpxj.mpp.MPPReader'。 –

+0

因此它還沒有製作;)你能否更新你的問題描述,包括你如何啓動服務器(命令行如果適用),平臺(windows/unix)以及澄清模式Tomcat/Servlet或StandAlone?這樣,我可能會更準確地回答...現在太多的猜測了;)_(可以很好地確定您稱爲index.php,它是您的腳本示例嗎?只是爲了確定)_ –

+0

做了一個小的編輯,在命令中包含jar的路徑。你能試一下嗎 ? –