当前位置: 首页 > 面试题库 >

使用Maven在同一个项目中的APT和AOP

翟淮晨
2023-03-14
问题内容

我必须在同一Maven项目中使用注释处理(apt)和AspectJ。

两者都适合自己,但是我需要基于apt创建的代码来创建方面。因此,我需要进行二进制编织(原始源文件由apt扩展)。如何在Maven项目中启用二进制编织?

我知道唯一的标准选项是使用weaveDependencies参数提供依赖关系,但这太糟糕了。还有其他办法吗?

好的,我可以使用Maven Antrun插件嵌入AspectJ ant任务,但是我不想诉诸于此。


问题答案:

我显然是唯一可以回答我自己的问题的人。

我已经使用Maven Antrun插件通过ant来编译AspectJ 。这是我的pom片段:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.4</version>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>${aspectj.version}</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>ajc-compile</id>
            <phase>process-classes</phase>
            <configuration>
                <tasks>
                    <property name="aspectj.sourcepath"
                        value="${project.basedir}/src/main/aspect" />
                    <property name="aspectj.binarypath"
                        value="${project.build.outputDirectory}" />
                    <property name="aspectj.targetpath"
                        value="${project.build.directory}/aspectj-classes" />
                    <property name="scope_classpath" refid="maven.compile.classpath" />
                    <property name="plugin_classpath" refid="maven.plugin.classpath" />
                    <ant antfile="ajc-ant.xml" />
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
        <execution>
            <id>ajc-test-compile</id>
            <phase>process-test-classes</phase>
            <configuration>
                <tasks unless="maven.test.skip">
                    <property name="aspectj.sourcepath"
                        value="${project.basedir}/src/test/aspect;${project.basedir}/src/main/aspect" />
                    <property name="aspectj.binarypath"
                        value="${project.build.testOutputDirectory}" />
                    <property name="aspectj.targetpath"
                        value="${project.build.directory}/aspectj-test-classes" />
                    <property name="scope_classpath" refid="maven.test.classpath" />
                    <property name="plugin_classpath" refid="maven.plugin.classpath" />
                    <ant antfile="ajc-ant.xml" />
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我首先编译Java类(并让APT负责),将编译后的类用作Aspectj的二进制输入,将Aspectj编译到新文件夹中,然后将生成的编织类移动到原始compile目录中,覆盖非aspectj类。这是我的ant XML文件(很好的部分是,我可以将其用于编译和测试编译):

<project basedir="." default="ajc">
    <path id="classpath">
        <pathelement path="${scope_classpath}" />
        <pathelement path="${plugin_classpath}" />
    </path>
    <taskdef
        classname="org.aspectj.tools.ant.taskdefs.AjcTask"
        name="iajc" classpathref="classpath" />
    <target name="ajc">
        <iajc
            sourceroots="${aspectj.sourcepath}"
            inpath="${aspectj.binarypath}"
            destdir="${aspectj.targetpath}"
            classpathref="classpath"
            source="1.6"
            target="1.6"
        />
        <move todir="${aspectj.binarypath}">
            <fileset dir="${aspectj.targetpath}">
                <include name="**/*.class" />
            </fileset>
        </move>
    </target>
</project>

在下一步中,我现在创建了一个Maven插件,该插件在内部完成所有这些ant调用。虽然我不能在这里共享代码,但我将展示它如何简化POM配置:

<plugin>
    <groupId>com.myclient.maven.plugins</groupId>
    <artifactId>maven-ajc-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <executions>
        <execution>
            <id>compile-ajc</id>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
        <execution>
            <id>testcompile-ajc</id>
            <goals>
                <goal>test-compile</goal>
            </goals>
            <configuration>
                <aspectSourcePath>${project.basedir}/src/main/aspect</aspectSourcePath>
            </configuration>
        </execution>
    </executions>
    <configuration>

    </configuration>
</plugin>

使用ANT / GMaven集成,可以轻松组合Maven,Groovy和Ant的功能来组合参数。



 类似资料:
  • 问题内容: Eclipse是一个非常好的编辑器,我更喜欢使用它,但是缺少用于Eclipse的GUI设计工具。另一方面,NetBeans在GUI设计中确实很好用。 使用NetBeans进行GUI设计并将Eclipse用于同一项目上的其他所有内容,是否有任何提示,技巧或陷阱? 编辑: 我尝试了Maven,它似乎不起作用(太复杂,对于我的需求)。 问题答案: 使用Netbeans创建GUI。将Eclip

  • 问题内容: 要一起运行它们,几乎没有可用的选项,但是我选择为Junit和TestNG使用不同的配置文件。但是现在的问题是排除和包含测试用例。 由于如果我们在Maven的主项目中添加testNG依赖项,它将跳过所有Junit,因此我决定将其放在单独的配置文件中。所以我使用pom.xml中的以下条目从默认(主要)配置文件中排除了TestNG测试: 与surefire插件相同。因此,它可以与主配置文件配

  • 问题内容: 可以将 Spark RDD 通过管道传输到Python吗? 因为我需要一个python库来对数据进行一些计算,但是我的主要Spark项目基于Scala。有没有办法将两者混合使用或让python访问相同的spark上下文? 问题答案: 实际上,您可以使用Scala和Spark以及常规Python脚本来传递到python脚本。 test.py 火花壳(scala) 输出量 你好约翰 你好林

  • 问题内容: 今天,我一直在尝试寻找一个合适的解决方案来建立一个既包含Java代码又包含Scala代码(它们之间具有双向依赖性)的maven项目。 我发现的解决方案通常包括在该阶段调用scala-maven-plugin或maven-scala- plugin,以便它在默认的maven编译器插件之前运行(示例:http : //www.hascode.com/2012/03 /片段混合- 斯卡拉的J

  • 正在处理一个庞大复杂的应用程序,该应用程序目前正在使用hibernate LocalSessionFactoryBean、HibernateTransactionManager和HibernateTemplate。有没有可能我可以使用JPA进行我的新特性开发,这样我就可以使用SPRING DATA JPA在我的持久性层上工作了?我的当前配置如下。 但是,我想为新的东西添加LocalContaine

  • 我正在构建一个定制的Java库。我把我的大部分“重复”代码都保存在那里,比如文件处理、字符串处理等。每次我想使用它们时,我都必须将该类复制并粘贴到我正在进行的其他项目中。有没有办法让这个自定义库类成为“依赖项”?我在用我的智能手机。