有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Ant运行JUnit测试时返回null的java getPackage()

我在运行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" />
        ...

我在谷歌上搜索了这类错误,并找到了大量关于类加载器错误行为的参考资料。但我发现没有任何东西能给我足够的信息来解决我的问题

我真的需要getClass().getPackage()不返回null。有人能帮我吗

谢谢, 菲尔


共 (3) 个答案

  1. # 1 楼答案

    我不确定您要在哪个对象上执行getClass()。getPackage()? 看看API Javadoc对这个方法的描述,我猜问题在于,当您从命令行运行JUnit时,引导类加载器正在加载JUnit,而您正在执行getPackage()操作的对象是由一个子类加载器加载的

    不确定这是否有意义,但由于getPackage正在尝试使用引导类加载器定位包,并且标准类加载器行为不查看其子级,因此它返回null

    如果你能提供更多关于你正在做这个操作的对象的信息,我可以说得更具体一些

  2. # 2 楼答案

    如果是类加载器的错误,则始终可以使用不同的类加载器加载相同的类:

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

    这里的问题是如何找到类路径URL(urlsToClasses)。我不熟悉JUnit类加载器,所以您可以尝试将Thread.currentThread().getContextClassLoader()转换为URLClassLoader,看看它是否可以帮助您获取这些URL

  3. # 3 楼答案

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