在没有sbt的情况下运行sbt创建的应用程序

这是某个问题的后续行动。

当我使用sbt创建Scala包时,我可以使用以下方法之一运行它:

  • 只需在sbt控制台中键入run即可

  • 或者通过创建一个jar文件(使用one-jarassembly ),并通过键入java -jar myjar.jar在系统控制台中运行此jar java -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中定义类。

非托管依赖

最简单的方法之一是将其用作非托管依赖项 。 您可以通过将packageassembly或任何其他命令生成的jar文件放入生成assembly

本地存储库

使用依赖关系的另一种方法是将其发布到本地存储库。 给定上面定义的projectA ,到build.sbtbuild.sbt ,添加一个依赖项

 libraryDependencies += "com.acme" %% "project-a" % "0.1.0" 

现在,您可以通过在projectA中执行publishLocalprojectA发布到本地存储库。 这种方法的优点是,如果您的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中可见。