编译和运行时是否需要指定间接导入的包?

时间:2017-10-10 00:51:49

标签: java

如果.java文件导入包A,而后者又导入另一个包B

  • 当我编译.java文件以在命令行中使用javac获取其.class文件时,是否需要在-cp之后指定B.class的路径作为A.class的路径?

  • 当我在命令行中使用java运行.class文件时,是否需要在-cp之后指定B.class的路径以及{{{}的路径1}}

From an example of junit test,编译测试不需要将hamcrest指定为A.class,而运行测试则需要。是关于编译“否”的第一个问题的答案,以及关于运行“是”的第二个问题的答案?

感谢。

1 个答案:

答案 0 :(得分:0)

  
      
  • 当我编译.java文件以在命令行中使用javac获取其.class文件时,是否需要在-cp之后指定B.class的路径以及路径到A.class
  •   

是。编译.java文件时,编译器需要查找该文件导入的所有符号(类)。因此,如果您的.java文件导入类A,则类加载器需要加载它。如果A类导入了B类,那么类加载器也需要加载它。这是递归发生的。

类加载器如何知道在哪里找到类? 它在类路径中搜索类。 如果它在类路径上找不到东西, 它将无法继续并引发错误。

  
      
  • 当我在命令行中使用java运行.class文件时,是否需要在-cp之后指定B.class的路径以及A.class的路径?
  •   

是的,原因与前一点完全相同。

  

From an example of junit test,编译测试不需要将hamcrest指定为javac -cp,同时运行测试。

运行测试时 你没有执行你的测试课, 你正在执行org.junit.runner.JUnitCore课程。 因此,您必须提供的依赖项不仅仅是测试类的依赖项, 还有org.junit.runner.JUnitCore的依赖, 在这个例子中是hamcrest。