如何在Ubuntu上使用apache commons java库?
我是一名Java初学者,正在尝试了解如何使用ApacheCommons库 下面是一个源文件如何在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)
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这样的库和希望手工构建的开发人员来说?这是为数不多的几次推荐这种做法的一次。这并不坏,但只是权宜之计。我的意思是,你迟早要学会如何制作独立的项目,所以我认为你也可以。(见鬼,整个编程语言社区花了很多年才意识到这是他们必须支持的。)