有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Ubuntu上使用apache commons java库?

我是一名Java初学者,正在尝试了解如何使用apache commons库

下面是一个源文件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);
    }
}

我在/usr/share/java/中有commons-lang3-3.1.jar文件,并在当前目录中创建了一个符号链接。然后我像这样编译: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来解决,但目前我更喜欢一个简单的编辑器


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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