scala 代码怎么用 Java 编译的?

how come scala code gets compiled with Java?

我正在尝试了解 Scala 代码如何与 Java 的 IDE 中的 Java 一起工作。我在使用 Spark Java 时遇到了这个疑问,我在代码中也看到了 Scala 包并使用了相应的 classes 和方法。

我的理解是,Scala 代码需要 Scala 的编译器转换成 Java.class 文件,然后从它们开始 JDK 在 JVM 中完成它的部分转换成二进制文件并执行操作。如有不妥请指正

之后,在 eclipse 中我的 spark Java 项目中,我看不到指向 scala 编译器的任何地方。

这是我的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spark</groupId>
  <artifactId>Project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath />
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> 
                </exclusion> </exclusions> -->
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql-kafka-0-10_2.12</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- Gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
            <scope>provided</scope>
        </dependency>

        <!-- Avro Messages -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-avro_2.12</artifactId>
            <version>3.1.2</version>
        </dependency>

        <!-- Spark MLLIB -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_2.12</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.codehaus.janino/janino -->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>commons-compiler</artifactId>
        </dependency>
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!--Spark java.lang.NoClassDefFoundError: org/codehaus/janino/InternalCompilerException -->
            <dependency>
                <groupId>org.codehaus.janino</groupId>
                <artifactId>commons-compiler</artifactId>
                <version>3.0.16</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.janino</groupId>
                <artifactId>janino</artifactId>
                <version>3.0.16</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>  
</project>

例如,我在 Java class 文件中使用以下 scala 导入。但是从字面上看,并没有从哪个 Jars 中获取想法以及将其编译到 Java.class 以供进一步处理。

import scala.collection.JavaConverters;

任何人都可以帮助我理解这个对我来说未知的魔法吗?

依赖项以 class 文件形式发布。那JavaConvertersclass确实一定是scalac编的。然而,janino 的维护者已经在他们的硬件上完成了这个,将编译后的结果发送到 mavencentral 的服务器,后者将它分发到所有镜像,这就是它最终出现在你系统磁盘上的方式,这就是你 不这样做的原因 需要 scalac 才能使用。

罐子,他们只有编译文件。他们不会有源文件。如果您使用任何依赖项,它不是源代码,而是编译输出。因此,在您的情况下,JavaConverters 也已编译。它来自 scala.collection 包,这是一个内置包。

我可以知道您的系统上安装了 Scala 吗?