JDK中未包含的包(例如javax.websocket
)需要下载并引用-cp
或CLASSPATH
环境变量才能导入(否则你得到编译错误包X不存在)。
编译后,当获得.class文件时,是否可以将这些文件传输到不拥有javax.websocket
包的计算机,并在该计算机上安装JVM运行它们,还是有必要在两台计算机上安装包?
换句话说:当您撰写import bar.foo;
时,您基本上是在写"每当您看到foo
时,请转到此位置并查看它是什么。&#34 ; 。但是,当您编译了源代码时,字节代码是否仍然会说"转到此位置并查看它是什么" ,或者它已经到达该位置和& #34;进口"一切,以便不再需要这个位置?
答案 0 :(得分:1)
编译后,当获得.class文件时,是否可以将这些文件传输到没有
javax.websocket
包的计算机,并让该计算机上的JVM运行它们,或者是否有必要在两台计算机上都有这个包吗?
必须在两台计算机上都有这个包。字节码假定相关类在运行时可供JVM使用。
此外,即使在同一台计算机上进行编译和运行也是如此:Java编译器提取其包进行编译的位置可能与运行代码时JVM提取包的位置不同。
答案 1 :(得分:0)
可以在这里找到关于这个问题的非常详尽的解释,在:
直接引用作者JB Nizet:(添加斜体是我的)
compile classpath是用于编译Java源文件的类路径(使用
javac -cp ...
或IDE)。源文件中引用的每个类必须存在于 compile 类路径中,否则编译器会抱怨它无法找到该类。编译完类后,可以使用它们运行程序(使用
java -cp ...
)。显然,源代码所依赖的库应该位于 runtime 类路径中。但那还不是全部。如果您直接依赖CoolLibrary.jar
,并且此库在内部依赖于Guava.jar
,那么Guava.jar
也必须位于运行时类路径中,尽管在编译时不需要它。Webapps有点特别。 [...原始答案继续......]