You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Antlr生成的Java文件与tokens文件分别指定路径?

分离ANTLR4 Maven插件生成的Java与Tokens文件输出路径

问题场景

我在项目中使用ANTLR4解析自定义格式文件,当前ANTLR4 Maven插件配置如下:

<plugin>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-maven-plugin</artifactId>
    <version>4.11.1</version>
    <executions>
        <execution>
            <id>antlr</id>
            <goals>
                <goal>antlr4</goal>
            </goals>
            <phase>compile</phase>
        </execution>
    </executions>

    <configuration>
        <libDirectory>src/main/antlr4/imports</libDirectory>
        <sourceDirectory>src/main/antlr4</sourceDirectory>
        <outputDirectory>src/main/java</outputDirectory>
        <listener>true</listener>
        <visitor>true</visitor>
        <treatWarningsAsErrors>true</treatWarningsAsErrors>
    </configuration>
</plugin>

语法文件test.g4位于src/main/antlr4/org/trance233/antlr/,目前.tokens文件生成在src/main/java/根目录,.java文件自动生成到src/main/java/org/trance233/antlr/,希望将.tokens文件单独放到src/main/resources目录,Java文件保持原输出路径。

解决方案

ANTLR4 Maven插件本身没有提供直接分离Java和Tokens文件输出路径的配置项,但可以通过以下两种方式实现需求:

方法1:Maven资源复制(推荐)

先让ANTLR4按正常逻辑生成所有文件到Java目录,再通过Maven资源插件将.tokens文件复制到src/main/resources,步骤如下:

  1. 保持ANTLR4插件的outputDirectory为src/main/java,确保Java文件生成到正确的包路径
  2. 添加maven-resources-plugin配置,在编译阶段将生成的.tokens文件复制到目标目录

完整配置示例:

<build>
    <plugins>
        <!-- ANTLR4插件配置 -->
        <plugin>
            <groupId>org.antlr</groupId>
            <artifactId>antlr4-maven-plugin</artifactId>
            <version>4.11.1</version>
            <executions>
                <execution>
                    <id>antlr</id>
                    <goals>
                        <goal>antlr4</goal>
                    </goals>
                    <phase>generate-sources</phase>
                </execution>
            </executions>
            <configuration>
                <libDirectory>src/main/antlr4/imports</libDirectory>
                <sourceDirectory>src/main/antlr4</sourceDirectory>
                <outputDirectory>src/main/java</outputDirectory>
                <listener>true</listener>
                <visitor>true</visitor>
                <treatWarningsAsErrors>true</treatWarningsAsErrors>
            </configuration>
        </plugin>

        <!-- 复制tokens文件到resources目录 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.3.1</version>
            <executions>
                <execution>
                    <id>copy-tokens</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.basedir}/src/main/java/org/trance233/antlr</directory>
                                <includes>
                                    <include>*.tokens</include>
                                </includes>
                                <!-- 可选:复制后删除源目录中的tokens文件 -->
                                <!-- <excludes>
                                    <exclude>*.java</exclude>
                                </excludes> -->
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

方法2:在语法文件中指定Tokens路径

在test.g4的头部添加配置,直接指定tokens文件的输出路径,这种方式灵活性较差,适合简单场景:

// 先声明包路径
@header {
    package org.trance233.antlr;
}

@lexer::header {
    package org.trance233.antlr;
}

// 指定tokens文件输出到resources目录
@lexer::members {
    public static final String TOKENS_FILE = "../src/main/resources/test.tokens";
}

// 后续是你的语法规则
grammar test;

// ... 语法定义 ...

内容的提问来源于stack exchange,提问作者Trance233

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:40:38