2009-07-02 8 views
0

Mein Projekt generiert Quellcode mit der Rats! parser generator. Ratten! kein Maven Plugin, das ich kenne, so versuche ich, den Parser mit einem Ant Java Aufgabe zu bauen, etwa so:Maven: Java-Klassen kompilieren nicht nach Ant-Task

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
    <execution> 
     <phase>generate-sources</phase> 
     <configuration> 
     <tasks> 
      <mkdir dir="${project.build.directory}/generated-sources/main/java/" /> 
      <java classpath="lib/xtc.jar" classname="xtc.parser.Rats"> 
      <arg line="-in ${project.build.sourceDirectory}" /> 
      <arg line="-out ${project.build.directory}/generated-sources/main/java/" /> 
      <arg path="${project.build.sourceDirectory}/Dot.rats" /> 
      </java> 
     </tasks> 
     <sourceRoot> 
      ${project.build.directory}/generated-sources/main/java 
     </sourceRoot> 
     </configuration> 
     <goals> 
     <goal>run</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Die Details, was Ratten! ist nicht wichtig: das Endergebnis ist, dass das obige Dot.java generiert und in target/generated-sources/main/java platziert. Es funktioniert gut.

Das Problem ist, dass mit diesem plugin Element in meinem pom.xml keine der die Java-Dateien im Projekt kompiliert werden.

erzeugen ich ein Projekt mit "mvn archetype:create -DgroupId=foo -DartifactId=bar" und fügte hinzu, die Datei src/main/java/Dot.rats:

module Dot; 

public void Dot = "." !_ ; 

Wenn ich "run (Dies ist eine Grammatik, die nur Dateien mit einem einzigen Punkt akzeptiert.) mvn compile "ohne plugin Element, erhalte ich:

$ mvn compile 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building bar 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [resources:resources] 
[INFO] Using default encoding to copy filtered resources. 
[INFO] [compiler:compile] 
[INFO] Compiling 1 source file to 
/home/chris/src/tests/maven/project1/bar/target/classes 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1 second 
[INFO] Finished at: Wed Jul 01 18:57:08 EDT 2009 
[INFO] Final Memory: 6M/67M 
[INFO] ------------------------------------------------------------------------ 

Die Java-Datei, die kompiliert wird, ist src/main/java/foo/App.java, eine Java-Klasse, die vom Archetyp erstellt wurde (d. H. Keine generierte Quelldatei).

Wenn ich das tue "mvn clean" fügen Sie dann den plugin Element Ratten Aufruf !, ich:

$ mvn compile 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building bar 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [antrun:run {execution: default}] 
[INFO] Executing tasks 
    [mkdir] Created dir: 
/home/chris/src/tests/maven/project1/bar/target/generated-sources/main/java 
Rats! Parser Generator, v. 1.14.2, (C) 2004-2008 Robert Grimm 
Processing /home/chris/src/tests/maven/project1/bar/src/main/java/Dot.rats ... 

Das heißt, Maven Rats läuft! (was nicht ausfällt, AFAICT), aber kompilieren keine Java-Klassen, nicht einmal die bereits vorhandene Klasse App.java. Nach dem Lauf habe ich target/generated-sources/main/java/Dot.java, aber keine target/classes.

Ich habe andere Arten von Ant Aufgaben versucht und sie stören nicht Java Kompilierung. Zum Beispiel, wenn ich die Aufgabe Element oben mit einer Echo Aufgabe

<tasks> 
    <mkdir dir="${project.build.directory}/generated-sources/main/java/" /> 
    <echo file="${project.build.directory}/generated-sources/main/java/Dot.java"> 
    public class Dot { } 
    </echo> 
</tasks> 

ersetzen ich

$ mvn compile 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building bar 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [antrun:run {execution: default}] 
[INFO] Executing tasks 
[INFO] Executed tasks 
[INFO] Registering compile source root 
/home/chris/src/tests/maven/project1/bar/target/generated-sources/main/java 
[INFO] [resources:resources] 
[INFO] Using default encoding to copy filtered resources. 
[INFO] [compiler:compile] 
[INFO] Compiling 2 source files to 
/home/chris/src/tests/maven/project1/bar/target/classes 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 2 seconds 
[INFO] Finished at: Wed Jul 01 19:03:34 EDT 2009 
[INFO] Final Memory: 7M/79M 
[INFO] ------------------------------------------------------------------------ 

Offensichtlich gibt es etwas, was ich nicht über das Verständnis, wie Maven führt die java Aufgabe. Gibt es etwas Einfaches, das ich mache falsch? Gibt es einen alternativen Weg, um diese Aufgabe zu erfüllen, die ich versuchen sollte (vielleicht eine mehr "Maven-native" Weise)?

[UPDATE] Lustige Geschichte. Ich versuchte, die Ant-Task mit einem Maven Plugin ersetzt, durch eine RatsMojo Klasse zu schreiben, die xtc.parser.Rats direkt und Ersetzen des plugin Element oben mit

<plugin> 
    <groupId>edu.nyu.xtc</groupId> 
    <artifactId>maven-xtc-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>rats</goal> 
     </goals> 
     <configuration> 
      <inputDirectory>${project.build.sourceDirectory}</inputDirectory> 
      <outputDirectory> ${project.build.directory}/generated-sources/main/java</outputDirectory> 
      <grammarFile>${project.build.sourceDirectory}/Dot.rats</grammarFile> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Es ist genau die gleiche Sache, ruft: es Ratten laufen lässt! dann endet ohne kompilieren beliebig der Java-Dateien im Projekt.

Antwort

1

Sie müssen das neue Verzeichnis den Maven-Quellverzeichnissen hinzufügen. Es kann mit der buildhelper-maven-plugin getan werden. Fügen Sie dieses Ihrem pom hinzu:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>add-source</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>add-source</goal> 
      </goals> 
      <configuration> 
       <sources> 
       <source>${project.build.directory}/generated-sources/main/java/</source> 
       </sources> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
+0

Ich war nicht klar in meiner Frage: Es kompiliert * keine * Java-Dateien. Nicht die generierten Dateien und nicht die Dateien, mit denen wir angefangen haben. Das sourceRoot-Element fügt das generierte Quellenverzeichnis dem Kompilierpfad hinzu (z. B. werden die generierten Dateien im Echobeispiel kompiliert). –

+0

Ich sollte hinzufügen, dass ich versucht habe, diese Plugin-Konfiguration hinzuzufügen und es hat nichts geändert: noch keine Java-Kompilierung. –

2

Das Problem scheint zu sein, dass Ratten! ruft System.exit() (oder ähnlich) auf und beendet die JVM. Ich hätte gedacht, dass Ant dies umhüllen würde (die Java-Aufgabe wird von einem build.xml übernommen und beendet nicht den Ant-Build), aber das Folgende funktioniert, indem er die Ratten zwingt! Prozess in einem separaten JVM:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.1</version> 
    <executions> 
    <execution> 
     <phase>generate-sources</phase> 
     <goals> 
     <goal>exec</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <executable>java</executable> 
    <arguments> 
     <argument>-classpath</argument> 
     <argument>${basedir}/lib/xtc.jar</argument> 
     <argument>xtc.parser.Rats</argument> 
     <argument>-in</argument> 
     <argument>${project.build.sourceDirectory}</argument> 
     <argument>-out</argument> 
     <argument>${project.build.directory}/generated-sources/main/java/</argument> 
     <argument>${project.build.sourceDirectory}/Dot.rats</argument> 
    </arguments> 
    </configuration> 
</plugin> 

oder fügen Sie einfach fork="true" zum java Aufgabe im antrun Plugin.

Verwandte Themen