如何限制javac输出?

时间:2017-12-17 00:18:46

标签: java javac

假设我创建了一个有一些语法错误的类并运行javac Main.java来编译它。正如我所料,它向我展示了以下内容:

Main.java:3: error: '{' expected
public class Main 
                 ^
Main.java:4: error: ')' expected
    public static void main(String[] args {
                                         ^
2 errors

我正在寻找限制输出的方法,因此它只显示错误消息和行号,并且不会重复我的代码。这样的事情是理想的:

Main:java:3: error: '{' expected
Main.java:4: error: ')' expected

我尝试了javac -help中的一些不同参数,例如:

javac -g:lines Main.java
javac -g:none Main.java

但这些都根本不影响输出。这是我可以使用命令行参数做的事情,还是我只需编写一些正则表达式来过滤它?谢谢!

2 个答案:

答案 0 :(得分:1)

AFAIK,没有javac个开关/选项可以按照你想要的方式过滤编译器错误信息。

  

我正在为javac编写一个包装器,并将用另一种语言解析其输出

最简单的解决方案是让包装器处理它。如果要将包装器实现为Linux shell脚本,请执行以下操作:

    javac .... 2>&1 | grep " error: "

将是一个良好的开端 1 。请注意,2>&1 必需,因为:

  • javac将编译错误写入stderr和
  • shell管道重定向stdout,而不是stderr。
  

但我要特别询问javac的命令行选项,以便尽可能简化我的包装脚本。

不能那样做 2 。您将需要使您的包装器脚本更复杂。

1 - 您可能想要更复杂的东西以避免错误匹配;例如如果字符序列error:出现在Java源代码中,并在编译错误消息中引用。

2 - 严格来说并非如此。但我怀疑你是否愿意开发,维护和分发你自己的“调整”JDK,javac可以输出不同的编译错误。此外,您可以使用一些(复杂的)自定义Java代码执行此操作。使用工具API从Java代码调用编译器,并在将编译错误消息打印到stdout或stderr之前按下编译错误消息。

答案 1 :(得分:0)

这是我可以使用命令行参数做的事情

不是javac。 java编译器不提供内置机制来改变其输出结构。存在其他选项,例如JDT Core Component(来自链接)增量Java编译器。作为Eclipse构建器实现,它基于从VisualAge for Java编译器演化而来的技术。

还是我只需编写一些正则表达式来过滤它?

编写正则表达式,实现自己的编译器,调整openjdk或eclipse JDT核心组件(以前的java eclipse编译器),调查是否有其他编译器更适合您的需求(可能是IBM),但编写正则表达式可能是 最简单的 方法。