当前位置: 首页 > 知识库问答 >
问题:

来自具有sbt程序集的单个项目的具有不同外部依赖关系的多个可执行jar文件

宿楚青
2023-03-14

我有一个使用sbt构建的scala项目。scala文件。我可以使用sbt assembly从这个项目中毫无问题地生成一个可执行的jar文件。现在,我想生成多个可执行jar文件,其中每个文件包括一组公共的内部和外部基本依赖项以及不同的外部依赖项。

在maven中,这很简单,因为可以在pom中定义多个配置文件,每个配置文件都生成一个单独的jar,但是在sbt-汇编中,您将程序集设置传递给您的项目,我还没有找到修改设置以生成多个jar文件的方法。

共有1个答案

华宣
2023-03-14

Maven剖面的概念在sbt/Ivy中被翻译为配置。您可以在配置中定义设置,并让sbt程序集生成两个JAR。您可以通过添加“config”将库依存关系添加到特定配置中。然而,这需要项目预先了解配置。

在构建中。sbt(需要sbt 0.13.0或以上):

import AssemblyKeys._

val Dispatch10 = config("dispatch10") extend(Compile)
val TestDispatch10 = config("testdispatch10") extend(Test)
val Dispatch11 = config("dispatch11") extend(Compile)
val TestDispatch11 = config("testdispatch11") extend(Test)

val root = project.in(file(".")).
  configs(Dispatch10, TestDispatch10, Dispatch11, TestDispatch11).
  settings( 
    name := "helloworld",
    organization := "com.eed3si9n",
    scalaVersion := "2.10.2",
    compile in Test := inc.Analysis.Empty,
    compile in Compile := inc.Analysis.Empty,
    libraryDependencies ++= Seq(
      "net.databinder.dispatch" %% "dispatch-core" % "0.10.0" % "dispatch10,testdispatch10", 
      "net.databinder.dispatch" %% "dispatch-core" % "0.11.0" % "dispatch11,testdispatch11",
      "org.specs2" %% "specs2" % "2.2" % "test",
      "com.github.scopt" %% "scopt" % "3.0.0"
    )
  ).
  settings(inConfig(Dispatch10)(Classpaths.configSettings ++ Defaults.configTasks ++ baseAssemblySettings ++ Seq(
    test := (test in TestDispatch10).value,
    test in assembly := test.value,
    assemblyDirectory in assembly := cacheDirectory.value / "assembly-dispatch10",
    jarName in assembly := name.value + "-assembly-dispatch10_" + version.value + ".jar"
  )): _*).
  settings(inConfig(TestDispatch10)(Classpaths.configSettings ++ Defaults.configTasks ++ Defaults.testTasks ++ Seq(
    internalDependencyClasspath := Seq((classDirectory in Dispatch10).value).classpath
  )): _*).
  settings(inConfig(Dispatch11)(Classpaths.configSettings ++ Defaults.configTasks ++ baseAssemblySettings ++ Seq(
    test := (test in TestDispatch11).value,
    test in assembly := test.value,
    assemblyDirectory in assembly := cacheDirectory.value / "assembly-dispatch11",
    jarName in assembly := name.value + "-assembly-dispatch11_" + version.value + ".jar"
  )): _*).
  settings(inConfig(TestDispatch11)(Classpaths.configSettings ++ Defaults.configTasks ++ Defaults.testTasks ++ Seq(
    internalDependencyClasspath := Seq((classDirectory in Dispatch11).value).classpath
  )): _*)

要在配置中运行程序集任务,您可以说:

> dispatch11:assembly
[info] HelloWorldSpec
[info] 
[info] The 'Hello world' string should
[info] + contain 11 characters
[info] 
[info] Total for specification HelloWorldSpec
[info] Finished in 17 ms
[info] 1 examples, 0 failure, 0 error
[info] Passed: Total 1, Failed 0, Errors 0, Passed 4
[info] Including: scopt_2.10-3.0.0.jar
[info] Including: slf4j-api-1.6.2.jar
[info] Including: netty-3.6.3.Final.jar
[info] Including: scala-library.jar
[info] Including: async-http-client-1.7.16.jar
[info] Including: dispatch-core_2.10-0.11.0.jar
[warn] Merging 'META-INF/NOTICE.txt' with strategy 'rename'
[warn] Merging 'META-INF/license' with strategy 'rename'
[warn] Merging 'META-INF/LICENSE.txt' with strategy 'rename'
[warn] Merging 'META-INF/MANIFEST.MF' with strategy 'discard'
[warn] Strategy 'discard' was applied to a file
[warn] Strategy 'rename' was applied to 3 files
[info] Checking every *.class/*.jar file's SHA-1.
[info] SHA-1: xxxxxxxxxxxx
[info] Packaging /Users/foo/helloworld/target/scala-2.10/helloworld-assembly-dispatch11_0.1-SNAPSHOT.jar ...
[info] Done packaging.
 类似资料:
  • 我有以下项目结构: 问题: 如何在项目2中执行类? 来自哪个项目? 如果我只想编译/打包 project2,我该怎么做?(如果我从项目2中执行,则找不到项目1)。我想在不安装项目1的情况下执行此操作。 当然,如果需要的话,项目的结构可以改变。 下面显示了pom.xml文件中的相关部分。父/砰.xml 父/项目1/pom.xml 父/项目2/pom.xml 父/项目3/pom.xml与项目2相似

  • 我是和的新手。我正在尝试在远程计算机上运行hdfs MapReduce作业。我没有写入/编辑依赖项文件的权限。我想知道是否可以将我的Maven项目传递给我的MapReduce作业。这样,我就不需要SSH进入远程机器并更改maven项目的依赖关系。我将使用包含远程计算机上未包含的所有所需依赖项的JAR来运行我的MapReduce作业。

  • 在处理过程中,我想导入一个我用Java编写的库,它环绕一个外部库(一个.jar文件)。 update2:另一个有效的选项是“将所需库提取到生成的JAR中”。这样做允许JAR在内部访问引用。这似乎同样适用于N.L.Telaviv的建议,但情况似乎并非如此。如果不想有任何额外的文件,请选择此选项。如果查看.jar文件,您会注意到外部库位于一个单独的包文件夹中。

  • 我正在使用war插件为我在Gradle中的项目生成一个简单的.war文件。我想知道如何配置gradle,这样我就可以创建4个不同的.war文件,这些文件具有不同的依赖关系。 null 下面的示例创建了一个只包含一个jar的war文件,但我希望使用不同的jar生成5个不同的.war文件。 Build.Gradle

  • 问题内容: 这是我目前拥有的并且可以正常工作: 现在,我想添加另一个依赖项。我将其更改为: 但是现在我收到此错误消息: FragmentFacebookLoginComponent依赖于多个作用域组件 我该如何解决?我如何有多个依赖关系? 如果我从一个组件中删除范围,则会收到此错误消息: AnotherComponent(无作用域)不能依赖范围内的组件 问题答案: 最后,我创建了一个具有正确范围的

  • 我需要支持一个涉及以下实体的场景(使用JPA): 用户 一个用户可以有多个帐户,一个帐户可以在多个用户之间共享,这是迄今为止的标准@ManyToMany关系。 一个用户可以为每个帐户拥有一组不同的角色,一个角色可以在多个用户之间共享。 我遵循了这个实践,它解释了一种用额外列映射多对多关联的方法,但我不确定我是否得到了它。 用户实体: 账户实体: 用户帐户实体: 用户帐号: 我正在创建一个新用户并尝