在没有sbt的情况下运行sbt创建的应用程序
这是某个问题的后续行动。
当我使用sbt创建Scala包时,我可以使用以下方法之一运行它:
-
只需在sbt控制台中键入
run
即可 -
或者通过创建一个jar文件(使用
one-jar
或assembly
),并通过键入java -jar myjar.jar
在系统控制台中运行此jarjava -jar myjar.jar
但我不知道该怎么做
-
从scala程序运行我的包? (不是sbt scala控制台,通过输入
import mypackage._
可以正常工作) -
在另一个项目中使用我的Scala包? 例如,通过在另一个项目中导入
myjar
?
编辑 :你可以忘记我下面关于sbt-start-script
因为现在我正在使用sbt-native-packager
(我刚试过它并且它有效,但我以前的问题仍未解决)。
我试过使用sbt-start-script但不成功。 target/start
脚本创建良好但我得到了这样的错误:
$ sh target/start target/start: 2: target/start: Bad substitution Exception in thread "main" java.lang.NoClassDefFoundError: Hi Caused by: java.lang.ClassNotFoundException: Hi ...
这里我只在src/main/scala
文件夹中有一个main.scala
文件,它是:
object Hi { def main(args: Array[String]) = println("Hi!") }
我在build.sbt
使用这些设置:
import com.typesafe.sbt.SbtStartScript seq(SbtStartScript.startScriptForClassesSettings: _*)
有几种方法可以在另一个项目中使用您的项目。 我不会讨论发布到远程存储库,因为这可能是你不想做的事情(至少在这个时间点)。
让我们假设您有一个名为projectA的项目 – build.sbt
就是这样的:
name := "project-a" organization := "com.acme" version := "0.1.0"
你有另一个名为projectB的项目,你想在projectA中定义类。
非托管依赖
最简单的方法之一是将其用作非托管依赖项 。 您可以通过将package
, assembly
或任何其他命令生成的jar
文件放入生成assembly
。
本地存储库
使用依赖关系的另一种方法是将其发布到本地存储库。 给定上面定义的projectA ,到build.sbt
的build.sbt ,添加一个依赖项
libraryDependencies += "com.acme" %% "project-a" % "0.1.0"
现在,您可以通过在projectA中执行publishLocal
将projectA发布到本地存储库。 这种方法的优点是,如果您的projectA声明了任何依赖项,它们将被添加为projectB的传递依赖项 。
项目依赖
我想到的最后一种方法是直接在projectA上声明依赖。 你可以通过在build.sbt
中创建一个build.sbt
文件来做到这一点 ,它看起来或多或少是这样的
lazy val projectA = file("/home/lpiepiora/q-23607291/projectA") lazy val projectB = project in file(".") dependsOn projectA
现在在projectA中声明的类应该在projectB中可见。