代码之家  ›  专栏  ›  技术社区  ›  Charles Duffy

Maven:Java类不会在Ant任务之后编译

  •  0
  • Charles Duffy  · 技术社区  · 16 年前

    Rats! parser generator . 胡扯!没有我知道的Maven插件,所以我尝试使用an t 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 “没有 插件 元素,我得到:

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

    src/main/java/foo/App.java ,由原型创建的Java类(即,不是生成的源文件)。

    mvn clean “然后添加 插件 元素调用老鼠!,我得到:

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

    一、 梅文在跑老鼠!(不是失败,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] ------------------------------------------------------------------------
    

    很明显我不明白马文 java 任务。我在做什么简单的事吗 错了?有没有别的方法来完成这个任务 应该试试(也许是一种更“特立独行”的方式)?

    [更新]有趣的故事。我试图用一个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>
    

    它做着完全相同的事情:它跑老鼠!然后终止而不编译 任何 项目中的Java文件。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Charles Duffy    16 年前

    问题似乎是老鼠!电话 System.exit() (或类似),终止JVM。我本以为Ant会包装这个(java任务是从 build.xml

    <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 插件。

        2
  •  1
  •   David Rabinowitz    16 年前

    您需要将新目录添加到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>