Java" -cp"选项,编译时间还是运行时?

时间:2015-04-24 06:35:34

标签: java classpath

我看到人们说有不同类型的类路径。例如编译时类路径和运行时类路径。

我认为与"-cp"一起使用时"-classpath"javac选项是编译时类路径。

当与java命令一起使用时,它应该是运行时类路径。我是对的吗?

这两个类路径可以完全不同吗?

4 个答案:

答案 0 :(得分:3)

javajavac命令接受-cp-classpath ...意思相同。

曾几何时,javac仅接受-classpath

  

这两个类路径[由java和javac使用]可以完全不同吗?

他们可以。但是,如果使用一个版本的API进行编译并使用另一个版本运行,则可能会遇到"二进制兼容性"导致运行时错误的问题。

因此建议在编译时和运行时使用相同(或等效的)类路径。

  

为什么两次使用相同的内容?

因为内容(类路径)没有编译到代码中。

更深层次的答案是,Java程序通常由独立编译的组件(例如库)组成,然后在运行应用程序时将它们组合在一起。根据其依赖性,每个组件构建都需要不同的类路径。当你将所有部分组合在一起时,可能需要不同的类路径。因此需要能够在编译和运行时以不同方式指定类路径。

答案 1 :(得分:2)

  

我想" -cp"或" -classpath"与javac一起使用时的选项是编译时类路径。

完全!

  

这两个类路径可以完全不同吗?

这两者最好相同。

否则,如果您遇到NoClassDefFoundError错误,如果某个类在编译时存在(并且实际上已在您的代码中使用),但在运行时丢失了。

只有在编译时将类添加到类路径中时,类路径才能才会有所不同,这些类在源代码中未使用。在这种情况下,您可以跳过将这些添加到Runtime类路径中。

但是,我建议你让classpath(s)清除不需要的类/库。

答案 2 :(得分:1)

  

我认为与javac一起使用时,“-cp”或“-classpath”选项是   编译时类路径。

是的,这是真的。

来自java Docs

  

JDK工具java,jdb,javac和javah具有-classpath选项   它取代了CLASSPATH指定的路径   工具运行时的环境变量。这是推荐的   更改类路径设置的选项,因为每个应用程序都可以   拥有它所需的类路径而不会干扰任何其他类路径   应用

     

运行时工具java也有一个-cp选项。这个选项是一个   -classpath的缩写。

     

对于非常特殊的情况,java和javac都有可以让你的选项   改变他们用来查找自己的类库的路径。茫茫   但是,大多数用户永远不需要使用这些选项。

答案 3 :(得分:0)

我想" -cp"或" -classpath"与javac一起使用时的选项是编译时类路径。

yes

这两个类路径可以完全不同吗?

they should be same

  

任何   给定类,java虚拟机将需要找到完全相同的支持   javac编译器在编译时需要找到的类。换句话说,   如果javac需要访问java.util.HashMap,则需要java命令   也可以找到java.util.HashMap