首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过sbt运行sbt包生成的jar

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

Stack Overflow用户
提问于 2019-07-17 08:19:47
回答 1查看 471关注 0票数 1

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

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

代码语言:javascript
复制
mainClass in (Compile, packageBin) := Some("com.company.mysql.Main")
addCommandAlias("updatemysql", "runMain com.company.mysql.Main")

我试过了

代码语言:javascript
复制
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
代码语言:javascript
复制
sbt run update-mysql-assembly-0.1-SNAPSHOT.jar 

^即使在build.sbt中设置了主类,如上面的几行所示,也会得到No main class detected

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-18 17:18:17

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

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

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

代码语言:javascript
复制
# 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57066977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档