Java 类路径

Java 类路径告诉 java 解释器和 javac 编译器去哪里找它们要执行或导入的类。类(您可能注意到的那些 *.class 文件)可以存储在目录或 jar 文件中,或者存储在两者的组合中,但是只有在它们位于类路径中的某个地方时,Java 编译器或解释器才可以找到它们。

在 Windows® 中,类路径中的多个项是用分号分隔( ;)的,而在 UNIX® 中,这些项是用冒号分隔( :)的。在以下实例中,类路径中包括两个 Cloudscape jar 文件( cs.jarcstools.jar ),以及一个存储 *.class 文件的目录位置( myDevDir ):

Windows 类路径:
            c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar;c:\myPath\myDevDir
            UNIX 类路径:
            /Cloudscape_10.0/lib/cs.jar:/Cloudscape_10.0/lib/cstools.jar:/myPath/myDevDir
            

本文中的其余实例使用的都是 Windows 语法,因此,如果您是在 UNIX 机器上,那么需要对语法进行相应的调整。





回页首


Cloudscape 类路径

Cloudscape 类路径允许您在数据库本身中存储 jar 文件。

在 Cloudscape 10.0 中, sqlj.install_jar() 过程在数据库中安装了一个 jar 文件,而且 SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY 过程设置了 cloudscape.database.classpath 属性。Cloudscape 首先在 Java 类路径中查找类,然后在数据库类路径中进行查找。

我们提及 Cloudscape 类路径是为了让您知道该功能,但是接下来,本文将重点关注 Java 类路径。





回页首


设置 Java 类路径

有三种方式设置 Java 类路径:

  • 永久地,通过在系统级上设置 CLASSPATH 环境变量来实现。
  • 临时地,通过在命令窗口或 shell 中设置 CLASSPATH 环境变量来实现。
  • 在运行时进行,每次启动 Java 应用程序和 JVM,都要指定类路径。

下面的小节中包含以各种方式来设置类路径的实例,并且都假定您已经将 CLOUDSCAPE_INSTALL 环境变量设置为 Cloudscape 的安装位置;例如:

C:\>set CLOUDSCAPE_INSTALL=C:\Cloudscape_10.0

为了增加本文的可读性,我常常将命令分割成几行。此外,还请记住,Java 类路径由一个或多个项组成,在 Windows 中,这些项用分号分隔( ;),而在 UNIX 中,这些项是用冒号分隔( :)的。这些实例展示的是 Windows 语法,因此,对于 UNIX,您必须进行调整。

永久地设置类路径

图 1 使用控制面板的系统设置来添加名为 CLASSPATH 的新变量,从而永久性地设置 Windows 环境变量。



图 1. 在 Windows 中通过系统设置来永久设置 CLASSPATH 环境变量
Windows CLASSPATH 环境变量

UNIX 用户可以通过向 .profile.cshrc 文件添加 CLASSPATH 变量来永久设置类路径。

临时设置类路径

SimpleApp 客户机类包含在 %CLOUDSCAPE_INSTALL%\demo\programs\simple 下的 Cloudscape 10.0 软件发行版中。在嵌入式模式中运行该类还需要 %CLOUDSCAPE%\lib\cs.jar 文件。清单 1 展示了在运行 SimpleApp 之前,如何在 Windows 命令窗口中临时设置 CLASSPATH ,以包含 cs.jar 和当前工作目录。



清单 1. 临时设置 Java CLASSPATH
C:\>set CLASSPATH=%CLOUDSCAPE_INSTALL%\lib\cs.jar;.;
            C:\>cd %CLOUDSCAPE_INSTALL%\demo\programs\simple
            C:\Cloudscape_10.0\demo\programs\simple>java SimpleApp
            SimpleApp starting in embedded mode.
            Loaded the appropriate driver.
            Connected to and created database cloudscapeDB
            Created table cloudscapeDB
            Inserted 1956 Webster
            Inserted 1910 Union
            Updated 1956 Webster to 180 Grand
            Updated 180 Grand to 300 Lakeshore
            Verified the rows
            Dropped table cloudscapeDB
            Closed result set and statement
            Committed transaction and closed connection
            Database shut down normally
            SimpleApp finished 

如果是临时设置类路径,那么每次打开新的命令窗口时,都需要再次设置它。

在运行时设置类路径

清单 2 展示了如何在运行时使用 -cp 选项来指定类路径,这里的运行时是指启动应用程序和 JVM 时。



清单 2. 在运行时用 -cp 选项设置 Java 类路径
C:\Cloudscape_10.0\demo\programs\simple>java -cp  %CLOUDSCAPE_INSTALL%\lib\cs.jar; SimpleApp
            SimpleApp starting in embedded mode.
            Loaded the appropriate driver.
            Connected to and created database cloudscapeDB
            Created table cloudscapeDB
            Inserted 1956 Webster
            Inserted 1910 Union
            Updated 1956 Webster to 180 Grand
            Updated 180 Grand to 300 Lakeshore
            Verified the rows
            Dropped table cloudscapeDB
            Closed result set and statement
            Committed transaction and closed connection
            Database shut down normally
            SimpleApp finished





回页首


一个 'ij' 实例

现在,让我们来看一个完整的实例,它展示了如何设置类路径,以便运行 ij 这个 Cloudscape SQL 脚本编制工具。 清单 3CLASSPATH 环境变量设置为 Cloudscape 10.0 运行 ij 所需的最低要求值。



清单 3. 设置 Java CLASSPATH
C:\my_dir>set CLOUDSCAPE_INSTALL=c:\Cloudscape_10.0
            C:\my_dir>set CLASSPATH=%CLOUDSCAPE_INSTALL%\lib\cs.jar;%CLOUDSCAPE_INSTALL%\lib\cstools.jar
            C:\my_dir>echo %CLASSPATH%
            c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar
            

如果正确设置了 CLASSPATH ,并且在 c:\Cloudscape_10.0 中真正安装了 Cloudscape,那么 清单 4 中展示的命令就会报告有用的 Cloudscape 10.0 版本信息:



清单 4. 输出 Cloudscape 10.0 版本信息
C:\Cloudscape_10.0>java com.ihost.cs.tools.sysinfo
            ------------------ Java Information ------------------
            Java Version:    1.4.1_02
            Java Vendor:     Sun Microsystems Inc.
            Java home:       C:\Program Files\Java\j2re1.4.1_02
            Java classpath:  c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar
            OS name:         Windows 2000
            OS architecture: x86
            OS version:      5.0
            Java user name:  jta
            Java user home:  C:\Documents and Settings\jta
            Java user dir:   C:\Cloudscape_10.0
            --------- Cloudscape Information --------
            [C:\Cloudscape_10.0\lib\cs.jar] 10.0.1.0 beta - (29729)
            [C:\Cloudscape_10.0\lib\cstools.jar] 10.0.1.0 - (29729)
            ------------------------------------------------------
            ----------------- Locale Information -----------------
            ------------------------------------------------------

通过正确设置 Java 类路径,可以成功启动 ij ,如下所示:

C:\Cloudscape_10.0>java com.ihost.cs.tools.ij
            ij version 10.0 (c) 1997, 2004 IBM Corp.
            ij> 

然而,如果类路径的设置不正确,那么应该输出版本信息的命令就会输出一个令人泄气的 NoClassDefFoundError 错误:

C:\mydir>java com.ihost.cs.tools.sysinfo
            Exception in thread "main" java.lang.NoClassDefFoundError: com/ihost/cs/tools/sysinfo

NoClassDefFoundErrorClassNotFoundException 是没有适当设置类路径时的常见错误。第一个意味着无法找到类本身。第二个意味着找到了类,但是没有找到它所导入的某个类。有关的更多信息,请参阅标题为 常见类路径错误的小节。





回页首


Cloudscape 库和包名

各种 Cloudscape 对象(例如库、包、驱动程序和工具)的名称在不同的产品版本中会所变化。下面的 表 1总结了不同版本的 Cloudscape 名称。有关 Cloudscape 名称的完整信息,请查阅 Cloudscape 软件发布中的文档。

表 1. Cloudscape 库和包

名称 10.0 Beta 5.1 4.0
Cloudscape 引擎:嵌入式数据库 cs.jar db2j.jar cloudscape.jar
Cloudscape 工具 cstools.jar db2jtools.jar cloudutil.jar
Cview - db2jcview.jar cloudview.jar
Cview的帮助系统 - jh.jar jh.jar
Cloudscape 网络服务器函数 csnet.jar db2jnet.jar -
DB2 JDBC 通用驱动程序 (名称无改变) db2jcc.jar db2jcc.jar -
许可证文件 db2jcc_license_c.jar db2jcc_license_c.jar,
db2jcc_license_cu.jar,
db2jcc_license_cisuz.jar
-
包名 com.ihost.cs com.ibm.db2j COM.cloudscape

清单 1和清单 2 展示了如何在嵌入式模式中运行 %CLOUDSCAPE_INSTALL%\demo\programs\simple\SimpleApp 。嵌入式模式极其简单,只需在类路径中包括 cs.jar 即可。不过,您也可以在网络服务器模式中运行 SimpleApp 实例,为此,您需要在类路径中包括下方列出的库(还需要启动网络服务器):

  • cs.jar
  • csnet.jar
  • db2jcc.jar
  • db2jcc_license_c.jar

请注意,Cloudscape 名称将在版本 10.0 Beta 和 10.0 GA 之间发生改变。当它们变得可用时,本文将用新的名称对它们进行更新。





回页首


检测问题

常见类路径错误

主要有两种类型的类路径问题。第一类问题发生在没有从类路径中找到您试图使用的 Java 类时,此时,它抛出一个 java.lang.ClassNotFoundException 异常。第二类问题发生在找到了您正试图使用的类,但没有找到它所导入的某个类时。本例中,在编译时显示了所导入的类,但在运行时,所导入的类没有包含在类路径中。这将抛出一个 java.lang.NoClassDefFoundError 异常。还有另一种考虑 NoClassDefFoundError 的方式,也就是说,在编译当前执行的类时,所搜索的类定义是存在的,但在运行时却再也无法找到该定义了。

如何可以解决这类问题呢?首先,检查类路径,验证库是否真正位于您认为的地方。例如,在 Windows 中使用该命令来输出类路径:

C:\my_dir>echo %CLASSPATH%
            c:\Cloudscape_10.0\lib\cs.jar;c:\Cloudscape_10.0\lib\cstools.jar
            

然后,在 CLASSPATH 变量中查看每个路径,并用 dir (Windows)或 ls (UNIX)命令查看这些文件是否存在。

如果不知道类位于哪个 jar 文件中,可以用以下命令来检查:

jar -tvf cs.jar | more
            

该命令产生许多输出。如果正使用 Linux 或 Unix,或者在 Windows 中使用 UNIX 使用程序,那么您可以用 grep 筛选您所查找的类。例如,以下命令将查找 com.ihost.cs.tools.sysinfo 类:

C:\Cloudscape_10.0\lib>jar -tvf cs.jar | grep -i com.ihost.cs.tools.sysinfo
            1526 Wed Jun 23 19:03:18 PDT 2004 com/ihost/cs/tools/sysinfo.class
            

另一种方法是通过 sysinfo 实用程序来搜索类,这将在下一节中进行描述。

验证是否获得您真正需要的所有东西

Cloudscape 软件发布包括 sysinfo 工具,其中包含验证类路径的 -cp 选项。有关的完整信息,请参阅 Cloudscape 软件发布中的 Tools and Utilities Guide

如果使用时没有附带任何附加参数,那么 -cp 选项将测试所有 Cloudscape 库,输出它能够找到以及无法找到的那些库,如下所示:

C:\Cloudscape_10.0>java com.ihost.cs.tools.sysinfo -cp
            Testing for presence of all Cloudscape-related libraries; typically, only some are needed.
            For a list of possible arguments, type java com.ihost.cs.tools.sysinfo -cp args
            FOUND IN CLASS PATH:
            Cloudscape embedded engine library (cs.jar)
            Cloudscape tools library (cstools.jar)
            NOT FOUND IN CLASS PATH:
            Cloudscape Network Server library (csnet.jar)
            (com.ihost.cs.drda.NetworkServerControl not found.)
            Cloudscape Client libraries (db2jcc.jar)
            (com.ibm.db2.jcc.DB2Driver not found.)
            

-cp 选项的可选参数包括:

  • embedded
  • tools
  • sampleApp
  • anyClass.class

下面的实例将在类路径中查找 SimpleApp 类:

C:\Cloudscape_10.0\demo\programs\simple>java com.ihost.cs.tools.sysinfo -cp SimpleApp.class
            FOUND IN CLASS PATH:
            NOT FOUND IN CLASS PATH:
            user-specified class (SimpleApp)
            (SimpleApp not found.)
            

如果要在当前工作目录中运行类,那么请记住,要将该目录包含在您的路径中:

C:\Cloudscape_10.0\demo\programs\simple>set CLASSPATH=%CLASSPATH%;.;
            C:\Cloudscape_10.0\demo\programs\simple>java com.ihost.cs.tools.sysinfo -cp SimpleApp.class
            FOUND IN CLASS PATH:
            user-specified class (SimpleApp)
            SUCCESS: All Cloudscape related classes found in class path.
            

最后,改为使用 5.1 包名来测试 Cloudscape 5.1 的类路径,例如:

java com.ibm.db2j.tools.sysinfo -cp