首页 > 解决方案 > 如何阻止 AspectJ 重新编织?

问题描述

我正在尝试将新逻辑编织到第三方二进制文件中,这样做时,会出现我的新建议,但它也会重新编织第三方二进制文件中的所有原始建议。之前完成的编织(我假设它是在编译时完成的)适用于大多数类,但对于某些类,它不会应用回建议。我通过运行iajc任务而不包括新方面、反编译二进制文件并比较它们的差异来看到这种差异。

如何删除先前的建议(它如何知道什么是建议/什么不是),以及如何阻止编译器删除以前的建议?

另外,有什么办法只能修改第三方二进制中的单个类吗?

理想情况下,我会在之前的建议之上添加我的建议(没有冲突)。

我的iajc任务:

<iajc
    srcdir="../src"
    source="1.7"
    inpath="${build.web.lib}/thirdpartylibrary-original.jar"
    outjar="${build.web.lib}/thirdpartylibrary.jar"
    XlintFile="../src/com/company/utility/helperAspect/ajc.properties">

    <include name="com/company/utility/helperAspect/HelperAspect.aj"/>
    <include name="com/company/utility/Helper.java"/>

    <classpath refid="build.classpath">
    </classpath>
</iajc>

标签: javaaspectj

解决方案


可能的解决方案

此解决方案并不适用于所有人,并且确实是达到最终目标的迂回方式。您可以提取要修改的类,然后用原始 jar 重新打包它们,而不是在整个第三方二进制文件中运行方面。

同样,这是一个迂回的解决方案,如果第三方方面修改了您的方面修改的文件,这将无法解决您的问题。

<!-- Rename original thirdpartylibrary.jar -->
<move failonerror="true" file="${build.web.lib}/thirdpartylibrary.jar" tofile="${build.web.lib}/thirdpartylibrary-original.jar" />

<!-- Create a jar containing only the classes required for the AspectJ Weaving -->
<zip destfile="${build.web.lib}/thirdpartylibrary-onlyModificationClass.jar" >
    <zipfileset src="${build.web.lib}/thirdpartylibrary-original.jar" includes="**/ClassForModification.class" />
</zip>

<!-- Create a jar containing the weaved classes -->
<iajc
        srcdir="../src"
        source="1.7"
        inpath="${build.web.lib}/thirdpartylibrary-onlyModificationClass.jar"
        outjar="${build.web.lib}/thirdpartylibrary-onlyModificationClass-withTooling.jar"
        XlintFile="../src/com/company/utility/helperAspect/ajc.properties"
>
    <!-- Inclusions for Helper tool -->
    <include name="com/company/utility/helperAspect/HelperAspect.aj"/>
    <include name="com/company/utility/Helper.java"/>

    <classpath refid="build.classpath">
    </classpath>
</iajc>

<!-- Combine the original thirdpartylibrary.jar with the new weaved files -->
<zip destfile="${build.web.lib}/thirdpartylibrary.jar" >
    <zipfileset src="${build.web.lib}/thirdpartylibrary-onlyModificationClass-withTooling.jar"/>
    <zipfileset src="${build.web.lib}/thirdpartylibrary-original.jar" excludes="**/ClassForModification.class"  />
</zip>

<!-- Delete temporary jar artifacts created during the weaving process -->
<delete file="${build.web.lib}/thirdpartylibrary-original.jar"/>-->
<delete file="${build.web.lib}/thirdpartylibrary-onlyModificationClass.jar"/>
<delete file="${build.web.lib}/thirdpartylibrary-onlyModificationClass-withTooling.jar"/>

总之:

  1. 我从第三方 jar 中提取了我需要编织的类,包括所需的 Aspect 类(包含依赖项,因为此 jar 在构建类路径中)
  2. 运行 iajc ant 任务,将我的建议编织到类中,创建一个 jar。
  3. 从第三方 jar 中删除类,并从新 jar 中添加类,创建一个组合修改后的 jar。

推荐阅读