2009-07-02 14 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に置きます。それはうまく動作します。

このplugin要素が私のpom.xmlにあり、 のどれもプロジェクトの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] ------------------------------------------------------------------------ 

コンパイルされる1つの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-native"のやり方)を試みるべきであるというこの作業を達成する別の方法がありますか?

[UPDATE]面白い話。それはラットを実行します:私は、それはまったく同じことを行い、直接xtc.parser.Ratsを呼び出すRatsMojoクラスを書いて、

<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要素を交換することにより、MavenプラグインとAntタスクを交換してみました!プロジェクト内のJavaファイルのをコンパイルせずに終了します。

答えて

1

新しいディレクトリをmavenソースディレクトリに追加する必要があります。これはbuildhelper-maven-pluginを使用して行うことができます。これをあなたのPOMに追加してください:

<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要素は、生成されたソースディレクトリをコンパイルパスに追加します(たとえば、生成されたファイルはエコーの例でコンパイルされます)。 –

+0

私はこのプラグイン構成を追加しようとしましたが、何も変更していないことを付け加えてください:まだJavaコンパイルはありません。 –

2

問題はそうですね! System.exit()(または同様のもの)を呼び出し、JVMを終了します。私は、Antがこれをラップすると思っていたでしょう(Javaタスクはbuild.xmlからコピーされ、Antビルドは終了しません)が、以下はRatsを強制して動作します!

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

または、単にantrunプラグインでjavaタスクにfork="true"を追加します。別のJVMへのプロセス。

関連する問題