В следующем модульном тесте для создания простого XML-документа используется API Java XML.
import org.junit.Test;
import javax.xml.stream.*;
import java.io.ByteArrayOutputStream;
public class XmlErrorTest {
@Test
public void test() throws XMLStreamException {
final XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final XMLStreamWriter xwtr = xmlOutFact.createXMLStreamWriter(baos);
xwtr.writeStartDocument();
xwtr.writeStartElement("Test");
xwtr.writeCharacters(Character.toString('£'));
xwtr.writeEndElement();
xwtr.writeEndDocument();
xwtr.close();
System.out.println(baos.toString());
final byte[] bs = baos.toByteArray();
for (int i = 27; i < 31; ++i) {
System.out.println(i + " : " + bs[i] + "(" + (char)bs[i] + ")");
}
}
}
Если я запускаю тест непосредственно с IDE (Intellij), он выдает следующее:
<?xml version="1.0" ?><Test>£</Test>
27 : 62(>)
28 : -62(ᅡ)
29 : -93(ᆪ)
30 : 60(<)
Т.е. символ £ правильно воспроизводится в выходных данных.Если я запускаю тест в сборке Maven, то получаю следующее:
<?xml version="1.0" ?><Test>�</Test>
27 : 62(>)
28 : -93(?)
29 : 60(<)
30 : 47(/)
Т.е. сгенерированные байтовые данные кажутся неверными - похоже, они сбрасывают байт.
Обратите внимание, яЯ указываю следующее в родительском файле pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Почему символ XML £ «поврежден» при запуске теста из Maven?Это происходит только в Windows - сборки Linux и MacOS кажутся неосуществленными.
Это с Java 1.8.0_131 и Maven 3.3.9.