我有一个运行sbt package
我已经在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中包含的配置文件的唯一方法
答案 0 :(得分:1)
在sbt run
和runMain
中,使用包含所有依赖项的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