java - 如何阻止 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>
解决方案
可能的解决方案
此解决方案并不适用于所有人,并且确实是达到最终目标的迂回方式。您可以提取要修改的类,然后用原始 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"/>
总之:
- 我从第三方 jar 中提取了我需要编织的类,包括所需的 Aspect 类(包含依赖项,因为此 jar 在构建类路径中)
- 运行 iajc ant 任务,将我的建议编织到类中,创建一个 jar。
- 从第三方 jar 中删除类,并从新 jar 中添加类,创建一个组合修改后的 jar。
推荐阅读
- acumatica - Acumatica GI 看到软删除的数据
- batch-file - Saxon:result-document() 函数失败且没有错误消息
- google-cloud-firestore - Google Cloud Firestore/Datastore 中的不同阶段(例如开发、生产)
- r - 获取 RStudio Server 开源版本以使用替代 gcc 版本
- amazon-web-services - 在厨师中创建 cron
- entity-framework - 使用 DbContext 获取子项计数并映射到属性
- angular - 如何在 owl-date-time 组件上设置默认日期和时间
- python - 用于创建 Windows 服务的包
- azure - TFS 2018 AzureFileCopy 任务版本 2
- postgresql - 了解 SQL 查询复杂性