我有一个编译没有错误的类。该类有一个主要方法。但是当我尝试从类的目录在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();
}
}
答案 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,它应该可以工作