前言
intellij Idea
真香,yyds。不过由于公司开发环境限制(付费软件、资源占用高等 因素 ??? )加上个人技术栈上的扩展(需要多个IDE)并且这几年 vs code
也很火,插件也越来越成熟,足以满足大多数开发需求。因为笔者主要从事大数据相关的开发,项目代码 以 java + scala
混写,采用 maven 编译打包
,在配置vs code 开发环境中,还是遇到不少小坑,便记录如下 :
0x 01、安装软件与环境 vscode、jdk、scala
1.1 vs code 官网下载 安装
下载地址:https://code.visualstudio.com/
插件安装
点击右边栏的 扩展(ctrl+shfit+x)
打开插件管理界面;
笔者安装的插件列表如下:
- Chinese (Simplified) (简体中文) Language Pack
- Extension Pack for Java
- Scala (Metals)
- Scala Snippets
- Scala Syntax (official)
- Scaladex search
- XML
1.2 jdk 安装与配置
jdk 这里要选者jdk 11的版本(Extension Pack for Java 插件要求,不能选择 jdk8 😂)
https://www.openlogic.com/openjdk-downloads
https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15+10/OpenJDK11U-jdk_x64_linux_hotspot_11.0.15_10.tar.gz
安装好后 配置环境变量
JAVA_HOME
=安装目录 并且把 %JAVA_HOME%/bin 配置到 PATH
变量中
maven 下载地址 : https://maven.apache.org/
maven 的配置比较简单,只需要有JAVA_HOME
的存在,然后再把 安装后的 bin目录 配置到 PATH
变量中。
maven 默认仓库比较慢,可以配置 阿里云镜像仓库,修改 maven 主目录下 settings.xml
添加如下配置
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
1.3 scala 安装
官网下载scala 2.12.12(目前 spark、flink 支持比较好得还是 2.11与2.12)直接安装即可。
0x 02、maven 基础工程搭建
在实测中,maven for java
相对成熟,一次过,然后maven for scala 中途大大小小遇到不少问题,因此这里采用先创建一个标准 scala maven 工程
,然后在 手动扩展成 java + scala
得方式,最后我们可以把这个 pom 打包成自己的模板,下次直接创建就行了。
2.1 创建 scala maven 工程
1、使用 metals > new scala project > scalameta/maven-scala-seed.g8
2、创建好工程后,需要安装一个maven 组件 mvn ch.epfl.scala:maven-bloop_2.10:<bloop_version>:bloopInstall.
这一步 在 metals 官方文档
中提到过,但我一开始这里出点问题,反反复复的 试了好多次才成功。
具体操作为 在当前工程目录
下 打开 终端
,然后执行如下命令:
mvn ch.epfl.scala:maven-bloop_2.13:1.5.0-18-003e6c7b:bloopInstall -DdownloadSources=true
如果运行结果报错,可能原因有如下:
1、JAVA_HOME, PATH 配置问题:提示命令找不到
2、提示 NoClassDefFoundError: scala_maven/ScalaContinuousCompileMojo
。 这里可能是版本问题,也可能是 本地缓存的maven 包问题,处理方式 是
a、清理 user/.m2/repository/ch/ 本地缓存
b、查看项目 中的 pom.xml
,修改 scala-maven-plugin version
版本为 4.6.2(当前最新)
c、更换 maven-bloop_2.13:1.5.0-18-003e6c7b
版本, 笔者一开始 是用的1.5.0-22-x版本一直报错,后面更换到 18版本 解决,具体可以查看 maven repository,可换版本尝试
https://mvnrepository.com/artifact/ch.epfl.scala/maven-bloop
3、应用 metals 的 import build
功能
此处可能引发的报错为 ERROR Opening a bsp server connection with 'bsp --protocol tcp --port
笔者的解决办法是 通过设置 metals 的 java home 解决
4、若上述操作顺利的化,咱们进入到资源管理 进行的编码运行测试
笔者这里简单的添加一些测试代码,并添加了 fastjson maven包,可以看到,Hello.Scala 上面有一个 run|debug
标识的,在这里 直接点击 run 就可以运行了,是不是也很方便?
需要注意的是 当在pom.xml 中添加了 dependency 后,需要在执行一次 import build
,这样编辑器界面 导入包 才有提醒 。
2.2 maven 同时支持 java 和 scala 混合打包
1、build-helper-maven-plugin 插件
作用:通过 add-source
将 src/main/scala
也加入到 源代码,实现 java 和 scala 分别都作为源代码目录 直接执行与编译
2、maven-assembly-plugin 插件
作用:将所有依赖 打成一个 fat jar 包(在大数据场景比较实用,直接整体打包为一个可执行包,避免不同应用间的依赖管理 和jar 冲突)
完整的 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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>maven-scala-java</artifactId>
<version>1.0-SNAPSHOT</version>
<name>maven-scala-java</name>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.12.12</scala.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src/main/scala</source>
</sources>
</configuration>
</execution>
<execution>
<id>add-test-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>src/test/scala</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>4.6.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.RunJob</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3、整体项目结构
通过 执行命令 : maven clean package
可以看到target 目录下生成了 xxx-1.0-SNAPSHOT-jar-with-dependencies.jar
即我们需要的可直接执行的jar 包。
0x 03、vs code 本地开发 spark/flink 程序
完成上诉后 其实也很简单了,这里就挑关键部分简短说明:
3.1 pom.xml 配置
核心就是 spark core
与 spark sql
选择自己需要的版本,至于其他组件 如 stream,ml,graphx 等按需
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
</dependency>
3.2 代码编写
核心逻辑就是创建 SparkSession
的时候 mater 选择 local[*]
即可本地直接运行调试
可以看到调试控制台 spark 跑得很欢快。flink 类似,不做赘述。
总结:
得益于强大得 metals
,使得编程体验 还不错,基本上能覆盖日常开发办公得需求。当然 整体得工程体验 对比 idea 还是有些差距,idea集成性和易用性更好,不过个人觉得用vs code 也还可以,能干活,问题不大。 本文并没有完整的体现出 vs code 的特性
。准备在下篇中,在服务器上安装 code server
(vscode 浏览器版本)这样子 实现 WebIDE 的功能,代码和环境都在远端服务器上,本地只需要一个 浏览器就可以访问、编码、测试,想想还是挺爽的(jetbrains 也有类似的方案 jetbrains projector)
需要特别注意得点:
1、每次修改 pom.xml 后需要 重新 执行 import build
;
2、如果执行 import build
报错,要仔细检查 .metals/metals.log
,针对具体的错误去解决问题;