假设我创建了一个有一些语法错误的类并运行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
但这些都根本不影响输出。这是我可以使用命令行参数做的事情,还是我只需编写一些正则表达式来过滤它?谢谢!
答案 0 :(得分:1)
AFAIK,没有javac
个开关/选项可以按照你想要的方式过滤编译器错误信息。
我正在为javac编写一个包装器,并将用另一种语言解析其输出
最简单的解决方案是让包装器处理它。如果要将包装器实现为Linux shell脚本,请执行以下操作:
javac .... 2>&1 | grep " error: "
将是一个良好的开端 1 。请注意,2>&1
必需,因为:
但我要特别询问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),但编写正则表达式可能是 最简单的 方法。