使用jpackage打包的macOS .app应用通过open命令启动时无法读取用户输入的解决方法咨询
使用jpackage打包的macOS .app应用通过open命令启动时无法读取用户输入的解决方法咨询
嘿,我之前也踩过这个坑!先给你捋清楚问题根源:当用open -n /Applications/MyApp.app启动时,macOS会把这个.app当作GUI应用处理,默认不会把终端的标准输入(键盘输入)关联到应用进程上;但直接运行Contents/MacOS里的可执行文件时,是在终端环境下启动的,自然能正常读取System.in。
下面给你几个实用的解决办法,按需选择就行:
方法1:打包时指定终端模式(最推荐)
在jpackage打包命令里加上--terminal参数,这个参数会告诉工具把你的.app配置成需要终端支持的应用,启动时自动弹出终端窗口,这样你的输入读取代码就能正常工作了。
举个打包命令的例子:
jpackage --name MyApp --input ./target --main-jar MyApp.jar --main-class com.yourpackage.YourMainClass --terminal
用这个命令打包后的.app,再用open -n /Applications/MyApp.app启动时,会自动唤起终端,你就能正常输入内容啦。
方法2:修改已打包的App Bundle配置
如果已经打包好不想重新打包,可以手动修改.app的配置文件:
- 右键点击
MyApp.app,选择「显示包内容」 - 打开
Contents/Info.plist文件(用文本编辑器或Xcode都可以) - 添加或修改以下键值对:
<key>NSTerminalBundle</key> <true/>
保存后再启动应用,也会自动打开终端并关联输入。
方法3:用Shell脚本替代open命令
如果不想改动.app本身,也可以写个简单的启动脚本:
- 新建文本文件,命名为
MyAppLauncher.sh,内容如下:#!/bin/bash /Applications/MyApp.app/Contents/MacOS/MyApp - 给脚本添加执行权限:
chmod +x /Applications/MyAppLauncher.sh - 之后直接运行
/Applications/MyAppLauncher.sh,就能像直接跑可执行文件一样读取用户输入了。
你的输入读取代码本身是没问题的,核心问题就是macOS对GUI应用的默认输入隔离,上面的方法都能帮你绕开这个限制~
内容来源于stack exchange
相关产品推荐
相关产品推荐

