4

我是一名 Java 初学者,并试图弄清楚如何使用 apache commons lib。

这是一个源文件Randstr.java

import org.apache.commons.lang3.RandomStringUtils;

class Randstr {
    public static void main(String[] args) {
        String s = RandomStringUtils.random(12);
        System.out.println(s);
    }
}

commons-lang3-3.1.jar在 /usr/share/java/ 中有文件,并在当前目录中创建了一个符号链接。然后我像这样编译它:javac -cp commons-lang3-3.1.jar Randstr.java,编译很好,但是当我执行时java Randstr,我得到了以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/RandomStringUtils
        at Randstr.main(Randstr.java:5)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.RandomStringUtils
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 1 more

如果我不在类路径中指定 jar 文件,它甚至不会编译:

javac -cp . Randstr.java

# Randstr.java:1: error: package org.apache.commons.lang3 does not exist
# import org.apache.commons.lang3.RandomStringUtils;
#                                ^
# Randstr.java:5: error: cannot find symbol
#         String s = RandomStringUtils.random(12);
#                    ^
#   symbol:   variable RandomStringUtils
#   location: class Randstr
# 2 errors

javac -cp /usr/share/java/  Randstr.java

# Randstr.java:1: error: package org.apache.commons.lang3 does not exist
# import org.apache.commons.lang3.RandomStringUtils;
#                                ^
# Randstr.java:5: error: cannot find symbol
#         String s = RandomStringUtils.random(12);
#                    ^
#   symbol:   variable RandomStringUtils
#   location: class Randstr
# 2 errors

通过阅读有关 stackoverflow 的其他问题,我发现这可以通过使用 IDE 来解决,但目前我更喜欢简单的编辑器。

4

3 回答 3

3

如果你可以编译它

javac -cp commons-lang3-3.1.jar Randstr.java

然后你可以运行它

java -cp commons-lang3-3.1.jar:. Randstr

JAR 文件必须在类路径中。

于 2013-08-02T22:36:17.960 回答
1

编辑您的个人资料文件。vim ~/.bashrc

在您的配置文件中添加以下行:

export CLASSPATH=/usr/share/java/commons-lang3-3.1.jar:.

注销并重新登录。或者在您打开的窗口中获取您的配置文件。您始终可以将类路径添加到您调用的每个 java 和 javac 命令中,但这会变得很痛苦。使用 CLASSPATH 环境变量,您不必再在命令行中添加它。请注意,如果您使用的是诸如 NetBeans 或 Eclipse 之类的 IDE,您可能仍需要将该库添加到 IDE 中的项目库中。

于 2013-08-02T23:11:14.277 回答
0

显然, 的内容/usr/share/java/不会自动添加到类路径中——它只是 APT 包放置 Java 库的常见位置。由开发人员正确引用它们。

Java 安装子目录中的JARext/会自动添加到类路径中。但是,不要将您自己的 JAR 放在那里。这是一种糟糕的做法,因为它与“在现实世界中”部署 Java 应用程序的方式不匹配。

正确的方法是在编译和运行您的应用程序时-cp显式使用参数。Java 不会将库代码编译到您的文件中,文件仅引用其他类的名称,然后在您的应用程序运行时根据需要从类路径中加载这些名称。该参数仅接受文件或其中包含文件的目录。您还可以在该参数的值中使用通配符。有关争论类路径的更多信息,请查看关于设置类路径的工具文档.class.class-cp.jar.class

您使用自动为您设置它的构建工具,例如 IDE 或Maven或其他具有依赖关系管理的构建系统。(GradleAnt+Ivy。)如果您正在编写使用第三方库的 Java 应用程序,我强烈建议您学习并使用其中的一个。(此外,大多数 IDE 可以使用 Maven 的配置文件,让您在团队中使用相同的构建设置,而团队中的人使用混合或不使用 IDE。)通常,如果您直接调用编译器,则说明您做得不对。

于 2013-08-02T22:48:13.667 回答