如何使用 sbt 和 sbt-release 发布胖 JAR(具有依赖项的 JAR)? [英] How do I publish a fat JAR (JAR with dependencies) using sbt and sbt-release?

查看:44
本文介绍了如何使用 sbt 和 sbt-release 发布胖 JAR(具有依赖项的 JAR)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要为我的一个子项目构建一个单独的 jar,包括依赖项,以便它可以用作 javaagent.

我有一个多模块的 sbt 项目,这个特定的模块是最低级别的(它也是纯 Java 的).

我可以吗(例如使用 sbt-onejarsbt-proguardsbt assembly) 覆盖最低级别的模块是如何打包的?

看起来这些工具真的被设计为发布后的步骤,但我真的需要一个(替换或额外的)已发布的人工制品来包含依赖项(但仅限于这个模块).

更新: 发布 sbt-assembly 是针对单个项目的指令,不容易转化为多项目.

解决方案

sbt-assembly 的发布是针对单个项目的说明,不容易转化为多项目.

人们一直在使用 sbt-assembly & 发布胖 JAR.sbt-release 没有问题.这是 2011 年的一篇博客文章:发布由 sbt 创建的 fat jar-组装.它归结为将 addArtifact(Artifact(projectName, "assembly"), sbtassembly.AssemblyKeys.assembly) 添加到您的 build.sbt (注意博客有点出日期 AssemblyKeys 现在直接成为 sbtassembly 的成员).

对于 sbt 0.13 及以上版本,我更喜欢将 build.sbt 用于多项目,所以我会这样写:

import AssemblyKeys._懒惰 val commonSettings = Seq(版本:=0.1-快照",组织:=com.example",斯卡拉版本:=2.10.1")val app =(文件中的项目(app")).设置(通用设置:_*).设置(程序集设置:_*).设置((编译,组装)中的工件 ~= { art =>art.copy(`classifier` = Some("assembly"))}).设置(addArtifact((编译,组装),组装中的工件).设置:_*)

请参阅定义自定义工件::><块引用>

addArtifact 返回一系列设置(包含在 SettingsDefinition 中).在完整的构建配置中,用法如下:

<代码>...懒惰的 val proj = 项目(...).settings( addArtifact(...).settings : _* )...

I need to build a single jar, including dependencies, for one of my sub-projects so that it can be used as a javaagent.

I have a multi-module sbt project and this particular module is the lowest level one (it's also pure Java).

Can I (e.g. with sbt-onejar, sbt-proguard or sbt assembly) override how the lowest level module is packaged?

It looks like these tools are really designed to be a post-publish step, but I really need a (replacement or additional) published artefact to include the dependencies (but only for this one module).

UPDATE: Publishing for sbt-assembly are instructions for a single project, and doesn't easily translate into multi-project.

解决方案

Publishing for sbt-assembly are instructions for a single project, and doesn't easily translate into multi-project.

People have been publishing fat JAR using sbt-assembly & sbt-release without issues. Here's a blog article from 2011: Publishing fat jar created by sbt-assembly. It boils down to adding addArtifact(Artifact(projectName, "assembly"), sbtassembly.AssemblyKeys.assembly) to your build.sbt (note that the blog is a little out of date AssemblyKeys is now a member of sbtassembly directly).

For sbt 0.13 and above, I prefer to use build.sbt for multi-projects too, so I'd write it like:

import AssemblyKeys._

lazy val commonSettings = Seq(
  version := "0.1-SNAPSHOT",
  organization := "com.example",
  scalaVersion := "2.10.1"
)

val app = (project in file("app")).
  settings(commonSettings: _*).
  settings(assemblySettings: _*).
  settings(
    artifact in (Compile, assembly) ~= { art =>
      art.copy(`classifier` = Some("assembly"))
    }
  ).
  settings(addArtifact(artifact in (Compile, assembly), assembly).settings: _*)

See Defining custom artifacts:

addArtifact returns a sequence of settings (wrapped in a SettingsDefinition). In a full build configuration, usage looks like:

...
lazy val proj = Project(...)
  .settings( addArtifact(...).settings : _* )
...

这篇关于如何使用 sbt 和 sbt-release 发布胖 JAR(具有依赖项的 JAR)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆