由java.lang.NoClassDefFoundError引起:

由java.lang.NoClassDefFoundError引起:,java,jvm,Java,Jvm,我在程序下面有这个 package com; import java.io.PrintStream; import java.net.URL; import java.net.URLConnection; public class Caller { public static void main(String[] args) { try { URL url = new URL(

我在程序下面有这个

package com;

    import java.io.PrintStream;
    import java.net.URL;
    import java.net.URLConnection;

    public class Caller
    {
      public static void main(String[] args)
      {
        try
        {
          URL url = new URL("http://localhost:8080/Test/Ravi.jsp");
          connection = url.openConnection();
        }
        catch (Exception ioe)
        {
          URLConnection connection;
          System.err.println("IOException: " + ioe.getMessage());
        }
      }
    }
当我运行这个时,我会

C:\Program Files\Apache软件基金会\Apache-tomcat-6.0.33\webapps\Test\WEB-INF\classes>java com.Caller

Exception in thread "main" java.lang.NoClassDefFoundError: com/Caller
Caused by: java.lang.ClassNotFoundException: com.Caller
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.Caller.  Program will exit.

现在还不清楚为什么要从Tomcat目录运行控制台应用程序,但它基本上找不到您的类

您可能在当前目录下有一个
com
目录,在该目录下有一个
Caller.class
文件。如果不是这样的话,您需要了解如何编译代码,并修复它

我猜你刚刚跑了:

javac Caller.java
java com.Caller
这将在当前目录中创建类文件。有两种方法可以解决这个问题。您可以使用
-d

javac -d . Caller.java
java com.Caller
或者,您可以将源文件移动到反映包结构的结构中,即自己创建
com
目录:

mkdir com
move Caller.java com
javac com\Caller.java
java com.Caller
或者更好,您可以将源文件与二进制文件分开:

mkdir src\com
move Caller.java src\com
javac -d bin src\com\Caller.java
java -cp bin com.Caller

现在还不清楚为什么要从Tomcat目录运行控制台应用程序,但它基本上找不到您的类

您可能在当前目录下有一个
com
目录,在该目录下有一个
Caller.class
文件。如果不是这样的话,您需要了解如何编译代码,并修复它

我猜你刚刚跑了:

javac Caller.java
java com.Caller
这将在当前目录中创建类文件。有两种方法可以解决这个问题。您可以使用
-d

javac -d . Caller.java
java com.Caller
或者,您可以将源文件移动到反映包结构的结构中,即自己创建
com
目录:

mkdir com
move Caller.java com
javac com\Caller.java
java com.Caller
或者更好,您可以将源文件与二进制文件分开:

mkdir src\com
move Caller.java src\com
javac -d bin src\com\Caller.java
java -cp bin com.Caller

在运行
java
命令时,必须确保将
.class
文件的位置添加到类路径中(以便执行可以找到已编译的类)

因此,请转到
com
目录,并使用:

java -cp . Caller

在运行
java
命令时,必须确保将
.class
文件的位置添加到类路径中(以便执行可以找到已编译的类)

因此,请转到
com
目录,并使用:

java -cp . Caller


这意味着中的类不存在。请。尝试再次构建项目并将其部署到web服务器中。

这意味着中的类不存在。请。尝试重新构建项目并将其部署到web服务器。

如果说“错误的名称:com/Caller”或类似的话,则会失败。Caller类声明在com包中。我想我只是更新我的答案有点晚:)我不确定你的意思-现在仍然不正确。OP不应该这样做;它不起作用。类存在,我无法发布图片,但错误仍然存在。它们可能存在,但很可能位于错误的位置。@PavanKumar:它们可能存在。你需要给我们更多的信息(最好包括你为什么要在一个web应用程序目录中执行所有这些操作),这样就不会说“错误的名称:com/Caller”或类似的话。Caller类声明在com包中。我想我只是更新我的答案有点晚:)我不确定你的意思-现在仍然不正确。OP不应该这样做;它不起作用。类存在,我无法发布图片,但错误仍然存在。它们可能存在,但很可能位于错误的位置。@PavanKumar:它们可能存在。您需要向我们提供更多信息(理想情况下包括您为什么首先在web应用程序目录中执行所有这些操作)。这可能是一个愚蠢的疑问,但我希望您已经确保Caller.class存在于C:\Program Files\Apache Software Foundation\Apache-tomcat-6.0.33\webapps\Test\web-INF\classes\com下?如果没有,您必须使用javac编译到源代码。正如Jon在回答中所说,不清楚您为什么试图从tomcat目录内部运行该类@StephenC的可能副本:不,这是一个不同的例外,原因不同。可能是一个愚蠢的疑问,但我希望您已经确保Caller.class存在于C:\Program Files\Apache软件基金会\Apache-tomcat-6.0.33\webapps\Test\WEB-INF\classes\com下?如果没有,您必须使用javac编译到源代码。正如Jon在回答中所说,不清楚您为什么试图从tomcat Directory内部运行该类@StephenC的可能副本:不,这是一个不同的异常,原因不同。它可能存在,但位于错误的位置。就我个人而言,我不建议首先在web服务器上部署命令行应用程序……是的。。你是对的。他需要把它放在一个正确的地方和适当的包装结构。好吧,它可能存在,但放在错误的地方。就我个人而言,我不建议首先在web服务器上部署命令行应用程序……是的。。你是对的。他需要把它放在一个合适的位置和合适的包装结构