在Ngrinder里面添加一个新功能,引用到apache的csv的包。部署完后调用发现报类找不到的错。看了下启动的command,确实没有把jar包放在workprocess启动的classpath里面。
分析了下源码,workerprocess启动的命令是由WorkerProcessCommandLine构建。
public WorkerProcessCommandLine(GrinderProperties properties, Properties systemProperties, String jvmArguments, Directory workingDirectory)
WorkProcessCommandLine 构建的class path有两个来源,
1. 传进来的GrinderProperties,property文件传进来的时候带的classpath是测试项目引用的jar包列表。
2. systemProperties。
systemProperties是用AgentImplementationEx传进来的。
final WorkerProcessCommandLineEx workerCommandLine = new WorkerProcessCommandLineEx(properties, filterSystemClassPath(rebasedSystemProperty, handler, m_logger), jvmArguments, script.getDirectory());
其中的filterSystemClassPath最终会调用下面这个方法来觉得使用哪些jar
public String filterClassPath(String classPath, Logger logger) { List<String> classPathList = new ArrayList<String>(); for (String eachClassPath : checkNotNull(classPath).split(File.pathSeparator)) { String filename = FilenameUtils.getName(eachClassPath); if (isUsefulJar(filename) || isUsefulReferenceProject(eachClassPath)) { logger.trace("classpath :" + eachClassPath); classPathList.add(eachClassPath); } } return StringUtils.join(classPathList, File.pathSeparator); }
所以最终的方案就需要在isUsefulJar的列表里面把需要的jar包名包括进去。