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 文件形式发布。那JavaConverters
class确实一定是scalac
编的。然而,janino 的维护者已经在他们的硬件上完成了这个,将编译后的结果发送到 mavencentral 的服务器,后者将它分发到所有镜像,这就是它最终出现在你系统磁盘上的方式,这就是你 不这样做的原因 需要 scalac
才能使用。
罐子,他们只有编译文件。他们不会有源文件。如果您使用任何依赖项,它不是源代码,而是编译输出。因此,在您的情况下,JavaConverters
也已编译。它来自 scala.collection
包,这是一个内置包。
我可以知道您的系统上安装了 Scala 吗?
我正在尝试了解 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 文件形式发布。那JavaConverters
class确实一定是scalac
编的。然而,janino 的维护者已经在他们的硬件上完成了这个,将编译后的结果发送到 mavencentral 的服务器,后者将它分发到所有镜像,这就是它最终出现在你系统磁盘上的方式,这就是你 不这样做的原因 需要 scalac
才能使用。
罐子,他们只有编译文件。他们不会有源文件。如果您使用任何依赖项,它不是源代码,而是编译输出。因此,在您的情况下,JavaConverters
也已编译。它来自 scala.collection
包,这是一个内置包。
我可以知道您的系统上安装了 Scala 吗?