【问题标题】:Is there a way to automatically package multiple main classes in the same SBT project with sbt-onejar?有没有办法用 sbt-onejar 在同一个 SBT 项目中自动打包多个主类?
【发布时间】:2014-01-04 16:08:03
【问题描述】:

我有一个 SBT 项目,其中包含多个带有main 的类,即MyClass extends App。当只有一个这样的类时,One-jar 可以正常工作。如果它找到多个类,它会提示我选择要打包的类:

> one-jar

Multiple main classes detected, select one to run:

 [1] com.smth.AppOne
 [2] com.smth.AppTwo

Enter number: 

我想配置 one-jar 来自动打包所有主类。在documentation 中,它将默认主类定义为mainClass in run in Compile,因此看起来它只需要一个值。

如果这不可能,我很好奇为什么不这样做。 :)

目前我只能想到一些技巧,例如为每个 jar 创建一个代理项目或在 SBT 中设置一个 mainClass,然后每次调用 one-jar(每次构建多次)。这些方法显然有其不足之处。

【问题讨论】:

    标签: scala sbt onejar


    【解决方案1】:

    来自文档:

    mainClass in oneJar := Some("com.acme.Woozler")
    

    尝试添加

    mainClass in oneJar := Some("com.smth.AppOne")
    

    在你的配置中

    【讨论】:

    • 这至少不能解决问题,因为我必须手动指定所有类名。此外,我认为它只会覆盖设置而不是添加到值的 Seq (虽然我没有尝试)。
    【解决方案2】:

    这与 SBT 或 onejar 插件无关。当您将项目打包到 jar 文件中时,两个主要类都将被打包。 JAR File specification 定义了您可以拥有任意数量的带有 main() 方法的类,但是每个 JAR 中的 Main-Class 属性中应该只有一个带有 main() 方法的类

    【讨论】:

    • 是的,所以我想要实现的是 onejar 为每个类创建一个 *.jar 文件,并在我的 src 中找到 main()。可能会发生 jar 相同的情况,但 Main-class attr 将在每个中设置为不同的值。 Onejar 可以清楚地发现这些候选人。我想要的只是 onejar 将每个包装在一个单独的 jar 中。
    • @AlekseyIzmailov 有一个任务discoveredMainClasses in Compile,让你的自定义任务依赖于它并为每个主类运行一个jar
    • 谢谢@Alexlv,我会试试的。我希望避免创建自定义任务:)。
    • @AlekseyIzmailov 如果您不想制作自定义任务,请执行一个简单的命令。您可以避免任务依赖并使用Project.runTask调用执行其他任务
    【解决方案3】:

    使用以下设置默认主类:

    mainClass in (Compile, run) := Some("com.smth.AppOne")
    

    来源:This stackoverflow Q&A

    【讨论】:

      【解决方案4】:

      我会尝试 sbt 多项目构建。您应该能够为每个项目设置一个主类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-21
        • 2014-10-28
        • 2021-10-04
        • 2011-10-22
        • 2013-08-07
        • 1970-01-01
        • 2015-11-24
        • 2018-06-25
        相关资源
        最近更新 更多