如何限制javac输出?

问题描述 投票:0回答:2

假设我创建了一个有一些语法错误的类并运行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

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

java javac
2个回答
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 - 不完全正确。但我怀疑你是否愿意用javac开发,维护和分发你自己的“调整”JDK,这可能会以不同的方式输出编译错误。此外,您可以使用一些(复杂的)自定义Java代码执行此操作。使用工具API从Java代码调用编译器,并在将它们打印到stdout或stderr之前按下编译错误消息。


0
投票

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

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

或者我只需要编写一些正则表达式来过滤掉它?

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

© www.soinside.com 2019 - 2024. All rights reserved.