【问题标题】:error: could not find or load main class <class Name>错误:无法找到或加载主类 <类名>
【发布时间】:2015-09-27 11:42:58
【问题描述】:
package demo;
import java.io.*;
class A
{
    public void run()
    {
        System.out.println("This Is Class A : public void run()");
    }
}
class B
{
    public static void main(String args[])
    {
        System.out.println("Main Method Executed");
        A obj1 = new A();
        obj1.run();
    }
}

编译:

d:\java>javac -d . demo.java

--->在目录demo中创建类文件[A.class, B.class]

Run : d:\java>java B
Error: could not find or load main class B

但如果我删除第 1 行 [package demo;] ,它就会正常运行。 所以,当我们使用包名时,为什么会产生“错误:无法找到或加载主类B”错误。

【问题讨论】:

  • 尝试从:java demo.A

标签: java main


【解决方案1】:

运行此命令。因为 main 方法在 B 类 中。包的名字是demo,包含main方法的类是B

java demo.B

输出:
已执行的主要方法
这是 A 类:public void run()

但如果我删除第 1 行 [package demo;] 则它运行正常。

这是因为当您在程序中提供包声明时,您的类就驻留在包中。因此,您需要提供从包中访问它们的完整路径。

【讨论】:

  • 谢谢,我做到了。但是如果我继续像这样的包目录
  • 但是如果我继续像 > cd demo [set current directory 'd:\java\demo>'] 这样的包目录,而不是尝试>java B,而不是给出“错误找不到或加载主类 B" 而 B.class 驻留在 demo[package] 目录中。
  • @KumarHarsha 我从未在目录中说过。只需在编译代码后运行命令。您在此处发布的原件。
  • @KumarHarsha 您接受的答案要求您改变几件事。不要将任何内容更改为原始代码。使用您粘贴的命令进行编译,然后使用答案中的我的命令运行。
  • 是的,你的答案是正确的......我就是这样做的。但是当我进入包目录而不是尝试运行 >java B 时,我遇到了一些问题。但它有同样的错误,请帮忙。它是如何工作的。
【解决方案2】:

它应该如下,因为您已经声明了一个包结构并且类文件应该驻留在这样的文件夹结构中。正如你的 A.class 应该在演示文件夹中

>java demo/A

你似乎在 B 类中有 main 方法。所以你必须执行类 B 而不是 A

>java demo/B

【讨论】:

    【解决方案3】:

    您应该将您的 demo.java 重命名为 B.java 并使用

    public class B
    

    而不是

    class B
    

    假设 B.class 位于 C:\

    要编译 B.java,键入

    C:\javac -d . B.java
    

    这将创建一个名为“demo”的文件夹,其中包含两个名为 A.class 和 B.class 的类文件。

    要执行程序,请键入

    C:\demo\java demo.B
    

    这是程序的结果:

    Main Method Executed
    This Is Class A : public void run()
    

    【讨论】:

      【解决方案4】:

      假设您的 Main 类位于 controller 包中。如果您使用 Gradle 构建和测试应用程序,请确保您的 build.gradle 文件中有这些行:

      jar {
          manifest {
            def classpath = configurations.runtime.collect { jarfile ->
              '../lib/' + jarfile.getName()
            }.join(' ')
      
             attributes 'Main-Class': 'controller.Main', 'Class-Path': classpath, 'Implementation-Version': version
          }
      }
      
      task runit(type: JavaExec) {
          main 'controller.Main'
          classpath = sourceSets.main.runtimeClasspath
      }
      

      注意:controller 是我的包的名称。我的 Main 类位于 controller 包内,它运行良好,甚至可以作为独立应用程序执行。请记住更改 Main 类所在的包的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-12
        • 2016-03-16
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多