javac和java的-classpath选项

时间:2010-01-15 18:01:37

标签: java classpath

我对编译和运行 java程序中的角色-classpath选项感到困惑。请帮我理解。

7 个答案:

答案 0 :(得分:4)

因为它们是两个独立的操作,不一定是相同的路径。

运行时依赖性通常比编译时依赖性更广泛。例如,许多程序将编码到接口,这限制了与这些接口的编译时依赖性。在运行时,VM必须能够解析这些接口的实现,这些接口在运行时加载之前不需要。

答案 1 :(得分:2)

它只是在两种情况下告诉javac和java在哪里找到程序编译和运行所需的依赖项

答案 2 :(得分:2)

两次完成的原因是编译代码的环境可能与运行代码的环境不同。

答案 3 :(得分:2)

Java在运行时加载类。例如,您可以编写一个方法来强制加载类X,编译它,编写类X,编译它,然后一起运行它们。此外,您通常通过完全指定的名称引用类,但可以使用该类的不同版本(例如,库的不同版本)运行相同的程序。因此,您需要告诉Java哪里可能找到它需要加载的类。

对于编译,为了确保类型安全,您必须为Java编译器至少提供您所引用的接口或基类并进行调用,以便编译器可以在至少确保通话合法。出于这个原因,你必须告诉它在哪里找到包含它们的罐子。

这是一个例子。假设您想在核心Java程序中使用JMS(消息传递框架)。在编译时,您至少需要告诉javac在哪里找到JMS接口。在运行时,您需要提供这些接口,但您还需要为JAR提供实际的实现(例如,ActiveMQ)。

答案 4 :(得分:1)

在C ++中我相信链接是在编译时发生的,以创建可执行文件(我不是C ++程序员,所以我不确定)。

在Java中,链接器步骤在运行时发生(请参阅JVM规范“Loading, Linking and Initalizing”)。从你的问题中听起来你理解为什么需要在编译时指定类路径(因为你可能在代码中引用来自第三方JAR的类),所以我只是解释一下,当你的程序运行时,那些类是在引用它们之前没有加载到JVM中。此时,JVM需要知道在哪里找到它们的表示。

答案 5 :(得分:0)

编译器必须知道在哪里查找以满足编译时依赖性。 VM必须知道在哪里寻找以满足运行时依赖性。

答案 6 :(得分:0)

在编译时,您需要告诉javac在哪里可以找到第三方和用户定义的类。在运行时,您还需要告诉java在哪里可以找到第三方和用户定义的类。在这两种情况下,更改类路径的一种方法是使用JDK工具'-classpath option。有关详细信息,请查看Setting the Class Path技术说明。