如何通过sbt运行sbt包生成的jar

时间:2019-07-17 00:19:46

标签: scala sbt

我有一个运行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中包含的配置文件的唯一方法

1 个答案:

答案 0 :(得分:1)

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

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

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

# 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