[英]JUnit AssertionError: Platform not recognized when running in Maven
我正在使用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模块中定义的(称为core),并且core在此之前已经成功构建。 调用ImageIO.read的类提供了内核中定义的png文件的相对路径,并且图像存储在内核的resources文件夹中的“ 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模块是被测试模块的有效依赖项。
任何帮助是极大的赞赏!
在遍历TempFileHelper时,我偶然发现了一些可能失败的代码,并将其带入我的单元测试中以查看它是否继续失败。 现在,该故障似乎通过以下堆栈跟踪表明默认文件系统未知:
java.lang.AssertionError: Platform not recognized
at sun.nio.fs.DefaultSystemProvider.create(DefaultSystemProvider.java:68)
... our code truncated...
根据Alexandre Cartapanis的要求,以下是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>
<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设置为该值即可,因此,它必须在我们的代码中。
感谢所有尝试提供帮助的人,非常感谢您的帮助。
抢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.