在Linux上部署时NoSuchMethodError

时间:2014-03-07 11:04:16

标签: java linux windows tomcat

我有以下代码从文件中读取:

private static void writeLogs(String filePath, PrintWriter writer)throws ServletException, IOException {

    String fullFilePath = AppConfig.getAppDir()+"/auditlogs/"+filePath+".log";
    System.out.println("loading log files from --> "+fullFilePath);

    BufferedReader br = new BufferedReader(new FileReader(fullFilePath));
    try {
        StringBuilder sb = new StringBuilder();
        String line;
        List<String> tmp = new ArrayList<String>();
        do {
            line = br.readLine();
            tmp.add(line);

        }while (line != null);
        for(int i=tmp.size()-1;i>=0;i--) {
            if(tmp.get(i)!=null){
                sb.append(tmp.get(i));
                sb.append(System.lineSeparator());
            }
        }
        String logs = sb.toString();
        writer.write(logs);
    } finally {
        br.close();
    }
}

当我在Windows上的tomcat服务器上部署时,这可以正常工作。当我在linux上尝试相同时,文件无法读取。在检查tomcat日志文件时,我看到:

SEVERE: Servlet.service() for servlet ReadLogsServlet threw exception
java.lang.NoSuchMethodError: java.lang.System.lineSeparator()Ljava/lang/String;
    at com.ericsson.ims.web.servlet.ReadLogsServlet.writeLogs(ReadLogsServlet.java:53)
    at com.ericsson.ims.web.servlet.ReadLogsServlet.doGet(ReadLogsServlet.java:26)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)

System.lineSeparator()引起错误,但当我检查javadoc时,它说:

  

返回依赖于系统的行分隔符字符串。它总是回归   相同的值 - 系统属性的初始值   line.separator。

     

在UNIX系统上,它返回&#34; \ n&#34 ;;在Microsoft Windows系统上   返回&#34; \ r \ n&#34;。

任何人都可以解释为什么这不起作用以及如何修复以便它可以在多个平台上运行?

4 个答案:

答案 0 :(得分:11)

您似乎没有在Linux和Windows之间使用相同版本的Java。

正如您所看到的in the javadoc,{&lt;}}中不存在System.lineSeparator() 7。

所以,如果你想在java上获得行分隔符&lt; 7,你必须使用:

System.getProperty("line.separator")

答案 1 :(得分:2)

您似乎在Windows和Linux上运行不同的JDK版本

  • 在Windows上,JDK为7,定义了System.lineSeparator()方法。
  • 在Linux机器上运行的先前JDK版本(在Java 6中检查System类)中不存在相同的方法。

对于向后兼容的代码,请使用System.getProperty("line.separator")

答案 2 :(得分:1)

正如其他人指出版本存在问题。 我敢说只是改变JVM是不够的。 您的程序可以在启动时检查预期版本,以避免此类问题以后

String runtimeName = System.getProperty("java.runtime.name");
String runtimeVersion = System.getProperty("java.runtime.version");
... check if JVM is the expected one, log some informative message if not ...

您也可以为其他设置(区域设置...)执行此操作,但这取决于项目的性质。这个想法是一个死的程序比一个残缺的程序(快速失败)更好,另一个想法是你应该一劳永逸地解决问题(发现一次错误) 。 您可以在此处找到更多提示:http://pragprog.com/the-pragmatic-programmer/extracts/tips

答案 3 :(得分:0)

System.lineSeparator()中引入了

Java 7。所以看来你在Linux机器上使用的是早期版本。您可以使用System.getProperty("line.separator");在Linux机器上获取它或升级您的Java版本。