如何限制javac输出?
假设我创建了一个有一些语法错误的类,并运行如何限制javac输出?,java,javac,Java,Javac,假设我创建了一个有一些语法错误的类,并运行javacmain.java来编译它。正如我所料,它向我展示了以下内容: Main.java:3: error: '{' expected public class Main ^ Main.java:4: error: ')' expected public static void main(String[] args { ^ 2
javacmain.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
但这两者都不会影响产出。这是我可以使用命令行参数做的事情,还是我只需要编写一些正则表达式来过滤它?谢谢 AFAIK,没有任何
javac
开关/选项可以按照您想要的方式过滤编译器错误消息
我正在为javac编写一个包装器,并将用另一种语言解析它的输出
最简单的解决方案是让包装器处理它。如果要将包装器实现为Linux shell脚本,请执行以下操作:
javac .... 2>&1 | grep " error: "
这将是一个好的开端。注意2>&1
是必需的,因为:
- javac将编译错误写入stderr,并且
- shell管道重定向stdout,而不是stderr
1-你可能需要更复杂的东西来避免错误匹配;e、 g.如果字符序列
错误:
出现在Java源代码中,并在编译错误消息中被引用
2-严格来说,这不是真的。但我怀疑您是否愿意开发、维护和分发自己的“调整过的”JDK,它使用javac
,可以以不同的方式输出编译错误。此外,您还可以使用一些(复杂的)自定义Java代码来实现这一点。使用工具API从Java代码调用编译器,并在将编译错误消息打印到stdout或stderr之前对其进行处理。这是我可以使用命令行参数完成的吗
不适用于javac
。java编译器不提供内置机制来改变其输出的结构。还有其他选项,例如(从链接)增量Java编译器。作为一个Eclipse构建器实现,它基于从VisualAgeforJava编译器演变而来的技术
或者我只需要写一些正则表达式来过滤掉它
编写一个正则表达式,实现您自己的编译器,调整openjdk或eclipse JDT核心组件(以前是eclipse compiler for java),调查是否有其他编译器更适合您的需要(可能是IBM的),但是编写正则表达式可能是最简单的方法。为什么要这样限制输出?你想做什么?@Progman我正在为javac编写一个包装器,并将用另一种语言最好的方式解析它的输出?修复程序中的错误,那么它就不会抱怨了。@vqdave可以使用吗?Java提供了一个API,您可以在其中访问编译器,因此您不必运行外部程序“javac”来执行您可以在代码内部执行的操作。@vqdave类似的详细信息属于问题(不在注释中),不管怎样-而是修改javac输出,自己解析它(当前输出)(因为您是以编程方式执行此操作的)-然后您可以输出您喜欢的任何内容。