Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何限制javac输出?_Java_Javac - Fatal编程技术网

如何限制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
但我要特别询问javac的命令行选项,以便使包装器脚本尽可能简单

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


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输出,自己解析它(当前输出)(因为您是以编程方式执行此操作的)-然后您可以输出您喜欢的任何内容。