【发布时间】:2012-01-07 22:30:36
【问题描述】:
过去,我曾使用 Ant+Ivy 或 Maven 来构建我的 Java 项目。 我现在正在研究基于非 xml 的解决方案。
Gradle 可以编译、打包和发布我的项目,而且问题很少。
我可以对 SBT 做同样的事情吗? 如果是这样,您能否提供一个使用 sbt 构建纯 java 项目的简单示例。
【问题讨论】:
过去,我曾使用 Ant+Ivy 或 Maven 来构建我的 Java 项目。 我现在正在研究基于非 xml 的解决方案。
Gradle 可以编译、打包和发布我的项目,而且问题很少。
我可以对 SBT 做同样的事情吗? 如果是这样,您能否提供一个使用 sbt 构建纯 java 项目的简单示例。
【问题讨论】:
是的,这是完全可能的。没有什么需要设置的,一个小的 build.sbt 文件就可以解决问题,比如:
organization := "your.group.id"
name := "Your project"
version := "1.0-SNAPSHOT"
libraryDependencies ++= Seq( <any normal jar deps> )
然后从命令行运行sbt package。
【讨论】:
sbt package 似乎不再需要(除非我错过了一些东西); scala-sbt.org/release/docs/Detailed-Topics/Java-Sources 甚至都没有提及。
sbt package 将生成一个包含您构建的源的 jar...安装时不需要也永远不需要它。
package 不包括依赖项。该项目是否可以在 SBT 中进行测试和运行?是的,这是在所描述的配置中开箱即用的唯一方法。
对我来说,它还有助于从生成的工件路径中删除 scala 版本信息,如 this answer 中所述。您还需要将 Scala 库作为依赖项从您发布的任何 pom 或 ivy 文件中删除。
这是您需要的:
crossPaths := false
autoScalaLibrary := false
【讨论】:
autoScalaLibrary := false 删除了 Scala 依赖项。
在Xerial blog 有一个纯 Java 源代码的 build.sbt 很好的例子,包括如何发布没有 Scala 版本标签的 Maven 风格的工件。
【讨论】:
当然可以。示例配置:
name := "myName"
version := "0.1"
organization := "org.myorganization"
javacOptions in (Compile, compile) ++= Seq("-source", "1.8", "-target", "1.8", "-g:lines")
crossPaths := false // drop off Scala suffix from artifact names.
autoScalaLibrary := false // exclude scala-library from dependencies
总结。我喜欢 SBT,但我觉得有必要编写完整的构建版本,其中包含在 java 中使用它的所有棘手部分。请注意,此设置可能比 maven 设置更好,因为您将拥有很好的功能,例如增量测试甚至增量运行。如果您有依赖项并想要创建胖 jar(可执行文件),也可以考虑添加 sbt-assembly 插件。
【讨论】: