百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

使用 VS Code 搭建 java + scala 开发环境

lipiwang 2024-11-22 17:19 5 浏览 0 评论

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

安装好后 配置环境变量

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-sourcesrc/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 corespark 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 ,针对具体的错误去解决问题;

相关推荐

前端 JavaScript 字符串中提取数字

varstr="4500元";varnum=parseInt(str);alert(num);//4500如果字符串前面有非数字字符,上面这种方法就不行了:var...

使用JavaScript如何获取网站网址(js如何获取浏览器信息)

在做网站开发时,我们有时候会获取当前页面的完整路径。在网页前端如何实现呢?请在网页脚本代码段中粘贴如下代码。functiongetRootPath(){//获取当前网址,...

java文本对比工具源码8(java比较文本相似度)

/***ParseatextualrepresentationofpatchesandreturnaListofPatch*objects.*@paramtextline...

JavaScript实现的9大排序算法(js排序方法)

笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。1、插入排序1)算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通...

使用函数化的Javascript代码编写方式

对于Javascript介绍想必大家都耳熟能详啦,基于函数化的编程语言,基于浏览器运行的编程语言,web开发语言,前端开发必备语言,blablabla...Javascript是一个非常灵...

Js基础31:内置对象(js内置对象是什么意思)

js里面的对象分成三大类:内置对象ArrayDateMath宿主对象浏览器提供的对象(如bom、dom等等)自定义对象开发人员自己定义的对象内置对象——所谓内置对象,就是JavaScript自...

js获取上传文件类型以及大小的方法

前端web上传文件时,需要在上传之前判断一下文件的类型以及文件的大小,HTML为前端的标记语言是无法做到这一点,只能使用javascript动态脚本代码来实现。js获取上传文件大小的方法示例代码:&...

黑客入门实践:如何绕过前端过滤上传文件

今天开始,我们就要开始学习具体的漏洞了,但是希望大家学完后,不要轻易"入侵"网站哦,当时测试环境下除外。今天的课程是关于“文件上传漏洞”,据安界网的老师介绍,文件上传漏洞仅次于命令执行...

Java文件上传细讲(java文件夹上传)

什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。免费学习资料获取方式上传组件(工具)为什么我们要使用上传工具...

鸿蒙上实现“翻译”功能(鸿蒙宴全文翻译)

本章节我们来制作中文翻译成英文的实例(运行在HarmonyOS上),通过HTTP去配合API进行实现。需求分析如下:文字输入HTTP协议使用文字翻译控件介绍①HTTP数据请求官方文档请求...

JavaScript从入门到精通(javascript 入门教程)

前几天,我们学习了JavaScript的入门课程,但是要想做网站,仅仅学会入门是不够的,今后的几天,我将带领大家精通JavaScript,希望大家好好学习!JS内置对象String对象:字符串对象,提...

第15天|16天搞定前端,javascript语法篇(干货)

JavaScript是互联网上最流行的脚本语言,这门语言可用于HTML和web,可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。它是一个脚本语言,它是一个轻量级,但功能强大的编程...

通过js来实现打字效果(js如何输入)

有时候浏览网页经常会看见一些页面出现一些打字的效果,那么是怎么实现的呢?逻辑确定目标容器,在哪个容器进行输出确定输出内容,当前直接根据目标容器确定输出内容即可需要控制输出频率,因此需要循环输出完毕代码...

手把手教你学会一键还原混淆js原理

1.短变量名在以下示例代码中,我们将变量“customerName”替换为“a”:vara="JohnSmith";console.log(a);2.随机变量名在以下示例代码...

sql中常用的字符串函数详解(sql字符串函数有哪些)

在日常开发中遇到处理最多的可能字符串要算其中一个了,什么替换啊截取啊大小写转换啊、删除空格啊等等,这些操作我们可以在前端操作,也可以直接在数据库的sql中操作,那么我们来看一下sql中处理字符串的...

取消回复欢迎 发表评论: