這篇文章起源于程序員之家論壇(http://www.sunxin.org)上的一個網友的提問,我對他的問題做了回答。具體網址:http://www.sunxin.org/bbs/dispbbs.asp?boardID=6&ID=12289&page=1
我感覺這個問題的答案對Java的初學者來說,會有一定的幫助,所以將問題和答案整理成文。
問題
首先新建一個目錄存放Java源文件,或者直接在某個盤符下放置程序,例如:D:",然后按照下面的步驟進行實驗(本實驗在D:"目錄下操作)。
Step1:編寫程序World.java,代碼如下:
package a;
public class World
{
public World()
{
System.out.println(", World!");
}
}
import a.World;
public class Hello
{
public static void main(String[] args)
{
System.out.print("Hello");
World world = new World();
}
Step3:將兩個程序保存到你所建的目錄下,在這里,我們將它們保存到D:"下。
Step4:編譯這兩個Java源文件
先編譯World.java,執行javac -d . World.java,在D盤生成目錄a,及其中的World.class。接下來編譯Hello.java,執行javac Hello.java,在D盤上生成Hello.class。
Step5:運行Hello類
執行java Hello,輸出Hello, World!目前一切正常。
Step6:修改Hello.java
將第1行的語句“import a.World;”改為“import a.*;”,重新編譯Hello.java,出現下面的錯誤提示:
錯誤的類文件: ."World.java
文件不包含類 World
請刪除該文件或確保該文件位于正確的類路徑子目錄中。
World world = new World();
Step7:根據錯誤提示進行下列操作
按照錯誤提示,刪除 World.java 或者將 World.java 放到其他地方,則程序成功編譯運行。
問題:
請問為何會出現Step6中的錯誤呢?使用 “import a.*;”導入a下所有類和接口,和使用“import a.World;”導入a包中具體的類,為何會產生上述的差異呢?
回答
當你導入一個包中所有的類時,javac在編譯時并不確定你要使用的World類是a包中的類,還是其他包中的類,它會根據你機器上的CLASSPATH環境變量的值去查找類,通常我們在CLASSPATH中會設置一個點(.),表示當前目錄,如果沒有CLASSPATH環境變量,那么在JDK1.4之后,默認也是查找當前目錄。javac在按照文件名(不包括后綴)來查找類,于是找到World.java,而這個文件根本不是字節碼文件,當然就報錯了。當你導入一個具體的類時,javac在分析源文件時就知道了你程序中用的類是a.World,那么它就在CLASSPATH環境變量下查找a目錄下的World類,正好有,于是正確執行。
為了幫助讀者對這個問題加深理解,我給大家設計了下面的操作步驟(本文是在D盤上操作):
(1)將a目錄剪切到C:"下;
(2)再次執行javac Hello.java,你會看到同樣的錯誤。也就是證實了在出錯之前,javac還沒有去查找a包中的類(對于包是否存在的驗證已經進行)。
(3)執行set classpath=c:"。由于你明確地設置了CLASSPATH環境變量的值,并且沒有包含點(.),因此javac不會再查找當前的目錄。
(4)再次執行javac Hello.java,你會發現成功執行。
這里面還有一個有趣的現象,如果我們將a目錄下的World.class刪除,替換為World.java,那么在編譯Hello.java時,World也會被自動編譯。
Funambol DM 安裝過程
Funambol安裝過程包括了Java環境安裝,Mysql安裝,Jboss安裝和Funambol DM的安裝.一: Java環境安裝
1: Java現在使用的版本是:jdk-1_5_0-windows-i586.exe.
2: 安裝完畢,請在windows系統下設置環境變量JAVA_HOME={jdk的安裝目錄}
如: JAVA_HOME=C:"Java"jdk1.5.0
二: Mysql安裝
1: Mysal使用的版本是: mysql-5.0.22-win32.zip
2: 安裝完畢,要進行數據庫的創建
3: 在MySQL 中創建funambol Database
運行如下命令為DM Server創建Database和相關的授權用戶funambol
mysql > create database funambol_db;
mysql > grant all on funambol_db.* to 'funambol'@'localhost' identified by 'funambol';
4: 檢查創建的MySQL funambol 用戶權限
運行如下命令檢查在MySQL中創建的用戶funambol是否對funambol _db數據庫具備訪問權限:
> mysql -u funambol
mysql > use funambol_db;
Database changed
5: 安裝創建完成,可以到Mysql的data目錄查看目前創建的數據庫是否存在.
三: Jboss安裝
1: Jboss使用版本為:jboss-4.2.1.GA。
下載地址:
http://sourceforge.net/project/showfiles.php?group_id=22866&package_id=16942&release_id=523619
2: 在如上的下載頁中下載JBoss-4.2.1.GA.zip文件。
下載完成后,將其解壓縮后即可完成安裝,解壓縮后將其放置到一個不帶空格的目錄(若目錄帶有空格,例如:C:"Program Files,日后可能會產生一些莫名的錯誤),eg:c:"jboss4.2.1。同時在“環境變量設置”中設置名為JBOSS_HOME的環境變量,值為JBoss的安裝路徑,如:
JBOSS_HOME= c:"jboss4.2.1
J2EE_HOME= c:"jboss4.2.1
3: 拷貝mysql的驅動到jboss目錄下,
將mysql的jdbc驅動文件mysql-connector-java-3.1.12-bin.jar拷貝到c:" JBoss4.2.1"
MySQLJDBC下(如果沒有請自行創建),并在“環境變量設置”設置
JBOSS_CLASSPATH=c:" JBoss4.2.1"MySQLJDBC"mysql-connector-java-3.1.12-bin.jar
在此,JBoss的安裝工作已經結束,
5: 修改run.bat文件
將:
rem Add -server to the JVM options, if supported
"%JAVA%" -version 2>&1 | findstr /I hotspot > nul
if not errorlevel == 1 (set JAVA_OPTS=%JAVA_OPTS% -server)
改為
rem Add -server to the JVM options, if supported
rem "%JAVA%" -version 2>&1 | findstr /I hotspot > nul
rem if not errorlevel == 1 (set JAVA_OPTS=%JAVA_OPTS% -server)
4: 測試安裝是否成功:
運行JBoss安裝目錄"bin"run.bat,如果窗口中沒有出現異常,且出現:10:16:19,765 INFO [Server] JBoss (MX MicroKernel) [4.2.1.GA (build: SVNTag=JBoss_4_2_1_GA date=200707131605)] Started in 30s:828ms字樣,則表示安裝成功。
5: 訪問JBOSS
我們可以通過訪問:http://localhost:8080進入JBoss的歡迎界面,點擊JBoss Management下的JMX Console可進入JBoss的控制臺。
6: 若啟動失敗,可能由以下原因引起:
1)JBoss所用的端口(8080,1099,1098,8083等)被占用。一般情況下為8080端口被占用(例如,Oracle占用了8080端口),此時需要修改JBoss的端口,方法為進入JBoss安裝目錄"server"default"deploy"jboss-web.deployer目錄,修改其下的server.xml目錄,在此文件中搜索8080,將其改成你想要的端口即可(例如8088);
2)JDK安裝不正確;
3)JBoss下載不完全。
四: Funambol DM安裝
1: Funambol 使用的版本是: funambol-dm-server-3.5.2
下載地址:
http://www.funambol.com/opensource/downloads.html
2: 下載Sync4J DM Server后直接解壓縮即可。具體的地址可以是C:"funambol
3: 修改DM 的install.properties中的數據庫連接參數。
文件路徑為Sync4J DM Server的根目錄下,即install.properties。所需修改的內容如下:
server-name=http://{your ip}:8080/funambol/dm
dbms=mysql
jdbc.classpath=C:/jboss-4.2.1/MySQLJDBC/mysql-connector-java-3.1.12-bin.jar
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1/funambol_db?zeroDateTimeBehavior=round
jdbc.user=funambol
jdbc.password=funambol
注意:
A: 如果使用MySQL,并且MySQL Server與sync4j DM Server在同一臺機器上,使用127.0.0.1進行連接時,缺省情況下可以不設置口令。
B: server-name中提供的URL必須填寫當前安裝的DM Server的Internet合法IP地址,否則手機終端設備無法發起連接,無法完成DM配置信息的同步。
C:使用MySQL時必須設定jdbc.url的參數zeroDateTimeBehavior=round,否則在運行DM時將出現如下錯誤信息:
Error Executing Database Query.
Value '0000-00-00' can not be represented as java.sql.Timestamp
詳細原因參見:http://dev.mysql.com/doc/refman/5.0/en/cj-upgrading.html
4: 修改DM Server的default"config"common"properties" Funambol.properties中的參數, 內容如下:
server.uri=http://{your ip}:8080/funambol/dm
注: server.uri中提供的URL必須填寫當前安裝的DM Server的Internet合法IP地址,否則手機終端設備無法發起連接,無法完成DM配置信息的同步。
5: 運行Sync4j DM Server安裝腳本
> cd funambol
> bin"install.cmd jboss32
BUILD SUCCESSFUL
Total time: 12 seconds
6: 檢查MySQL中數據庫表的創建情況
前面的安裝步驟結束后將在MySQL Server的funambol_db中創建相關的表,本步驟對其進行檢查。方法如下:
> mysql -u funambol
mysql > use funambol_db;
mysql > show tables;
+----------------------------------------+
| Tables_in_sync4jdm_db |
+----------------------------------------+
| fnbl_device |
| fnbl_dm_state |
| fnbl_id |
| fnbl_principal |
| fnbl_role |
| fnbl_treediscovery_processor |
| fnbl_user |
| fnbl_user_dm_demo |
| fnbl_user_role |
+----------------------------------------+
9 rows in set (0.00 sec)
7: 啟動Sync4j DM Server
當安裝成功后,系統會自動在bin目錄下生成start.cmd/sh文件.
> cd funambol
> bin"start.cmd
注意: 所有的字符都是大小寫敏感,所以上面紅色字體一定按照實際情況的大小寫進行組織.