为什么java不能找到我的班级?

时间:2013-11-12 15:59:50

标签: java

我有一个编译没有错误的类。该类有一个主要方法。但是当我尝试从类的目录在ubuntu linux上运行它时,我得到一个类找不到错误。我很确定我错过了一些显而易见的东西,但是我没有看到它。

这是我的操作:

zookeeper@zookeeper-virtual-machine:~/zookeeper-3.4.5/programs$ ls
CreateGroup.java  LsGroup.class  LsGroup.java  zookeeper-3.4.5.jar

以下是我运行LsGroup时发生的事情

zookeeper@zookeeper-virtual-machine:~/zookeeper-3.4.5/programs$ java -cp "zookeeper-3.4.5.jar" LsGroup
Exception in thread "main" java.lang.NoClassDefFoundError: LsGroup
Caused by: java.lang.ClassNotFoundException: LsGroup
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: LsGroup. Program will exit.

以下是LsGroup的代码

package org.zookeeper;    
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;

public class LsGroup implements Watcher {

    private static final int SESSION_TIMEOUT = 5000;
    private ZooKeeper zk;
    private CountDownLatch connectedSignal = new CountDownLatch(1);

    public void connect(String hosts) throws IOException, InterruptedException {
        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
        connectedSignal.await();
    }

    @Override
    public void process(WatchedEvent event) { // Watcher interface
        if (event.getState() == KeeperState.SyncConnected) {
            connectedSignal.countDown();
        }
    }

    public void ls(String groupName) throws KeeperException, InterruptedException {
        String path = "/" + groupName;
        try {
            List<String> children = zk.getChildren(path, false);
            for (String child : children) {
                System.out.println(path+"/"+child);
                System.out.println(zk.getChildren(path +"/"+ child, false));
            }
        } catch (KeeperException.NoNodeException e) {
            System.out.printf("Group %s does not exist\n", groupName);
            System.exit(1);
        }
    }

    public void close() throws InterruptedException {
        zk.close();
    }

    public static void main(String[] args) throws Exception {
        LsGroup lsGroup = new LsGroup();
        lsGroup.connect(args[0]);
        lsGroup.ls(args[1]);
        lsGroup.close();
    }
}

7 个答案:

答案 0 :(得分:3)

最初的问题是你的类在一个包中,但你试图加载它就像它不在包中一样。您通常会组织您的源代码以匹配您的包层次结构,然后从层次结构的 root 中运行以下内容:

java -cp .:zookeeper-3.4.5.jar org.zookeeper.LsGroup

现在您已经通过将代码移出软件包暂时解决了软件包问题,下一个问题是当前目录不在类路径中。所以不要这样:

java -cp "zookeeper-3.4.5.jar" LsGroup

你想:

java -cp .:zookeeper-3.4.5.jar LsGroup

一旦你有了这个工作,你应该按照正常的Java最佳实践将类移回包中。

答案 1 :(得分:2)

您可以删除包声明:

package org.zookeeper;

...或者只将LsGroup课程放在org/zookeeper目录中。

答案 2 :(得分:1)

类文件应该存在于以下路径中:

 org/zookeeper/LsGroup.class

-cp必须包含包含org /目录的目录。那你可以

java -cp parent-of-org org.zookeeper.LsGroup

答案 3 :(得分:1)

消息“错误的名称:org / zookeeper / LsGroup”意味着,您必须尊重Java的包结构。使用以下目录结构:

./org/zookeeper/LsGroup.class

然后从当前目录中启动java org.zookeeper.LsGroup。包分隔符“。”将被翻译成相应的目录。

答案 4 :(得分:0)

您的文件不在包org.zookeeper

你应该从〜/ zookeeper-3.4.5 / org / zookeeper

运行你的班级

否则JVM将无法找到要加载的类。

答案 5 :(得分:0)

您的课程是org.zookeeper包的一部分,但您将其保存在项目的根文件夹中(/zookeeper-3.4.5/programs)。
包成员的限定名称和文件的路径名是并行的(see Managing Source and Class Files),因此如果您的包是org.zookeeper,则类文件应保存在/zookeeper-3.4.5/programs/org/zookeeper

答案 6 :(得分:0)

你犯了两个错误:

1)您尝试运行java LsGroup,但必须使用完整名称,包括包java org.zookeeper.LsGroup

2)您的目录结构不正确:包org.zookeeper对应于目录结构./org/zookeeper/

如果您更改目录结构,然后从此目录结构的顶部运行java,它应该可以工作