当我从Ant运行我的JUnit测试时,getPackage()返回null

时间:2010-03-22 14:23:00

标签: java ant junit classloader

我在运行JUnit测试时遇到问题。

它在Eclipse中运行良好,但现在我正在尝试使用Ant从命令行运行它。问题是以下代码返回null: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" />
        ...

我用Google搜索了这种错误,并发现了一些对类加载器错误行为的引用。但我发现什么都没有给我足够的信息来解决我的问题。

我真的需要getClass().getPackage()不返回null。任何人都可以帮助我吗?

谢谢, 菲尔

3 个答案:

答案 0 :(得分:1)

我不确定你想在哪个对象上做getClass()。getPackage()? 看看API Javadoc对这个方法所说的内容,我猜想问题是当你从命令行运行它时,BootUnrap类加载器正在加载JUnit,而你正在执行getPackage()操作的对象是由其中一个加载的。儿童类加载器。

不确定这是否有意义,但是因为getPackage试图使用Bootstrap类加载器来定位包,并且标准类加载器行为不会查看其子类,所以它返回null。

如果您可以更多地了解您正在执行此操作的对象,我可能会更具体

答案 1 :(得分:1)

尝试使用junit fork="yes"运行您的测试,这将合理地隔离您的类加载并可能解决您的问题。

答案 2 :(得分:1)

如果是类加载器的错误,您总是可以使用不同的类加载器加载相同的类:

URLClassLoader cld = new URLClassLoader(new URL[] { urlsToClasses });
Class.forName(getClass().getName(), true, cld).getPackage();

这里的问题是弄清楚如何查找类路径网址(urlsToClasses)。我不熟悉JUnit类加载器,因此您可以尝试将Thread.currentThread().getContextClassLoader()转换为URLClassLoader以查看它是否可以帮助您获取该URL。