Javac与Java的-classpath选项有什么区别?

12

有什么区别是在javacjava中调用-classpath选项的?

例如:

javac -classpath MyJar.jar GetJar.java
java -classpath MyJar.jar:. GetJar

它的工作效果和以下一样:

javac -classpath MyJar.jar GetJar.java
java GetJar

基本上,第一个与javac相关的-classpath需要存在,而在java命令行中它可能是可选的。为什么?您知道在哪种情况下它是强制性的吗?更一般地说,由javac调用的-classpath的效果是什么,由java调用的-classpath的效果又是什么。
提前感谢。
2个回答

11
一种用于编译的类路径,另一种用于运行。它们必须相同。编译过程所需的类集是所有被编译类所引用的类。而你的运行时JAR可能会调用一个带有空main方法和无依赖项的独立类。请记住,在运行时,类依赖关系是动态解析的,也就是说,只有在需要时才加载类(这是一种概括,启动和系统类始终会被加载)。

明白了,因此如果我声明了这样一段代码:if (scan.nextInt()>10) new OtherClass(); 只有当 scan.nextInt() 大于 10 时,OtherClass 才会被加载。 - Rollerball
实际上,任何在另一个类A中引用类B的操作都会自动加载类B(即使由于条件逻辑而未直接使用)。 - Perception

1
这份文档包含了你的问题的答案。

http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html

每次使用-classpath都非常耗时。相反,使用环境变量(如果你正在处理Java Mail等包)。
classpath用于编译。Javac是Java编译器,它将您的代码转换为字节码。
当涉及到java时,它用于运行您的Java源文件/ jar。

2
修复到Oracle网站的链接。 - nbro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接