在 PHP 裡面跑 Java 的程式(*.jar) 或 Java 的 Library, 需要安裝 php-java-bridge.
安裝步驟
- 安裝 Java JDK/JRE
- 安裝 PHP / Apache 相關程式
- 安裝 php-java-bridge 所需的相依 package
- 設定 / 測試
到 PHP/Java Bridge 下載安裝檔: (下述兩個都需要下載)
- Linux Debian Packages - php-java-bridge-j2ee_5.2.2-1_all.deb
- Linux RedHat/Fedora source - php-java-bridge_5.2.2.tar.gz
要安裝 php-java-bridge-j2ee_5.2.2-1_all.deb 前, 若直接 dpkg -i php-java-bridge-j2ee_5.2.2-1_all.deb 安裝會出現下述: (然後就會出現很難移除 Package 的狀況)
dpkg:相依關系問題使得 php-java-bridge-j2ee 的設定工作不能繼續:
php-java-bridge-j2ee 相依於 sun-java6-jre﹔然而:
套件“sun-java6-jre”沒有安裝。
php-java-bridge-j2ee 相依於 tomcat5﹔然而:
套件“tomcat5”沒有安裝。
php-java-bridge-j2ee 相依於 liblucene-java﹔然而:
套件“liblucene-java”沒有安裝。
php-java-bridge-j2ee 相依於 libitext-java﹔然而:
套件“libitext-java”沒有安裝。
dpkg:處理 php-java-bridge-j2ee (--install)時出錯:
相依關系問題 - 仍未被設定
在處理時有錯誤發生:
php-java-bridge-j2ee
下列的套件驗證失敗! sun-java6-jre sun-java6-bin
若已經做此事, 可以參照此篇修復: Debian Linux deb 安裝失敗導致 Package 無法移除 解法
先來安裝 php-java-bridge-j2ee 所需的 Package
- vim /etc/apt/sources.list
deb http://www.backports.org/debian etch-backports main non-free # 加此行
- vim /etc/apt/preferences
# 避免更新系統時自動安裝了backports中的套件
# 只有打 "apt-get -t etch-backports install package_name" 才會安裝backports提供的版本
Package: *
Pin: release a=etch-backports
Pin-Priority: 999 - 增加 GPG Key: GPG error: http://www.backports.org etch-backports Release: 由於沒有公鑰,下列簽名無法進行驗證: NO_PUBKEY EA8E8B2116BA136C
# gpg --keyserver hkp://subkeys.pgp.net --recv-keys EA8E8B2116BA136C
# gpg --export | apt-key add -
或
wget http://www.backports.org/debian/archive.key
sudo apt-key add archive.key
rm -fr archive.key
安裝基本程式
- apt-get install apache2 php5 php-pear
安裝 java bridge 所需要相關 Package
- apt-get install tomcat5 liblucene-java libitext-java php5-dev re2c sun-java6-jre sun-java6-jdk
- ln -s /usr/lib/jvm/java-6-sun-1.6.0.07 /usr/local/java
安裝 php-java-bridge-j2ee Package
- dpkg -i php-java-bridge-j2ee_5.2.2-1_all.deb
產生 java.so for php extension 和 需要的 PHP Library
- tar zxvf php-java-bridge-5.2.2.tar.gz
- cd php-java-bridge-5.2.2
- phpize
- ./configure --with-java=/usr/local/java --disable-backend
- make # 產生 java.so, /home/jon/php-java-bridge-5.2.2/modules
- cp -r php-java-bridge-5.2.2/server/META-INF/java/ /usr/share/php/ # PHP 程式連接時, 需要的 JavaBridge.inc 於此.
設定 PHP java-servlet.ini
vim /etc/php5/conf.d/java-servlet.ini
[java]
;java.hosts = 127.0.0.1:8080 ; 原本這行的 8080 改成 8180
java.hosts = 127.0.0.1:8180
java.servlet = On ;; Off, On or User
java.java_home = /usr/local/java/bin/
java.log_level = 2
;java.class.path = /usr/lib/php5/20060613+lfs/
;java.library.path = /usr/lib/php5/20060613+lfs/:/usr/local/java/bin/
;java.java = /usr/local/java/bin/javaextension = java.so ; 再加上這行, 讓 PHP extension 載入 java.so
重新啟動
- /etc/init.d/tomcat5 restart
- /etc/init.d/apache2 restart
測試
- php -m | grep java # 會看到 java
- vim phpinfo.php
<?php
phpinfo(); // phpinfo 會看到如下的 Java 資訊
// java
// java support Enabled
// java bridge 5.2.2
// java server 127.0.0.1:8180
// java status running
?> - vim test-java-hello.php
<?php
require("java/JavaBridge.inc");
$str = new java("java.lang.String","hello");
echo $str; // 會看到 hello
?> - vim test-java-bridge.php
<?php
require("java/JavaBridge.inc"); // /usr/share/php/java/JavaBridge.inc// get instance of Java class java.lang.System in PHP
$system = new Java('java.lang.System');// demonstrate property access
echo 'Java version=' . $system->getProperty('java.version') . '<br />';
echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br />';
echo 'OS=' . $system->getProperty('os.name') . ' ' .
$system->getProperty('os.version') . ' on ' .
$system->getProperty('os.arch') . ' <br />';
// java.util.Date example
$formatter = new Java('java.text.SimpleDateFormat', "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
echo $formatter->format(new Java('java.util.Date'));
// 會看到:
// Java version=1.4.2
// Java vendor=Kaffe.org project
// OS=Linux 2.6.18-4-686 on i386
// 星期六, 九月 13, 2008 at 8:56:58 上午 GMT+08:00
?>
相關網頁
- PHP/Java Bridge - Installation Guides
- PHP/Java Bridge - Linux Installation Instructions
- 使用java servlet來跑JasperReports
- 不用java.so也能跑JasperReports
- JasperReports字型檔應該放在那裏?
註: PHP/Java Bridge 使用的檔案編碼都是 UTF-8, 若有特別的編碼, 要用: java_set_file_encoding("ISO-8859-1"); 來指定.
我按照上述方法實做
也出現了java的相關訊息
但卻在test-java-hello.php測試時
出現了下列訊息
Warning: fread() [function.fread]: Length parameter must be greater than 0 in /usr/share/php/java/Protocol.inc on line 328
protocol error: , Invalid document end at col 1. Check the back end log for OutOfMemoryErrors...
不知道大大有沒有解
Debian package 和 你 download 下來的 tar.gz 的版本都一致嗎??