gpt4 book ai didi

java - JUnit 断言错误 : Platform not recognized when running in Maven

转载 作者:行者123 更新时间:2023-11-29 07:34:39 25 4
gpt4 key购买 nike

我正在努力将我们项目的构建结构从 Ant 转换到 Maven (3.3.3),使用 Java 1.8,遇到了一个困扰我的问题。我们所有的单元测试都在 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 的类提供了在核心中定义的 png 文件的相对路径,图像存储在核心的资源文件夹中的“图像”子文件夹下。

例如,使用 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 片段。该项目是多模块的,父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 的源代码后发现了这一点类,它立即告诉我它试图寻找什么,以及预期值。在发现这一点并进行了更多的谷歌搜索之后,我放入了 System.getProperty("os.name") 并在其中一个失败的测试中将其打印出来,让我找到了“testOs”。在发现这一点之后,只需确定不,Maven 和 JUnit 都没有将 os.name 设置为该值,因此,它一定在我们的代码中。

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

罗布

关于java - JUnit 断言错误 : Platform not recognized when running in Maven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com