2009-07-02 26 views
0

我的項目使用Rats! parser generator生成源代碼。老鼠!沒有一個Maven插件,我所知道的,所以我想使用Ant的Java 任務以建立解析器,像這樣:Maven:在Ant任務後Java類不能編譯

<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> 

什麼大鼠的細節!並不重要:最終結果是 上面生成Dot.java並將其放入 target/generated-sources/main/java。它工作正常。

問題是,在我的pom.xml中有這個plugin元素, 項目中的Java文件沒有得到編譯。

我生成使用「mvn archetype:create -DgroupId=foo -DartifactId=bar」項目 並添加 文件src/main/java/Dot.rats

module Dot; 

public void Dot = "." !_ ; 

如果我運行「(這是接受與單點只有文件的語法。) mvn compile「沒有plugin元素,我得到:

$ 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] ------------------------------------------------------------------------ 

正在編譯的Java文件是src/main/java/foo/App.java,這是一個由原型創建的Java類(即不是生成的源文件)。

如果我做 「mvn clean」 然後添加plugin元素調用鼠!我得到:

$ 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 ... 

即,Maven的運行鼠! (這不是失敗,AFAICT),但不編譯任何 Java類,甚至不存在已存在的類App.java。運行後,我有target/generated-sources/main/java/Dot.java但沒有target/classes

我試過其他類型的Ant任務,它們不會干擾Java 編譯。例如,如果我取代以上的 回聲任務

<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> 

任務元素,我得到

$ 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] ------------------------------------------------------------------------ 

顯然有什麼東西我不理解關於Maven 如何執行java任務。有什麼簡單的,我在做 錯?有沒有其他方法可以完成這個任務,我應該嘗試一下(也許更「原生的Maven」)?

[更新]有趣的故事。我試圖用一個Maven插件替換Ant任務,通過編寫RatsMojo類直接調用xtc.parser.Rats

<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> 

更換上述plugin元素它不完全一樣的東西:它運行鼠!然後終止而不編譯項目中的Java文件的任何

回答

1

您需要將新目錄添加到maven源目錄。可以使用buildhelper-maven-plugin完成。添加到你的朋友:

<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

我不清楚我的問題:它不編譯任何* Java文件。不是生成的文件,也不是那裏開始的文件。 sourceRoot元素確實將生成的源目錄添加到編譯路徑中(例如,生成的文件在echo示例中得到編譯)。 – 2009-07-02 16:17:21

2

這個問題似乎是大鼠!調用System.exit()(或類似的),終止JVM。我本以爲Ant會包裝這個(java任務從build.xml複製過來,並且不會終止Ant構建),但下面的方法通過強制大鼠來實現!加工成一個單獨的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> 

,或者只是添加fork="true"java任務在antrun插件。