我在ubuntu中使用jenkins,我需要从python脚本调用java类。代码:
import os
import shutil
import sys
from subprocess import call, STDOUT
param1=os.getenv(‘PARAM1’)
param2=os.getenv(‘PARAM2’)
param3=os.getenv(‘PARAM3’)
cmd1 =”cp /…/Class.class $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_NUMBER/Class.class ”
cmd2=”java $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_NUMBER/Class ” +””+param1+””+param2””+param3
print>>> sys.stder, “Launching command: “ + cmd2
call(cmd1,shell=True)
call(cmd2,shell=True)
但控制台输出显示“错误:无法找到或加载主类” 我已经检查了文件被复制,并且Jenkis已经安装了Java SE Development Kit 8u31版本。 我已尝试在两个步骤中构建进程,首先复制java文件,然后设置变量并执行第二次调用但出现相同的错误。 谢谢,
我已将代码更改为:
classpath=os.path.join(os.getenv('JENKINS_HOME'),"jobs",os.getenv(JOB_NAME'),"builds",os.getenv('BUILD_NUMBER'))
cmd2=[“java”,”-classpath”,classpath,”Class”,param1,param2,param3]
call(cmd2)
代码工作!!!
当我使用参数构建时,控制台输出显示“Usage_ java [ - options] class [args ...] ...”
答案 0 :(得分:1)
Java不支持"将此文件作为一个类来运行"直。相反,您需要将类添加到类路径中,然后使用Java完全限定名称来调用它:
java -classpath $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_NUMBER com.foo.Class ...
将在.../builds/$BUILD_NUMBER/com/foo/Class.class
注意:使用字符串避免使用call()
。而是构建一个命令加参数列表。这样,您可以正确替换变量,文件名中的空格不会导致意外/难以发现问题:
classpath = os.path.join(os.genenv("JENKINS_HOME), "jobs", ...)
cmd = [
"java",
"-classpath",
classpath,
"Class",
...
]
call(cmd)