簡體   English   中英

使用AspectJ編譯器而不是Javac編譯時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM