[英]Error while compiling when using AspectJ compiler instead of Javac
我有一個多模塊項目。 該方面目前已添加到“核心”項目中。 在這里進行mvn clean install
,它可以工作。 但是,嘗試在父項目上執行mvn clean install
時,在編譯其他項目之一時會出現此錯誤:
無法解析org.hibernate.annotations.CacheConcurrencyStrategy類型。 它是從所需的.class文件間接引用的
如果我在該項目中添加Hibernate核心依賴項也可以,但是將依賴項添加到不應該具有依賴項的項目中是沒有意義的 - 所以它不是一個解決方案。 使用javac
編譯時,它可以正常工作。
是什么原因? 我如何解決它,以便我可以使用AspectJ編譯器而不會泄漏依賴項到不應該有的項目?
我在父POM中有這個配置:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.5</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<complianceLevel>1.6</complianceLevel>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
更新
我剛剛發現。 每次運行mvn clean install
都會失敗。 但是,運行mvn [clean] install
一次失敗。 然后在沒有clean
情況下運行mvn install
。 我看到目標文件夾中的builddef.lst
是它工作的原因,並根據你是否運行干凈而失敗。 所以現在我的問題是:你如何自動生成這個文件?
父POM文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>core-lib</artifactId>
<name>core-lib</name>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.5</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<complianceLevel>1.6</complianceLevel>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.4</version>
</dependency>
</dependencies>
<modules>
<module>core-xyz</module>
<module>core-xyz2</module>
</modules>
</project>
在maven調用上啟用調試以深入挖掘。 您應該觀察到aspectj編譯僅在第一次使用clean進行maven調用期間被調用。 由於builddef.lst在第一次調用之后已經存在,因此不使用clean調用會跳過aspectj編譯。
之前已經觀察到了這個方面的編譯插件行為,並在此處進行了描述:
http://out-println.blogspot.com/2007/08/compile-time-checks-with-aspectj-part-2.html?m=1
您需要更深入地研究底層問題,但正如一位評論者已經建議的那樣,只應在需要它的模塊中啟用aspectj編譯器。
否則,正如您已經觀察到的那樣,aspectj編譯需要額外的依賴項。 我已經將aspectj compile合並到我自己的工作中而沒有問題,只將它限制為只需要它的模塊。
根據AspectJ編譯器Maven插件,您可以設置argumentFileName
來定位現有的builddef.lst
。
因此,您可以生成builddef.lst
並將其復制到您的資源文件夾,並指示AspectJ Maven插件使用該文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.