编译后,导入的包是否包含在.class文件中?

时间:2016-07-11 17:16:07

标签: java compilation package

JDK中未包含的包(例如javax.websocket)需要下载并引用-cpCLASSPATH环境变量才能导入(否则你得到编译错误包X不存在)。

编译后,当获得.class文件时,是否可以将这些文件传输到拥有javax.websocket包的计算机,并在该计算机上安装JVM运行它们,还是有必要在两台计算机上安装包?

换句话说:当您撰写import bar.foo;时,您基本上是在写"每当您看到foo时,请转到此位置并查看它是什么。&#34 ; 。但是,当您编译了源代码时,字节代码是否仍然会说"转到此位置并查看它是什么" ,或者它已经到达该位置和& #34;进口"一切,以便不再需要这个位置?

2 个答案:

答案 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有点特别。 [...原始答案继续......]