O Maven só gera fontes Antlr no pacote padrão

7

Vou começar com o meu pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>HPK</groupId>
<artifactId>WRB</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>WRB</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4</artifactId>
        <version>4.5.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>auto-clean</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.antlr</groupId>
            <artifactId>antlr4-maven-plugin</artifactId>
            <version>4.3</version>
            <executions>
                <execution>
                    <configuration>
                        <arguments>
                            <argument>-visitor</argument>
                            <argument>-package</argument>
                            <argument>wrb.grammar</argument>
                        </arguments>
                    </configuration>
                    <id>antlr</id>
                    <goals>
                        <goal>antlr4</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings 
                only. It has no influence on the Maven build itself. -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        org.apache.maven.plugins
                                    </groupId>
                                    <artifactId>
                                        maven-clean-plugin
                                    </artifactId>
                                    <versionRange>
                                        [3.0.0,)
                                    </versionRange>
                                    <goals>
                                        <goal>clean</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

Quando executo maven install neste projeto, o maven deve gerar as fontes do plug-in antlr4 dentro do pacote wrb.grammar , mas isso não acontece. Ele faz tudo, mas coloca as fontes nesses diretórios, simplesmente os coloca no que chama de "pacote padrão", que é apenas a raiz de antlr/generated-sources .

Se eu usar o plugin Antlr4IDE clicando com o botão direito do mouse na gramática e selecionando-o em run as, as fontes serão geradas no diretório correto.

Outra pessoa com quem estou trabalhando neste pequeno projeto não tem problema usando maven-install . Além de nossos sistemas operacionais e versões de eclipse, tudo é igual.

Estou usando o Eclipse Oxygen no MacOS.

O que estou fazendo de errado que o plugin maven não gera o diretório desejado?

    
por Meik Vtune 17.10.2017 в 21:52
fonte

1 resposta

2

Eu verifiquei as fontes de antlr4 versão 4.3. O parâmetro -package é usado apenas pelos modelos de gerador de código, mas não em qualquer lugar no código-fonte da ferramenta real (consulte Resultados da pesquisa do Github para genPackage ). Portanto, isso não pode afetar a localização dos arquivos de saída.

Em vez disso, a localização de cada arquivo de saída é determinada com base na localização do arquivo de entrada correspondente (consulte aqui e aqui nas fontes). Isso se encaixa na explicação dos documentos do plugin do maven :

  

Se a sua gramática pretende ser parte de um pacote chamado org.foo.bar, você a colocaria no diretório src / main / antlr4 / org / foo / bar. O plugin produzirá arquivos .java e .tokens no diretório de saída target / generated-sources / antlr4 / org / foo / bar Quando os arquivos Java forem compilados, eles estarão no local correto para o compilador Javac sem qualquer configuração especial. Os arquivos java gerados são enviados automaticamente para compilação pelo plug-in.

Além disso, ao usar o plugin antlr4-maven, não é necessário especificar a opção -package . Como o plug-in deriva o valor do -package paramter do caminho do arquivo de entrada e o adiciona automaticamente à invocação antlr (consulte aqui nas fontes ). Essa é provavelmente também a razão pela qual -pacakge não está diretamente disponível como um parâmetro de configuração no plugin maven.

Solução

Para que os arquivos gerados sejam colocados em uma estrutura de diretórios que corresponda aos nomes dos pacotes, é necessário usar a mesma estrutura para os arquivos de entrada.

Essencialmente, tudo o que você precisa fazer é colocar seus arquivos gramaticais em src/main/antlr4/wrb/grammar , remover o parâmetro -package da configuração e tudo funciona conforme o esperado.

A propósito: em vez de escrever

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

você poderia simplesmente escrever

<visitor>true</visitor>

desde este parâmetro é diretamente entendido pelo antlr4-maven-plugin .

    
por Christoph Böhme 25.10.2017 / 21:28
fonte