Java 从Ant运行JUnit测试时getPackage()返回null
我在运行JUnit测试时遇到问题 它在Eclipse中运行良好,但现在我尝试使用Ant从命令行运行它。问题是以下代码返回null:Java 从Ant运行JUnit测试时getPackage()返回null,java,ant,junit,classloader,Java,Ant,Junit,Classloader,我在运行JUnit测试时遇到问题 它在Eclipse中运行良好,但现在我尝试使用Ant从命令行运行它。问题是以下代码返回null:getClass().getPackage() 我正在运行JUnit测试,如下所示: <junit fork="no" printsummary="yes" haltonfailure="no"> <classpath refid="junit.classpath" /> <batchtest fo
getClass().getPackage()
我正在运行JUnit测试,如下所示:
<junit fork="no" printsummary="yes" haltonfailure="no">
<classpath refid="junit.classpath" />
<batchtest fork="yes" todir="${reports.junit}">
<fileset dir="${junit.classdir}">
<include name="**/FileHttpServerTest.class" />
<exclude name="**/*$*" />
</fileset>
</batchtest>
<formatter type="xml" />
...
...
我在谷歌上搜索了这类错误,并找到了大量关于类加载器错误行为的参考资料。但我发现没有任何东西能给我足够的信息来解决我的问题
我确实需要getClass().getPackage()
不返回null。有人能帮我吗
谢谢,
Phil我不确定您要在哪个对象上执行getClass().getPackage()? 看看API Javadoc对此方法所说的话,我猜问题在于,当您从命令行运行引导类加载器时,JUnit正在由引导类加载器加载,而您正在执行getPackage()操作的对象是由一个子类加载器加载的 不确定这是否有意义,但由于getPackage正在尝试使用引导类装入器查找包,并且标准类装入器行为不查看其子级,因此它返回null
如果您能对正在执行此操作的对象有更多的了解,我可以更具体一些尝试使用junit fork=“yes”运行您的测试,这将非常合理地隔离类加载,并可能解决您的问题。如果是类加载程序的错误,您始终可以使用不同的类加载器加载相同的类:
URLClassLoader cld = new URLClassLoader(new URL[] { urlsToClasses });
Class.forName(getClass().getName(), true, cld).getPackage();
这里的问题是如何找到类路径URL(
urlsToClasses
)。我不熟悉JUnit类加载器,所以您可以尝试将Thread.currentThread().getContextClassLoader()
转换为URLClassLoader
,看看它是否可以帮助您获得这些URL。您能发布正在执行getClass()的代码吗?getPackage调用?嗨,Fazal,我最初在第三方Jetty类org.mortbay.Jetty.Server中观察到这个问题,它调用getClass().getPackage().getImplementationVersion(),这会导致NullPointerException。然后,我将以下行添加到测试类本身(FileHttpServerTest
):System.out.println(“包是”+getClass().getPackage())代码>此打印“package is null”。@philharvey,您自己的FileHttpServerTest类或Jetty类,或者两者都有什么区别?不幸的是,这两个类中调用getObject().getPackage()的结果都没有区别