Maven 仅在默认包中生成 Antlr 源

问题描述 投票:0回答:2
eclipse maven-3 antlr4
2个回答
8
投票

我检查了antlr4 4.3版本的来源。

-package
参数仅由代码生成器模板使用,但不在实际工具源代码中的任何位置使用(请参阅genPackage
的Github搜索结果)。所以它不会影响输出文件的位置。

相反,每个输出文件的位置是根据相应输入文件的位置确定的(请参阅源中的

herehere)。这符合 maven 插件文档中的解释:

如果您的语法打算成为名为 org.foo.bar 的包的一部分,那么您可以将其放置在目录 src/main/antlr4/org/foo/bar 中。然后,该插件将在输出目录 target/ generated-sources/antlr4/org/foo/bar 中生成 .java 和 .tokens 文件。编译 Java 文件时,它们将位于 Javac 编译器的正确位置,无需任何特殊配置。生成的java文件由插件自动提交编译。

此外,使用 antlr4-maven-plugin 时,无需指定

-package

 选项。由于插件从输入文件路径中派生出 
-package
 参数的值,并自动将其添加到 antlr 调用中(请参阅
此处的源代码)。这可能也是为什么 -pacakge
 不能直接用作 Maven 插件中的 
配置参数 的原因。

解决方案

为了将生成的文件放置在与包名称匹配的目录结构中,您需要对输入文件使用相同的结构。

本质上,您需要做的就是将语法文件放入

src/main/antlr4/wrb/grammar

 中,从配置中删除 
-package
 参数,一切都会按预期工作。

顺便说一句:代替写作

<arguments> <argument>-visitor</argument> </arguments>

你可以简单地写

<visitor>true</visitor>

因为

这个参数可以被antlr4-maven-plugin直接理解。


0
投票
正如 @ChristophBöhme 在问题评论中所写,您必须将语法文件放置在与您希望生成的源代码显示完全相同的包中。它实际上与您的

pom.xml

 文件无关。

ANTLR 尝试通过查看文件夹树来找出包名称,因此,如果您有一个名为

com

 的文件夹,其中包含一个名为 
example
 的文件夹,其中又包含一个名为 
hello_world
 的文件夹,那么这将形成包 
com.example.hello_world
 它将在输出文件夹中生成完全相同的文件夹结构和包。

因此,如果你的包名为

com.example.hello_world

,那么你的目录结构必须如下所示,假设你的语法文件位于 
src/main/antlr4

hello_world (root project folder) | --src | -- main | -- antlr4 (up to here, these are "verbatim" folders) | -- com.example.hello_world (this is a package, to create it you can make a "source folder" in Eclipse) | -- YourGrammar.g4 | -- target (autogenerated) | -- generated_sources | -- antlr4 | -- com.example.hello_world | -- ...All ANTLR-generated files...
    
© www.soinside.com 2019 - 2024. All rights reserved.