从命令行运行Java时出现java.lang.ClassNotFound异常

问题描述

我试图更好地理解javajavac用法,以便从命令行编译和运行应用程序。

我的项目结构如下:

+ lib
    - mylibrary.jar
+ out
    + at
        + mypackage
            - Main.class
+ src
    + at
        + mypackage
            - Main.java

.jar文件仅包含类at/mylibrary/Test.class

src目录运行:

javac -cp "../lib/*" -d "../out" at/mypackage/Main.java

这似乎有效。 out目录及其所有内容已创建。现在,我进入out目录并尝试运行它:

java -cp "../lib/*" at.mypackage.Main

那是我得到java.lang.classNotFoundException的地方。找不到主类at.mypackage.Main

这些是Main.java内容

package at.mypackage;

import at.mylibrary.Test;

public class Main {
    public static void main(String[] args) {
        System.out.println(Test.hello());
    }
}

.jar文件中只有一个类:

package at.mylibrary;

public class Test {
    public static String hello() {
        return "Hello!";
    }
}

我哪里出错了?如何在命令行中使用javacjava编译和运行该项目?

PS:我知道使用Maven之类的内置管理工具来进行此操作比较容易,尤其是对于较大的项目,但是我真的想进一步了解它的总体工作原理。我在StackOverflow上搜索了建议,但无法正常工作。

编辑:我明白了。我导航到out目录,并使用以下命令运行Main

java -cp ".:../lib/*" at.mypackage.Main

我不知道我第一次出错是什么,但是现在可以了。就像注释中建议的那样,您必须在类路径中包括当前目录.,因为当您通过-cp提供类路径时,认类路径(包括当前目录)将被覆盖。至少我是这样理解的。 :将目录彼此分开。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)