Tomcat 7中的部署战争在Linux上的行为与在Windows上的行为不同

时间:2016-03-17 19:32:17

标签: java xml linux tomcat tomcat7

我甚至不确定如何提出这个问题,但是: 我有两台服务器,一台是运行Ubuntu 13.10的Linux VM,另一台是Windows 7。 我在两者上运行Apache Tomcat 7.0.42。 我在两者上运行Java 1.8.0_66。 我已经将一个应用程序构建为.war文件,并在两个Tomcats中部署了相同的.war文件。 此war文件读取xml文件并使用xsl文件对它们执行转换。我在两个安装中使用与输入完全相同的文件 - 所有文件都放在Tomcat环境中相同的文件夹结构中。

问题:每台计算机上生成的转换文件不同。两个生成的版本都是格式良好的,但它们包含不同的内容。并没有太大的不同,但其中一个(在Linux上生成的一个)中有额外的元素而不是Windows。

考虑到安装和数据源是否相同,有没有人对这种不同行为的来源有什么建议?

有一点需要注意:在Windows上运行的.war生成的结果是预期的结果。

以下是执行转换的方法,并在Windows v.Linux中提供不同的结果(使用相同的文件。)

// Performs an XSLT transformation on the source stream using the transform stream and writes the result to
// an output file stream.
//
protected OutputStream performTransform(InputStream source, InputStream transform, OutputStream outputFile) {

    // Force the use of Saxon for the transformer
    TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
    Transformer transformer;
    logger.info("Perform Transform: " + source + " using " + transform + " to " + outputFile);
    try {
        try {
            transformer = factory.newTransformer(new StreamSource(transform));
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");

            try {
                transformer.transform(new StreamSource(source), new StreamResult(outputFile)); 
            } catch (TransformerException e) {
                logger.error("Transform Exception ", e);
            }
        } catch (TransformerConfigurationException e) {
            logger.error("Transform Configurtion Exception ", e);
        }

        try {
            outputFile.close();
        } catch (IOException e) {
            logger.error("Exception closing output stream ", e);
        }
    } catch (Exception e) {
        logger.error("Catchall Exception performing transform ", e);
    } finally {
        try {
            outputFile.close();
        } catch (IOException e) {
            logger.error("Exception closing output stream a second time ", e);
        }
    }

    return outputFile;
}

1 个答案:

答案 0 :(得分:0)

我相信this可以指出你正确的方向。基本上,它是为了确保您执行相同的编码(在这种情况下最好使用UTF-8)来标准化输出。 Linux和Windows有不同的换行符(分别为\ n和\ r \ n),这也会导致结果文件之间出现空白差异(因为position() function is confused可能会破坏转换)。