Woodstox解析器在Eclipse中的测试运行中运行良好,但是从命令行失败

时间:2016-10-19 19:30:05

标签: maven-3 woodstox

我的一个JUnit测试使用(幕后)Woodstox解析器。

当我在Eclipse中运行测试时,测试按预期成功。

但是在命令行上运行相同的测试,使用

mvn clean test -Dtest=com.example.MyClassTest#someParserTest

导致测试失败并显示以下异常消息:

Error on line 114 column 21
  SXXP0003: Error reported by XML parser: Invalid UTF-8 middle byte 0x3f (at char #4174, byte #3999)
    ...
    at com.ctc.wstx.io.UTF8Reader.reportInvalidOther(UTF8Reader.java:314)
    at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:205)
    at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:84)
    at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:55)
    at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:961)
    at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4580)
    at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3657)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1063)
    at com.ctc.wstx.sax.WstxSAXParser.fireEvents(WstxSAXParser.java:524)
    at com.ctc.wstx.sax.WstxSAXParser.parse(WstxSAXParser.java:452)
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:440)
    at net.sf.saxon.event.Sender.send(Sender.java:171)
    at net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:363)

我看了一下待解析的InputStreamInputStream在两种情况下都是相同的。

此外,InputStream中没有“第114行第21行”。第114行在第11列结束。

我如何调查导致不同行为的原因?

1 个答案:

答案 0 :(得分:0)

事实证明,我使用的库对环境的默认字符编码(也称为平台的默认字符集)做出了错误的假设。

在Eclipse环境中,调用Charset.defaultCharset()返回 UTF-8 ,而在命令行环境中,它返回 CP1252

许多标准和第三方Java API的行为有所不同,具体取决于平台的默认字符集,其中包括:

  • String.getBytes()
  • ByteArrayOutputStream.toString()
  • XMLOutputFactory.createXMLStreamWriter(OutputStream stream)
  • IOUtils.toString(InputStream input)

要解决我的问题,我必须更新该库以明确使用正确的字符集:

  • String.getBytes(StandardCharsets.UTF_8)
  • ByteArrayOutputStream.toString( StandardCharsets.UTF_8.name() )
  • XMLOutputFactory.createXMLStreamWriter( OutputStream stream, StandardCharsets.UTF_8.name() )
  • IOUtils.toString(InputStream input, StandardCharsets.UTF_8)