如何在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 楼答案
显然,
/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或其他具有依赖关系管理的构建系统。(Gradle或Ant+Ivy)如果你正在编写一个使用第三方库的Java应用程序,我强烈建议你学习并使用其中的一个。(此外,大多数IDE都可以使用Maven的配置文件,让您在团队中与使用混合IDE或不使用IDE的人使用相同的构建设置。)一般来说,如果你直接调用编译器,你做得不对