Maven:编译包含 Java 1.6 源代码的 aspectj 项目

2022-09-02 01:40:16

主要问题

我想做的相当容易。至少你会这么想。但是,没有任何内容正常工作。

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

注意:我们的代码不能用javac编译。也就是说,如果方面没有编织进来,它将无法编译(因为我们有软化异常的方面)。


2011年2月21日更新:有两个同样可行的解决方案(两种情况都使用aspectj-maven-pluginmaven-compiler-plugin结合使用):

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

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







相关问题

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

  1. 你如何让maven直接运行aspectj:compile目标,而无需运行编译:编译?
  2. 如何忽略编译:编译的失败?
  3. 如何指定指向您自己的 ajc 编译器的自定义编译器 Id(即使 compile:compile 使用 plexus 编译器以外的 aspectj 编译器)?
感谢您的任何和所有建议。这些是我尝试过的事情,导致我的问题/疑问:


尝试1(失败):指定aspectaj作为maven-compiler-plugin的编译器:
<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:

<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 clean test-compile
mvn clean compile

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

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

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

mvn clean aspectj:compile

这是有效的,因为它构建成功,但这是不可接受的,因为我们需要能够直接运行编译目标和测试编译目标(m2eclipse自动构建取决于这些目标)。此外,以这种方式运行它将要求我们在此过程中阐明我们想要的每个目标(例如,我们需要分发资源,运行测试和部署测试资源等)


答案 1

AspectJ 插件的 1.3 版特意将其编译目标的默认阶段从 更改为 ,请参阅 MASPECTJ-13。这会导致像您或MASPECTJ-92这样的后续问题。要恢复之前在 javac 之前运行 ajc 的行为,您只需在相关的“执行”标签上添加一个“phase”标签,如下所示:process-sourcescompile

<execution>
    <phase>process-sources</phase> <!-- or any phase before compile -->
    <goals>
        <goal>compile</goal>
        <goal>test-compile</goal>
    </goals>
</execution>

答案 2

告诉maven-compiler-plugin跳过所有*.java文件并让aspectj-maven-plugin来完成这项工作怎么样?

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

推荐