开发者

-classpath option for javac and java

开发者 https://www.devze.com 2022-12-17 00:47 出处:网络
I\'m confused with the role -classpath option plays in both compiling and ru开发者_运维问答nning a java program. Please help me understand.Because they are two separate operations and not necessarily

I'm confused with the role -classpath option plays in both compiling and ru开发者_运维问答nning a java program. Please help me understand.


Because they are two separate operations and not necessarily the same paths.

The runtime dependencies are often more extensive than the compile time dependencies. For example, many programs will code to interfaces, which limits the compile time dependencies to those interfaces. At runtime, the VM must be able to resolve the implementations of those interfaces, which are not required until they are loaded at runtime.


it simply in both cases tells javac and java where to find dependencies required for your program to both compile and run


The reason it is done twice is that the environment you compile the code in may not be the same environment you run the code in.


Java loads classes at runtime. For example, you could write a method that forces loading of class X, compile it, write class X, compile it, and then run them together. In addition, you typically refer to classes by a fully specified name, but could run the same program with different versions of that class (e.g., a different version of the library). Thus, you need to tell Java where it could potentially find the classes that it needs to load.

As for compilation, to ensure type safety, you have to provide the Java compiler at least with the interfaces or base classes that you are referring to and making calls on, so that the compiler can at least ensure that the call would be legal. For that reason, you have to tell it where to find the jars containing them.

Here is an example. Let's say you want to use JMS (a messaging framework) in a core Java program. At compile time, you need to at least tell javac where to find the JMS interfaces. At runtime, you need to provide these interfaces, but you also need to provide the JAR with the actual implementation (e.g., ActiveMQ).


In C++ I believe it is the case that linking happens around compile-time, to create an executable (I am not a C++ programmer so I'm not sure about that).

In Java, the linker step happens at runtime (see the JVM spec, "Loading, Linking and Initalizing"). From your question it sounds like you understand why the classpath needs to be specified at compile time (because you might reference classes from third-party JARs in your code), so I will just explain that when your program is being run, those classes are not loaded into the JVM until they are referenced. At this point, the JVM needs to know where to find their representation.


The compiler has to know where to look to satisfy compile-time dependencies. The VM has to know where to look to satisfy runtime dependencies.


At compile time, you need to tell javac where to find third-party and user-defined classes. At runtime, you also need to tell java where to find third-party and user-defined classes. In both cases, one way to change the class path is to use the JDK Tools' -classpath option. Checkout the Setting the Class Path technical note for more details.

0

精彩评论

暂无评论...
验证码 换一张
取 消