如何为Jenkins自由风格项目中运行的Java程序传递用户输入
Jenkins运行带用户输入的Java文件构建失败解决方案
失败原因
- Jenkins 默认的构建任务是非交互式后台进程,没有可用的标准输入(
System.in)流供Scanner读取 - 当代码执行到读取输入的逻辑时,输入流处于EOF状态,会直接抛出
java.util.NoSuchElementException异常,导致构建终止,这也是不需要用户输入的Java文件可以正常运行的核心原因
你提供的demo.java代码还存在变量名重复的编译问题:Scanner s = new Scanner(System.in)和String s = s.next()都使用了s作为变量名,编译阶段就会报错,需要先修改调整。调整后的原始代码如下:
import java.util.*; class demo { public static void main(String args[]) { Scanner s = new Scanner(System.in); System.out.println("Enter your name : "); String name = s.next(); System.out.println("Hello "+name); } }
解决方案
方案1:不修改Java代码,在Jenkins构建步骤中预置输入内容
在Jenkins的构建步骤里,执行Java命令时通过管道符提前传入需要输入的内容即可,比如你要输入的名字是test,执行命令改成:echo "test" | java demo
如果需要多段输入,直接用换行分隔内容即可:echo -e "test1\ntest2" | java demo
方案2:修改Java代码适配非交互式运行环境
如果需要代码同时支持本地交互式运行和Jenkins非交互式运行,可以增加输入流可用判断,优先读取启动参数作为输入:
import java.util.*; class demo { public static void main(String args[]) { String name; // 优先取启动参数作为输入,适配Jenkins非交互式场景 if(args.length > 0) { name = args[0]; } else { Scanner s = new Scanner(System.in); System.out.println("Enter your name : "); name = s.next(); } System.out.println("Hello "+name); } }
此时在Jenkins执行时直接把参数加在命令后面即可:java demo test
同时本地运行时如果不传入参数,还是会正常触发用户输入提示,不影响原有使用逻辑。
内容的提问来源于stack exchange,提问作者Sid Jaiswal
相关产品推荐
相关产品推荐

