JUnit AssertionError: Platform not recognized when running in Maven

JUnit AssertionError: Platform not recognized when running in Maven

我正在努力将我们项目的构建结构从 Ant 迁移到 Maven (3.3.3),使用 Java 1.8 和 运行 解决一个问题我。我们所有的单元测试都在 Ant 和 Eclipse 中正常工作,但是我 运行 有几个在 Maven 中执行时失败了。失败的测试(不幸的是,由于公司限制,我无法 post 来源)都试图通过 javax.imageio.ImageIO class 读取图像,并且似乎都因 NoClassDefFoundError 而失败,声明他们无法初始化 java.nio.file.TempFileHelper。现在,当某些东西试图初始化 class 并失败时(而不是根本无法找到 class 定义),我已经看到这种类型的问题出现了,但我调查了TempFileHelper class 的来源,我似乎无法弄清楚什么会失败。

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

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 的 class 定义在与单元测试(称为核心)不同的 maven 模块中,并且在此之前核心已成功构建。调用 ImageIO.read 的 class 提供了在核心中定义的 png 文件的相对路径,图像存储在核心的资源文件夹中,在 "images" 下子文件夹。

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

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

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

我已经验证 foo.png 在构建核心后 core.jar 中,并且在紧靠 jar 根目录的图像文件夹中,并且核心模块是一个正在测试的模块的有效依赖性。

非常感谢任何帮助!

更新 1

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

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

更新 2

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

父 POM 片段:

<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 片段:

<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>

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

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

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

罗布