scala 和 java - noonecare/spark GitHub Wiki

scala 和 Java 的编译结果都是运行在 JVM 上的字节码。

Java 的包可以直接用到 Scala 中, Scala 像是简洁版的 Java。

路径

关于路径问题,明显在命令行下更容易发现问题。

  • Java 运行时的 classpath。
  • CLASSPATH 环境变量
  • -cp(-classpath)
    • 通配符
  • Java/Scala 包与路径的关系。
  • 如果你要引入 a.b.c 资源, 那么 java 的 ClassLoader 遍历 ${directory_in_classpath}/a/b 目录去寻找 c。如果能找到引入到程序中,如果找不到报找不到资源(一般是类或者文件)的错误。( ${directory_in_classpath} 是任何一个在 CLASSPATH 环境变量中的目录 )
  • java a.b.c 一定是去 ${direcotry_in_classpath}/a/b 中去寻找 c 类。如果你没有把c类放到指定的${directory_in_classpath}/a/b 目录下,你就找不到这个类。
  • 在 java 中运行 this.getClassLoader().getResource("a.b.c") 一定是去 ${directory_in_classpath} 中需要 c, 如果找不到会报错。
  • 请一定遵守包名与路径的对应关系。
  • 运行 Java/Scala jar 包,和解压 jar 包后在当前路径执行的区别。
  • 比如你要用 A.jar 中的 a 文件,那么 a 文件的路径是 A!/a, 如果你没有解压是 A/a。 如果你执行:
import java.io.File
val file = new File("A!/a")

程序会出错。这就是打包之后执行和打包之前执行的最大区别。正因为这一点区别,如果我们的配置文件是放在 jar 包中,最好直接使用

this.getClass().getClassLoader().getResourceAsStream("a")

这种方式,直接就把 a 文件读进来了,免去 ! 对路径的影响。