执行build.xml遇TestNG不支持嵌套java元素错误及Jar远程部署问题
解决Ant TestNG任务报错:"testng doesn't support the nested 'java' element"
嘿,我来帮你解决这个头疼的问题!首先得揪出根源:你在runs目标里把<java>标签嵌套进<testng>标签的写法是完全错误的——Ant的TestNG任务根本不支持这种嵌套结构,这就是触发报错的直接原因。
给你两种针对性的解决方案,你可以根据自己的需求选:
方案1:直接用Java任务运行可执行Jar(推荐,匹配你的Jar部署需求)
既然你已经把代码打包成了可执行Jar,完全没必要再用<testng>任务绕圈子,直接用Ant的<java>任务就能运行Jar,还能传递系统属性。把runs目标改成这样:
<target name="runs" depends="compile,JarCreation"> <java jar="${jar.dir}/${ws.project.name}.jar" fork="true"> <sysproperty key="env.key" value="CK_AUTO_DEV"/> </java> </target>
这样运行起来的效果和你本地直接跑主类完全一致,还能顺利触发TestNG套件执行。
方案2:用TestNG任务直接执行测试(如果不需要Jar包,直接跑测试)
如果你只是想通过Ant调用TestNG而不是先打包Jar,那应该直接在<testng>任务里指定测试套件,而不是嵌套<java>。修改后的runs目标如下:
<target name="runs" depends="compile"> <testng classpath="${test.classpath}:${test.dest}" suitename="Framework for Desktop website"> <sysproperty key="env.key" value="CK_AUTO_DEV"/> <!-- 这里指定你的TestNG套件文件路径 --> <xmlfileset dir="." includes="TestNG.xml"/> </testng> </target>
注意要保证classpath里包含你编译后的类文件,以及TestNG、Selenium这些依赖Jar,不然会找不到类。
额外的优化建议
- 修正Jar打包配置:你当前的
<jar>任务里basedir="${basedir}"会把整个项目目录都打包进去,这太冗余了。建议只打包编译好的class文件,同时把依赖Jar的路径加到Manifest的Class-Path里,不然Jar运行时会找不到依赖:
<jar jarfile="${jar.dir}/${ws.project.name}.jar" basedir="${test.dest}"> <manifest> <attribute name="Main-Class" value="MyWorld.MainTestNGClass"/> <!-- 把所有依赖Jar的相对路径都列在这里,用空格分隔 --> <attribute name="Class-Path" value="libs/testng-6.13.1.jar libs/selenium-java-3.7.1.jar libs/guava-23.0.jar ..."/> </manifest> </jar>
- 运行Jar时,要保证依赖Jar的实际路径和Class-Path里配置的一致,不然会抛出
ClassNotFoundException。
按照上面的方法修改后,你的Ant任务就能正常执行,不会再出现那个嵌套元素的报错了!
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

