2

我有一个尝试发送和接收对象的客户端/服务器程序。

共有三个包:server、client 和 shared shared 只包含 Message 类

我将共享包中的 Message.java 放入与 calcclient 包源文件和 calcserver 包源文件相同的文件夹中。

我使用以下行编译: javac -classpath .; (客户端或 server.java 文件的长列表) Message.java 他们可以编译。然后我将目录更改为上一级并运行: java -classpath .; 。主要的

当我使用 Netbeans 运行时,整个程序正常运行。但如果我从命令行运行则不会。如果它通过命令行执行,程序将一直工作,直到它需要使用 Message 对象。然后它将显示 NoClassDefFoundError

我是否将正确的文件放在正确的位置?如何让程序通过命令行查找共享包?

4

3 回答 3

2

文件不在正确的位置。Message 类属于不同的包,因此它不应该与其他类一起使用。来自http://java.sun.com/j2se/1.5.0/docs/tooldocs/findingclasses.html

用户类是构建在 Java 平台上的类。为了查找用户类,启动器引用用户类路径——目录列表、JAR 档案和包含类文件的 ZIP 档案。

类文件具有反映类的完全限定名称的子路径名称。例如,如果类 com.mypackage.MyClass 存储在 /myclasses 下,则 /myclasses 必须位于用户类路径中,并且类文件的完整路径必须是 /myclasses/com/mypackage/MyClass.class。如果类存储在名为 myclasses.jar 的存档中,则 myclasses.jar 必须位于用户类路径中,并且类文件必须作为 com/mypackage/MyClass.class 存储在存档中。

你有几个选择:

最好的解决办法是花时间学习 Ant。Netbeans 项目是用 Ant 构建的,这在我的书中是 Netbeans 的一个非常棒的特性,您可以在您的项目中打开 build.xml 并找到一个注释合理的说明,说明 Netbeans 为构建您的项目所做的工作。实际上,我认为从命令行运行构建的地方不会有很多,所以学习像 Ant 这样的东西会很有帮助。

下一个复杂级别是为您的共享包手动构建一个 Jar 并将其放在类路径中的某个位置。

最基本的方法是将 java 文件编译成类文件并将它们放在反映包名称的适当目录中,如上面的引用中所述。

于 2010-06-02T03:43:47.000 回答
1

如果您在 NetBeans 中构建您的项目,您会看到有一个 dist 文件夹,您可以在其中找到二进制代码的项目。构建源代码后,NetBeans 指定应如何从命令行启动项目。

如果您使用它并且问题仍然存在,您应该将 Message 类重新构建为库,使用 NetBeans 将其链接到项目,并且项目应该使用 NetBeans 中指定的命令从命令行运行。

如果你想手动编译你的源文件,我认为最好的解决方案是谷歌这样的东西:手动编译 Java 源代码

于 2010-06-02T03:38:19.397 回答
0

如果包含空格,请引用类路径值。

java -classpath C:\Program Files\java\...;C:\...
                          ^
                          This is what's killing you slowly.

试试这种方式:

java -classpath "C:\Program Files\java\...;C:\..."
于 2010-06-02T04:11:18.603 回答