【发布时间】: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 形式