手机技术交流

funabmol

2007年11月27日 #

关于Java包导入的一个奇怪问题(转贴至 孙鑫)

这篇文章起源于程序员之家论坛(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!");

    }

}

Step2:编写Hello.java,代码如下:

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也会被自动编译。

posted @ 2007-11-27 13:52 smart 阅读(336) | 评论 (1)编辑 收藏

2007年11月21日 #

Funambol DM 安装过程

 

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:     安装创建完成,可以到Mysqldata目录查看目前创建的数据库是否存在.

: 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,日后可能会产生一些莫名的错误)egc:"jboss4.2.1。同时在“环境变量设置”中设置名为JBOSS_HOME的环境变量,值为JBoss的安装路径,如:
JBOSS_HOME= c:"jboss4.2.1

J2EE_HOME= c:"jboss4.2.1

3:     拷贝mysql的驱动到jboss目录下,

       mysqljdbc驱动文件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:     若启动失败,可能由以下原因引起:

1JBoss所用的端口(8080109910988083等)被占用。一般情况下为8080端口被占用(例如,Oracle占用了8080端口),此时需要修改JBoss的端口,方法为进入JBoss安装目录"server"default"deploy"jboss-web.deployer目录,修改其下的server.xml目录,在此文件中搜索8080,将其改成你想要的端口即可(例如8088);

2JDK安装不正确;

3JBoss下载不完全。

: 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 Serversync4j DM Server在同一台机器上,使用127.0.0.1进行连接时,缺省情况下可以不设置口令。

B:    server-name中提供的URL必须填写当前安装的DM ServerInternet合法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 Serverdefault"config"common"properties" Funambol.properties中的参数, 内容如下:

server.uri=http://{your ip}:8080/funambol/dm

:   server.uri中提供的URL必须填写当前安装的DM ServerInternet合法IP地址,否则手机终端设备无法发起连接,无法完成DM配置信息的同步。

5:     运行Sync4j DM Server安装脚本

> cd funambol

> bin"install.cmd jboss32

BUILD SUCCESSFUL

Total time: 12 seconds

6:     检查MySQL中数据库表的创建情况

前面的安装步骤结束后将在MySQL Serverfunambol_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

注意: 所有的字符都是大小写敏感,所以上面红色字体一定按照实际情况的大小写进行组织.

posted @ 2007-11-21 10:08 smart 阅读(2936) | 评论 (1)编辑 收藏

仅列出标题  

My Links

Blog Stats

常用链接

留言簿(3)

随笔分类

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜