【问题标题】:JUnit AssertionError: Platform not recognized when running in MavenJUnit AssertionError:在 Maven 中运行时无法识别平台
【发布时间】:2016-05-27 16:24:44
【问题描述】:

我正在使用 Java 1.8 将项目的构建结构从 Ant 转换为 Maven (3.3.3),但遇到了一个让我很头疼的问题。我们所有的单元测试都在 Ant 和 Eclipse 中正常工作,但我遇到了几个在 Maven 中执行时失败的情况。失败的测试(不幸的是,由于公司限制,我无法发布源代码)都试图通过 javax.imageio.ImageIO 类读取图像,并且似乎都失败并出现 NoClassDefFoundError,说明它们无法初始化 java。 nio.file.TempFileHelper。现在,当某些东西试图初始化类并且失败(而不是根本找不到类定义)时,我已经看到了这种类型的问题,但是我查看了 TempFileHelper 类的源代码,并且我似乎无法弄清楚什么会失败。

堆栈跟踪(手写,对任何类型的人表示歉意):

java.lang.NoClassDefFoundError: Could not initialize class java.nio.file.TempFileHelper
    at java.nio.file.Files.createTempFile(Files.java:897)
    at javax.imageio.stream.FileCacheImageInputStream.<init>(FileCacheImageInputStream.java:102)
    at com.sun.imageio.spi.InputStreamImageInputStreamSpi.createInputStreamInstance(InputStreamImageInputStreamSpi.java:69)
    at javax.imageio.ImageIO.createImageInputStream(ImageIo.java:357)
    at javax.imageio.ImageIO.read(ImageIO.java:1397)
    ... our code beyond here ...

调用 ImageIO.read 的类在与单元测试(称为核心)不同的 maven 模块中定义,并且在此发生之前核心已成功构建。调用 ImageIO.read 的类为 core 中定义的 png 文件提供相对路径,并且图像存储在 core 的资源文件夹中,位于“images”子文件夹下。

示例,使用 foo.png 作为文件名:

core/src/main/resources/images/foo.png

URL imageUrl = SomeClass.class.getResource("/images/foo.png");
ImageIO.read(imageUrl);

我已经验证 foo.png 在 core 构建后位于 core.jar 中,并且位于 jar 根目录下的 images 文件夹中,并且 core 模块是模块的有效依赖项经过测试。

非常感谢任何帮助!

更新 1

在浏览 TempFileHelper 时,我偶然发现了一些可能失败的代码,并将其带入我的单元测试中,看看它是否继续失败。现在,通过以下堆栈跟踪,故障似乎表明默认文件系统未知:

java.lang.AssertionError: Platform not recognized
    at sun.nio.fs.DefaultSystemProvider.create(DefaultSystemProvider.java:68)
    ... our code truncated...

更新 2

根据 Alexandre Cartapanis 的要求,这是 POM sn-ps。该项目是多模块的,父pom使用插件管理来控制版本。

父 POM sn-p:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

子 POM sn-p:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <compilerArgs>
                    <arg>-XDignore.symbol.file</arg>
                    <compilerArg>-XDignore.symbol.file</compilerArg>
                </compilerArgs>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

【问题讨论】:

  • 你删除的部分是否有“caused by”?
  • 我在调试或标准运行模式下都没有看到。
  • 在做了更多的研究和探索之后,我想我已经将问题缩小到 DefaultFileSystemProvider 类。请参阅问题以获取更新。
  • 没有方法ImageIO.read(String).
  • 抱歉,我已经用正确的方法更新了问题,它实际上是使用 ImageIO.read 的 URL 形式

标签: java junit maven-3 nio


【解决方案1】:

经过多次搜索,我发现了问题所在。似乎我们的一位开发人员编写了一个测试,该测试正在重置 os.name(为“testOs”)和 os.version 系统属性,并且从未将它们重置为以前的值。这导致所有 java.nio.Paths 调用失败。

我在查看 sun.nio.fs.DefaultFileSystemProvider 类的源代码后发现了这一点,它立即告诉我它试图寻找什么以及预期值。在发现这一点并进行了更多的谷歌搜索之后,我放入了 System.getProperty("os.name") 并在其中一个失败的测试中打印出来,导致我找到了“testOs”。发现后,只需确定不是,Maven 或 JUnit 都将 os.name 设置为该值,因此,它必须在我们的代码中。

感谢所有尝试提供帮助的人,非常感谢您的帮助。

罗伯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2017-02-22
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多