如何将打包为Jar的Scala代码导入另一个IntelliJ SBT项目?
嘿,我来帮你一步步搞定这个问题——把这段Scala代码打包成Jar,再导入到另一个IntelliJ的SBT项目里,其实很简单,分两大步走就行:
第一步:把你的代码打包成Jar包
首先,你得先把这段代码放到一个标准的SBT项目结构里(手动单个文件打包太麻烦,用SBT是最省心的选择)。项目结构得是这样的:
my-greeting-lib/ ├── build.sbt └── src/ └── main/ └── scala/ └── yyy/ └── Hello.scala // 把你的代码全放这里就行,或者把Greeting trait单独拆成文件也可以
然后在build.sbt里写最基础的配置(注意Scala版本要和你后续要导入的目标项目版本一致,不然会有兼容性坑):
name := "my-greeting-lib" version := "1.0.0" scalaVersion := "2.13.12" // 替换成你目标项目用的Scala版本,比如2.12.x或者3.x
接下来打包:
- 要么在IntelliJ里打开这个项目,找到右侧的SBT面板,双击
package任务 - 要么直接在项目根目录打开终端,运行
sbt package
打包完成后,Jar包会出现在target/scala-2.13/my-greeting-lib_2.13-1.0.0.jar这个路径里(路径里的Scala版本号对应你build.sbt里写的版本)。
第二步:把Jar包导入到目标IntelliJ SBT项目
这里有两种常用方式,选哪种看你的需求:
方式一:直接丢到项目的lib文件夹(简单粗暴,适合临时用)
- 打开你的目标SBT项目,在根目录新建一个
lib文件夹(如果还没有的话) - 把刚才生成的Jar包复制进去
- 回到IntelliJ,右键点击项目,选择
SBT -> Refresh SBT Projects - 完事!现在你就能直接在目标项目里引用代码了,比如:
import yyy.Greeting object TestApp extends App { val greet = new Greeting {} println(greet.greeting) }
方式二:发布到本地仓库,用SBT依赖引入(更规范,适合需要频繁更新库的情况)
如果以后你还要改这个库的代码,这种方式不用每次都复制Jar,更方便:
- 在打包项目的
project文件夹下新建plugins.sbt,添加(其实本地发布不用签名,不过有些SBT版本可能需要这个插件):
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.2.1")
- 回到打包项目根目录,运行
sbt publishLocal——这个命令会把你的库发布到本地Maven/Ivy仓库(一般在~/.m2/repository或者~/.ivy2/local) - 然后在目标项目的
build.sbt里添加依赖:
// 如果你没在打包项目里指定organization,默认是default libraryDependencies += "default" % "my-greeting-lib_2.13" % "1.0.0" // 要是你在打包项目的build.sbt里加了organization := "com.yourname",那依赖就写成: // libraryDependencies += "com.yourname" % "my-greeting-lib_2.13" % "1.0.0"
- 最后刷新IntelliJ的SBT项目,就能愉快地引用这个库了!
几个要注意的坑
- 一定要保证打包项目和目标项目的Scala版本完全一致,不然会出现找不到类或者兼容性错误
- 你的代码没有额外依赖,所以用
sbt package生成的Jar就够了;如果以后你的库有依赖,要生成包含所有依赖的Fat Jar,就得用sbt assembly插件 - 用方式一的话,Jar包放在lib文件夹后,SBT会自动识别,不用额外配置
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

