代码之家  ›  专栏  ›  技术社区  ›  gMale

Maven:编译包含Java 1.6源的AspectJ项目

  •  20
  • gMale  · 技术社区  · 14 年前

    主要问题

    我想做的事情相当容易。你可能会这么想。但是,没有任何东西可以正常工作。

    要求: 使用Maven,使用AspectJ编译器编译Java 1.6项目。

    注: 我们的代码不能用javac编译。也就是说,如果方面没有交织在一起,那么编译就会失败(因为我们有软化异常的方面)。

    HR/> update 2/21/2011: > 对此,有两种同样可行的解决方案(两种情况都使用与 maven编译器插件结合的 aspectj maven plugin ):

      <添加> <failonerror>false</failonerror> 到编译器插件(谢谢 pascal thinvent )
    1. 添加 <phase>Process Sources</phase> 到AspectJ编译器插件 (谢谢 andrew swan )

    有关这些解决方案的更多信息,请参阅答案部分。我相信解决方案2是更好的方法。









    相关问题

    问题(基于下面失败的尝试):

    < OL>

  • 如何让Maven直接运行aspectj:compile目标,而不运行compile:compile?
  • 如何忽略编译失败:编译?
  • 如何指定指向您自己的AJC编译器的自定义编译器ID(即make compile:compile使用的不是plexus编译器的aspectj编译器)?*
  • 谢谢你的建议。我尝试过的这些事情导致了我的问题:
    BR/>
    尝试1(失败): 将aspectj指定为maven编译器插件的编译器:
    plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>Maven编译器插件</artifactid>
    <版本>2.2</version>
    <配置>
    <source>1.6</source>
    <target>1.6</target>
    <compilerID>AspectJ</compilerID>
    </configuration>
    <相关性>
    <相关性>
    <groupid>组织。codehaus.plexus</groupid>
    <artifactid>Plexus编译器Aspectj</artifactid>
    <版本>1.8</version>
    </dependency>
    </dependencies>
    & Lt//Plutin & Gt;
    < /代码> 
    
    

    失败,错误为:

    org.codehaus.plexus.compiler.compilerException:The source version was not recognized:1.6

    无论我使用的是什么版本的Plexus编译器(1.8、1.6、1.3等),这都不起作用。实际上我读过源代码,发现这个编译器不喜欢Java 1.5上的源代码。

    尝试2(失败): 使用附加到编译和测试编译目标的aspectj maven插件:

    plugin>
    <groupid>组织。codehaus.mojo</groupid>
    <artifactid>aspectj maven插件</artifactid>
    <版本>1.3</version>
    <配置>
    <source>1.6</source>
    <target>1.6</target>
    </configuration>
    <执行>
    <执行>
    目标;
    <goal>编译</goal>
    <goal>测试编译</goal>
    &目标;
    </执行>
    </执行>
    & Lt//Plutin & Gt;
    < /代码> 
    
    

    运行以下任一项时失败:

    mvn clean test compile
    mvn clean compile

    因为它尝试在运行aspectj:compile之前执行compile:compile。如上所述,我们的代码不是用javac编译的——这些方面是必需的。因此,MVN需要跳过compile:compile目标,只运行aspectj:compile.@p>

    尝试3(有效但不可接受):

    使用上面相同的配置,但运行:

    mvn clean aspectj:compile

    这是可行的,因为它可以成功地构建,但不可接受,因为我们需要能够直接运行编译目标和测试编译目标(m2eclipse自动构建依赖于这些目标)。此外,以这种方式运行它将要求我们详细说明沿途所需的每个目标(例如,我们需要分配资源和要运行的测试,以及部署的测试资源等)

    要求: 使用Maven,使用AspectJ编译器编译Java 1.6项目。

    注: 我们的代码不能用javac编译。也就是说,如果方面没有交织在一起,那么编译就会失败(因为我们有软化异常的方面)。


    2011年2月21日更新: 有两个同样可行的解决方案(两种情况都使用AspectJ Maven插件与…结合Maven编译器插件):

    1. 添加 <failOnError>false</failOnError> 到编译器插件(谢谢 Pascal Thivent)
    2. 添加<phase>process-sources</phase> 到AspectJ编译器插件 (谢谢)Andrew Swan)

    有关这些解决方案的更多信息,请参阅答案部分。我认为解决方案2是更好的方法。







    相关问题

    问题(基于以下失败的尝试):

    1. 如何让Maven直接运行aspectj:compile目标,而不运行compile:compile?
    2. 如何忽略编译失败:编译?
    3. 如何指定指向您自己的AJC编译器的自定义编译器ID(即make compile:compile使用的不是plexus编译器的aspectj编译器)?*
    谢谢你的建议。我尝试过的这些事情导致了我的问题:


    尝试1(失败): 将aspectj指定为maven编译器插件的编译器:
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.2</version>
    <configuration>
     <source>1.6</source>
     <target>1.6</target>
     <compilerId>aspectj</compilerId>
    </configuration>
    <dependencies>
     <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-compiler-aspectj</artifactId>
      <version>1.8</version>
     </dependency>
    </dependencies>
    </plugin>
    

    失败原因如下:

    org.codehaus.plexus.compiler.CompilerException: The source version was not recognized: 1.6

    无论我使用的是什么版本的Plexus编译器(1.8、1.6、1.3等),这都不起作用。实际上我阅读了源代码,发现这个编译器不喜欢Java 1.5之上的源代码。

    尝试2(失败): 使用附加到编译和测试编译目标的aspectj maven插件:

    <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.3</version>
    <configuration>
     <source>1.6</source>
     <target>1.6</target>
    </configuration>
    <executions>
     <execution>
      <goals>
       <goal>compile</goal>      
       <goal>test-compile</goal> 
      </goals>
     </execution>
    </executions>
    </plugin>
    

    当运行以下任一项时,此操作失败:

    MVN清理测试编译
    MVN清理编译

    因为它尝试在运行aspectj:compile之前执行compile:compile。如上所述,我们的代码不是用javac编译的——这些方面是必需的。因此,MVN需要跳过compile:compile目标,只运行aspectj:compile。

    尝试3(有效但不可接受):

    使用上面相同的配置,但运行:

    mvn clean aspectj:compile

    这是可行的,因为它可以成功地构建,但不可接受,因为我们需要能够直接运行编译目标和测试编译目标(m2eclipse自动构建依赖于这些目标)。此外,以这种方式运行它需要我们一路阐明我们想要的每一个目标(例如,我们需要分配资源、运行测试和部署测试资源等)

    4 回复  |  直到 7 年前
        1
  •  16
  •   Andrew Swan    13 年前

    AspectJ插件的1.3版 deliberately changed 其编译目标的默认阶段从“流程源”到“编译”。要恢复先前在javac之前运行ajc的行为,只需向相关的“执行”标记添加一个“阶段”标记,如下所示:

    <execution>
        <phase>process-sources</phase> <!-- or any phase before compile -->
        <goals>
            <goal>compile</goal>
            <goal>test-compile</goal>
        </goals>
    </execution>
    
        2
  •  4
  •   naXa stands with Ukraine    7 年前

    告诉Maven编译器插件如何跳过所有*.java文件,让AspectJ Maven插件完成这项工作吗?

    ...
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.0.2</version>
          <configuration>
            <excludes>
              <exclude>**/*.java</exclude>
            </excludes>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>aspectj-maven-plugin</artifactId>
          <version>1.3</version>
          <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <encoding>utf-8</encoding>
            <complianceLevel>1.6</complianceLevel>
          </configuration>
          <executions>
            <execution>
              <goals>
                <goal>compile</goal>       <!-- weave main classes -->
                <goal>test-compile</goal>  <!-- weave test classes -->
              </goals>
            </execution>
           </executions>
        </plugin>
      </plugins>
    </build>
    
        3
  •  2
  •   naXa stands with Ukraine    7 年前

    我在项目中使用这个配置来使用Maven编译AspectJ和Java 6。

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.8</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.3</version>
                <configuration>
                    <complianceLevel>1.6</complianceLevel>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>  
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    裁判: aspectj-maven-plugin

        4
  •  1
  •   naXa stands with Ukraine    7 年前

    如何指定指向您自己的AJC编译器的自定义编译器ID(即make compile:compile使用的不是plexus编译器的aspectj编译器)?

    我不知道如何指定另一个 compilerId "official" 那些。不确定是否有可能。

    我的理解是 http://jira.codehaus.org/browse/MCOMPILER-107 将解决您的问题(AspectJ 1.6 +确实支持Java 1)。6,对吗?)很遗憾,它还开着。

    如何忽略编译失败:编译?

    这个 compiler:compile 目标 Maven Compiler plugin 有一个 failOnError 可选参数允许 指示生成是否将继续,即使存在编译错误 .

    <project>
      ...
      <build>
        ...
        <plugins>
          ...
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.2</version>
            <configuration>
              <failOnError>false</failOnError>
              ...
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    这可能是解决上述问题的一个丑陋的方法。

    如何让Maven直接运行aspectj:compile目标,而不运行compile:compile?

    问题是 编译器:编译 绑定到 compile 阶段,不能删除 default lifecyle binding . 所以也许还有另一个选择,但我唯一能想到的就是改变一切 远离的 通过使用 <packaging>pom<packaging> 手动重新绑定所有目标(至少对于这些阶段: process-resources , 编译 , process-test-resources ,请 test-compile , test , package )简而言之,就是这样:

    process-resources       resources:resources
    compile                 aspectj:compile
    process-test-resources  resources:testResources
    test-compile            compiler:testCompile
    test                    surefire:test
    package                 ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
    install                 install:install
    deploy                  deploy:deploy
    

    这可能是另一个丑陋的解决方法。免责声明:未经测试,但应该有效。