如何为sbt-native-packager生成的脚本配置动态命令行参数?
解决sbt-native-packager中为application.ini添加自定义JVM参数(含Shell命令)的问题
我之前也碰到过几乎一模一样的需求,折腾了好一会儿才捋清楚靠谱的实现方式,给你分享两个实用方案:
方案一:通过build.sbt直接配置参数
sbt-native-packager的JavaAppPackaging插件会自动把javaOptions里的配置写入application.ini,你只需要在build.sbt里添加这段代码:
javaOptions ++= Seq( "-server", "-Xms256m", "-Xmx512m", "-Dcom.sun.management.jmxremote=true", "-Dcom.sun.management.jmxremote.port=1616", "-Dcom.sun.management.jmxremote.authenticate=false", "-Dcom.sun.management.jmxremote.ssl=false", "-Djava.rmi.server.hostname=$(getIpAddress)" )
注意:这里不需要加-J前缀——javaOptions本身就是用来定义JVM参数的,插件会自动处理这些参数并传递给Java命令。
关键补充:注入getIpAddress函数
因为$(getIpAddress)是Shell命令,你的启动脚本里必须存在这个函数才能正常执行。可以通过bashScriptExtraDefines把函数注入到生成的bash脚本中:
bashScriptExtraDefines += """ getIpAddress() { # 这里替换成你实际获取IP的逻辑,比如取第一个非本地IP: hostname -I | awk '{print $1}' } """
方案二:自定义application.ini模板
如果你想完全掌控application.ini的内容,可以直接创建自定义模板:
- 在项目根目录下新建
src/universal/conf文件夹 - 在该文件夹下创建
application.ini文件,写入你需要的内容:
-server -Xms256m -Xmx512m -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1616 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=$(getIpAddress)
打包时,插件会优先使用你自定义的模板,覆盖默认生成的application.ini。同样别忘了通过上面的方式添加getIpAddress函数。
验证方式
打包完成后运行启动脚本,然后用jps -v命令查看对应进程的JVM参数,确认所有配置都已正确加载,且java.rmi.server.hostname的值是你期望的IP地址。
内容的提问来源于stack exchange,提问作者Toby
相关产品推荐
相关产品推荐

