0

私のプロジェクトは、 Rats!を使用してソース コードを生成します。パーサージェネレーター。ネズミ!私が認識している 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。それは正常に動作します。

問題は、 my のこの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 クラスです (つまり、生成されたソース ファイルではありません)。

" " を実行してから、 Rats! を呼び出す要素を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 は Rats を実行しています。(これは失敗ではありません、AFAICT)が、既存のクラスでさえも、JavaクラスをコンパイルしてApp.javaいません。走った後、私は持っていますtarget/generated-sources/main/java/Dot.javaが、ありませんtarget/classes

私は他の種類の Ant タスクを試しましたが、それらは Java コンパイルを妨げません。たとえば、上記の task 要素を echo タスクに置き換えると

<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 ネイティブな」方法)?

【追記】おかしな話。AntタスクをMavenプラグインに置き換えてみました。直接RatsMojo呼び出すクラスを作成し、上記の要素をxtc.parser.Ratsplugin

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

それはまったく同じことをします: Rats を実行します! その後、プロジェクト内の Java ファイルをコンパイルせずに終了します。

4

2 に答える 2

2

問題はそのネズミのようです!呼び出しSystem.exit()(または同様のもの) を呼び出し、JVM を終了します。私は Ant がこれをラップすると思っていたでしょう (Java タスクは a からコピーされ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"するだけです。javaantrun

于 2009-07-03T15:58:53.127 に答える
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>
于 2009-07-02T15:18:05.447 に答える