【问题标题】:How to run jar generated by sbt package via sbt如何通过sbt运行sbt包生成的jar
【发布时间】:2019-07-18 17:18:17
【问题描述】:

我有一个通过运行 sbt package 创建的 jar

我已经在 build.sbt 的 jar 中设置了主文件

mainClass in (Compile, packageBin) := Some("com.company.mysql.Main")
addCommandAlias("updatemysql", "runMain com.company.mysql.Main")

我试过了

sbt "runMain target/scala-2.12/update-mysql_2.12-0.1-SNAPSHOT.jar"
sbt target/scala-2.12/update-mysql_2.12-0.1-SNAPSHOT.jar com.company.mysql.Main
sbt target/scala-2.12/update-mysql_2.12-0.1-SNAPSHOT.jar:com.company.mysql.Main
sbt update-mysql-assembly-0.1-SNAPSHOT.jar/run

sbt run update-mysql-assembly-0.1-SNAPSHOT.jar 

^ 这给出了No main class detected,即使在 build.sbt 中设置了主类,如上面几行所示。

我需要通过 sbt 运行 jar,因为这是我知道如何使用 -Dpath.to.config.param=new_value 覆盖 jar 中包含的配置文件的唯一方法

【问题讨论】:

  • 你的意思是 java -Dpath.to.config.param=new_value -jar target/scala-2.12/update-mysql_2.12-0.1-SNAPSHOT.jar 之类的东西? (Java 参数在-jar 之前,程序参数在它之后)。
  • 是的,也可以

标签: scala sbt


【解决方案1】:

在 sbt runrunMain 中使用包含所有依赖项的类路径以及带有编译任务输出的文件夹 - 这意味着它们都没有将 JAR 作为参数。

我认为可以通过编写一个自定义任务来从 sbt 运行这个特定的 JAR,该任务将依赖于 package 任务的输出(即 JAR 文件路径值)并将其作为外部进程运行......尽管从问题似乎这不是实际问题。

实际的问题是运行带有传递给 JVM 的标志而不是程序本身的 JAR,这可以通过以下方式实现:

# clean assembly ensures that there is only 1 JAR in target
# update-mysql_2.12-*.jar picks the only JAR no matter what is its version
# -D arguments NEED to be passed before -jar to pass it to JVM and not the JAR
sbt clean assembly && \
java -Dpath.to.config.param=new_value -jar target/scala-2.12/update-mysql_2.12-*.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-08
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2013-09-14
    • 2021-08-15
    • 2018-10-25
    相关资源
    最近更新 更多