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 设置为该值,因此,它必须在我们的代码中。
感谢所有试图提供帮助的人,非常感谢您的帮助。
罗布
我正在努力将我们项目的构建结构从 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 设置为该值,因此,它必须在我们的代码中。
感谢所有试图提供帮助的人,非常感谢您的帮助。
罗布