在没有 IDE 的项目中导入 .jar 文件并获取 ClassNotFoundException

Importing .jar file in a project whitout IDE and getting ClassNotFoundException

我正在尝试使用 IDE 在我的项目中导入一个 .jar 文件,在我 运行 程序之前,我所做的一切工作正常。当我 运行 它时,我收到以下错误消息。

所以,我创建了这个 bar-project 文件夹,我创建了 .jar 文件。

bar-project/resources
bar-project/src/com/bar/packmain/Bar.java

Bar.java:

package com.bar.packmain;

public class Bar {
    public Bar() {
        System.out.println("Bar.");
    }
}

在文件夹 bar-project/src/ 我是这样编译的:

javac -d . com/bar/packmain/Bar.java

要创建 jar 文件,我使用以下命令: jar -cvf Bar.jar com/bar/packmain/Bar.class

然后我将这个 .jar 移动到我的另一个名为 foo-project 的项目中。

foo-project/resources
foo-project/library/Bar.jar
foo-project/src/com/foo/packmain/Foo.java

Foo.java: 包裹 com.foo.packmain;

import com.bar.packmain.Bar;

public class Foo {

    private Bar bar;

    public Foo() {
        new Bar();
    }

    public static void main(String[] args) {
        new Foo();
    }
}

在 foo-project/src/ 文件夹中我正在编译并且 运行ning 像这样:

javac -cp .:../library/Bar.jar -d . com/foo/packmain/Foo.java
java com.foo.packmain.Foo

异常信息:

Exception in thread "main" java.lang.NoClassDefFoundError: com/bar/packmain/Bar
    at com.foo.packmain.Foo.<init>(Foo.java:10)
    at com.foo.packmain.Foo.main(Foo.java:14)
Caused by: java.lang.ClassNotFoundException: com.bar.packmain.Bar
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 2 more

那么,我的问题是我该如何解决这个问题?

您编译项目没有错误:

javac -cp .:../library/Bar.jar -d . com/foo/packmain/Foo.java

但是您对 运行 您的应用程序的命令不包含类路径中的 Bar.jar。 您还必须在此处包含您的 JAR 文件:

java -cp .:../library/Bar.jar com.foo.packmain.Foo

这是了解这些东西在较低级别如何工作的好方法,您可以更好地了解更高级别的工具,如 IDE 或 Maven 的真正作用。