说明,这里是完全手打代码,不依赖于任何ide;现在工具如此丰富,为什么要完全手打呢?虽然工具很好,也有所谓工欲善其事之说,但对于初学者而言,如果太依赖于工具,则容易掉进工具即语言的陷阱里。我之前带过的学生里,就常有人把phpstorm和php、python和pycharm、弄混的现象;所以在基础语法训练的阶段,有必要让学生了解一下核心编程的手动操作方式,以对语言本身及语言的特质有个印象。
问题
有学生在做包练习时,想使用apache-commons
的ArrayUtils.addAll(Object[], Object[])
,代码写成这样子:
import java.lang.*;
import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;
/**
* ArrayDemo
*/
public class ArrayDemo {
public static void main(String[] args) throws Exception {
String[] groupOne = { "张三丰", "李四光", "王大刀" };
String[] groupTwo = { "马云", "马化腾", "李彦宏" };
String[] merged = (String[])ArrayUtils.addAll(groupOne, groupTwo);
System.out.println(Arrays.toString( merged));
}
}
编译上面的代码时,如果直接执行 javac ArrayDemo.java
会遇到类似这样的错误:
(base) ➜ java_web javac ArrayDemo.java
ArrayDemo.java:3: 错误: 程序包org.apache.commons.lang不存在
import org.apache.commons.lang.ArrayUtils;
^
ArrayDemo.java:14: 错误: 找不到符号
String[] merged = (String[])ArrayUtils.addAll(groupOne, groupTwo);
^
符号: 变量 ArrayUtils
位置: 类 ArrayDemo
2 个错误
分析
这个错误,一般用心学习前面课程的话,都可以找到原因,直接下载[commons-lang的jar包]就可以了(但注意版本的问题,如果你下载的是之前的版本就可以直接引入了,如果你是使用的 commons-lang3-3.x-src.tar.gz
的 版本的话,引入时,要写成import org.apache.commons.lang3.ArrayUtils;
)
解决
下载后的包,记得要在项目文件夹下创建 lib 目录,然后把 jar 包拷贝进去(可以jar包改名,这里名字影响不大),重新编译,编译时,要带上-classpath参数
(base) ➜ java_web javac -cp .:lib/commons-lang.jar ArrayDemo.java
编译后不要直接执行
java ArrayDemo
否则会报错:
(base) ➜ java ArrayDemo
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils
at ArrayDemo.main(ArrayDemo.java:14)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.ArrayUtils
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
运行时,同样要加上classpath
,像这样
(base) ➜ java -cp .:lib/commons-lang.jar ArrayDemo
这样运行就可以正确执行了:
(base) ➜ java -cp .:lib/commons-lang.jar ArrayDemo
[张三丰, 李四光, 王大刀, 马云, 马化腾, 李彦宏]
ps:当然,包也可以放在jre目录下,这样java执行时可以直接执行了,另外,也可以直接设置环境变量classpath实现,为了避免污染环境,因此这里只采用了上述方式;另外通过练习可以延展了解类加载机制。