Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ubuntu上使用apache commons java库?_Java - Fatal编程技术网

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

如何在Ubuntu上使用apache commons java库?,java,Java,我是一名Java初学者,正在尝试了解如何使用ApacheCommons库 下面是一个源文件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)

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

下面是一个源文件
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来解决,但我现在更喜欢一个简单的编辑器。

如果您可以使用

javac -cp commons-lang3-3.1.jar Randstr.java
然后你可以用它运行

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

JAR文件必须位于类路径中。

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

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

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


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

编辑您的配置文件。vim~/.bashrc

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

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

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

这看起来是个好问题。OP做错了什么?@Cole“Cole9”Johnson为初学者安装了一个Java库。(好吧,不是真的。)在学习Maven之前拒绝使用可以帮助管理图书馆的IDE将是第二位。@Cole“Cole9”Johnson我刚刚意识到你在问我没有投的接近票。我认为,询问关于投票结束或被否决的问题基本上是毫无意义的——这个人不想就此进行对话,很可能投票并继续前进。如果他们这样做了,他们已经写了评论。仍然没有运气,
java-cp commons-lang3-3.1.jar Randstr错误:无法找到或加载主类Randstr
只需将当前目录添加到类路径谢谢,我修改了我的答案。@PlínioPantaleão当前的工作目录始终在类路径上。@millimoose-默认情况下,工作目录在类路径上,一旦你开始弄乱类路径,你就应该包括它。但是他制作了一个simlink,将jar放在与source@anakata所以如果不在类路径上指定JAR,JAR在哪里并不重要。我编辑了我的答案,以强调你现在运行应用程序时需要这么做。但他正在这么做,不是吗?javac-cp commons-lang3-3.1.jar Randstr。java@anakata在编译时,它起作用了——“编译很好”。然后,当他们使用命令行
java Randstr
-运行应用程序时,应用程序崩溃,而没有必要的
-cp
。建议不要设置类路径。我不建议更改系统级类路径,而是更改用户特定的类路径?对于像commons这样的库和希望手工构建的开发人员来说?这是为数不多的几次推荐这种做法的一次。这并不坏,但只是权宜之计。我的意思是,你迟早要学会如何制作独立的项目,所以我认为你也可以。(见鬼,整个编程语言社区花了很多年才意识到这是他们必须支持的。)