问题标签 [compile-time-weaving]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
928 浏览

java - 将带有编译时编织的 AspectJ 应用到没有外部依赖项的 Spring Boot 应用程序

我正在设置一个SpringBoot 应用程序,它应该在命令行上执行。该应用程序包含多个 CommandLineRunner,如果需要的选项通过命令行执行传递,它们会运行它们的特定逻辑。我使用Gradle作为构建工具。

每个跑步者都有一个初始化方法来解析选项并在没有选项通过时打印出帮助语句,我已将其外包给一个方面类。
这就是问题的开始。

起初,我已经使用Spring AOP成功尝试过,但这不是一个选项,因为我还想将私有方法与我的方面绑定。所以我必须使用更强大的 AspectJ 来实现这一点。

不幸的是,AspectJ Load-Time Weaving对我来说不是一个选项,因为它需要在执行 jar 时将 jvm-arguments 传递给命令行,而我想避免这种情况。

所以从我现在看到的情况来看,只剩下AspectJ Compile-Time WeavingAspectJ Post-Compile-Time Weaving

AspectJ Compile-Time Weaving 看起来最适合我,但不幸的是,必须从 io.freefair 应用如下插件。
链接:https
://plugins.gradle.org/plugin/io.freefair.aspectj.compile-time-weaving 我已经尝试过了,它工作正常,但我的目标是避免向我的项目添加外部依赖项,因此我正在尝试从 Spring 或标准 Java 系列中找到解决方案。

编译后编织也是如此。

我读过的关于编译时编织的每个教程或答案都是关于应用插件的。我想知道我没有找到解决我的用例的方法,除了上面的 io.freefair 插件。

主类:

我的方面类如下所示:

所涉及的 bean 在 applicationContext.xml 中描述,如(Snippet):

我的 build.gradle 看起来像这样(片段):

当我不应用 io.freefair 插件时,我收到以下错误消息。

AspectJ 应该创建我的 ConfigurationsAspect 的实例并插入 aspectOf() 方法,如果它工作正常,Spring 正在搜索该方法。

导致我的问题:

是否有机会在不应用外部依赖项的情况下实现 AspectJ 编译时(或编译后)编织?

如果不是那么,即使我更喜欢编译时编织,是否有机会在没有传递 JVM 参数以正确运行 jar 的情况下实现加载时编织?


谢谢和问候。

0 投票
0 回答
26 浏览

java - 为什么没有跟踪 AspectJ 之前和之后的日志?

我想跟踪日志

但是没有任何日志被跟踪。有谁知道我为什么错了或者我想知道要导入的实际 gradle 依赖项

请帮助我谢谢。

0 投票
1 回答
108 浏览

c# - 使用 Fody 和 Ionad 替换外部程序集上的静态调用

我正在使用 Fody 和 Ionad 替换静态调用,DateTime.Now如文档中所述:

这适用于我的项目中的程序集。但是,我的项目没有直接引用外部程序集,我需要执行相同的替换,但按需...

如何为特定程序集运行 Fody Ionide(给定路径?)

0 投票
1 回答
1503 浏览

spring-boot - 如何在多模块项目(编织所有模块)中使用 Spring BOOT 和 Gradle 实现 AspectJ 编译时编织?

我想配置 Spring BOOT 以使用 AspectJ 的编译时编织。我面临的基本问题是,如果从同一个对象中调用注释函数,则会忽略 @Transactional、@Cacheable 之类的注释。我知道自动装配是一种解决方法,但这对我来说似乎是一种设计解决方法,我对此并不满意。

我尝试了 io.freefair(io.freefair.aspectj.post-compile-weaving) 的 gradle 插件。我再次通过 @EnableCaching(mode=AdviceMode.ASPECTJ) 注释 springBootMain 将 Spring boot 配置为使用 AspectJ。

请为我提供正确配置的进一步步骤。我应该如何告诉方面来编织这个模块或包?如何告诉 Spring AOP 不要编织已经编织的类?

我正在添加我的 build.gradle。

Spring BOOT 主要

如果在同一个类中调用带注释的函数,则 @Transactional 和 @Cacheable 之类的注释会被忽略。我希望这些注释在同一个类中工作而无需自动装配。

0 投票
1 回答
384 浏览

aspectj - Spring Application中的编译时间编织无法正常工作

我正在使用 AspectJ 作为加载时间编织来编译团队编织,因为同样的编织会导致服务器启动时产生额外的开销。所以问题在于编译时正在编织所有类。但是,当在服务器上运行应用程序时,它永远不会进入任何 Aspect 类。

因此,由于我有一些使用 lombok 的类,所以我这样做并添加了编译时 maven 插件

所以现在就像在编译时一样,它已经编织了所有的类。但是在运行时它不会出现在 Aspects.java 中。还有什么我需要添加配置的。?我需要在 spring-config.xml 中添加配置吗?

0 投票
1 回答
174 浏览

c# - PostSharp 没有在新的 csproj 中运行

在任何使用新的 VS2017 csproj 格式(.NET Core、Standard 或 Framework)的项目上,除非 PostSharp 是直接的 NuGet 依赖项,否则不会将方面编织到代码中。

例如,如果我创建一个依赖于PubComp.Caching.AopCaching的 .NET Core 项目,该项目依赖于 PostSharp,它将允许我使用在 AopCaching NuGet 中定义的方面。该项目将编译,但 PostSharp 方面实际上并未编织到代码中。使其工作的唯一方法是将 PostSharp 作为直接 NuGet 依赖项安装。

我认为这与 msbuild 为新的 csproj 解析 NuGet 依赖项的顺序以及 PostSharp 的 IL 代码编织发生的时间有关。

有谁知道它为什么会发生?除了记住始终安装 PostSharp 之外,还有其他解决方案吗?

0 投票
1 回答
519 浏览

java - AspectJ 找不到 .raw 超类

背景

一个项目使用 Aspects 进行日志记录。详情:

  • 爪哇 11
  • AspectJ 1.9.4(运行时、工具、编译器、编译后编织插件)
  • Mockito 核心 2.25.1

build.gradle文件类似于:

问题

应用编译时,AspectJ 找不到MockMethodDispatcher,报错:

我怀疑这是因为文件存储为.raw文件而不是.class文件(根据问题 845):

问题

您将如何更新 Gradle 文件以指示编译后编织插件完全忽略编织(或扫描)Mockito 类?

笔记

从命令行,编织似乎工作:

虽然应该将输出类woven.jar注入到application.jar.

附录

笔记:

  • 通过使用注释装饰@Aspect-annotated 类来解决此问题!within @Pointcut是不可行的。强烈希望ajc通过插件传递参数。
  • 从错误降级cantFindType为警告将是一个令人满意的答案,但并不理想(停留在语法上),因为我希望其他cantFindType错误保持为错误。

有关的

尝试

调用compileJava时如下:

Gradle 报以下错误:

无法为 类型的对象设置只读属性“类路径”的值io.freefair.gradle.plugins.aspectj.AjcAction

使用:

Gradle 报告:

找不到类型对象的参数 [...] 的方法 options() io.freefair.gradle.plugins.aspectj.AjcAction

master 上的源代码似乎为其“可配置的东西”公开了不同的名称:

0 投票
2 回答
850 浏览

spring-boot - Spring @Transactional + AspectJ 编译时编织不起作用

我有一堆用@Transactional 注释标记的方法,然后它们进行自我调用,其中一些方法是私有的,所以我想在Spring 中使用AspectJ 风格的事务管理。

我正在用aspectj-maven-plugin1.11 版编译我的代码:

编译部分工作正常,我看到我的类被编织在日志中,我也可以在类文件中看到:一堆...$AjcClosure...类。

但是,我的 Maven 脚本正在使用 Mavensurefire插件执行集成测试(即 Spring Boot 测试),并且旨在验证事务是否正在回滚以防引发异常的测试失败。

这是我的@Configuration文件:

我在这里想念什么?

0 投票
3 回答
390 浏览

java - 持久化不识别实体类

我正在开发一个关于我国一些彩票的 java 程序,它有一个包含乐透和其他号码的数据库。实体类没有问题,但是当我运行该问题时,我的持久性单元无法识别一个实体类。我是java初学者,先谢谢了。

这是Numbers实体类:

我用来插入Numbers数据库的代码:

persistence.xml:_

持久性单元识别我所有的实体类,但不是这个,我不知道如何解决这个问题......

JPA 日志记录:

0 投票
2 回答
71 浏览

c# - 源在 Fody 装饰方法上不可用

我有以下情况:

解决方案

whereProjectA是一个简单的类库,并且ProjectB是一个控制台应用程序。

ProjectA.Class1.cs包含以下代码:

ProjectA.Weaver.cs包含:

控制台应用程序的 ( ProjectB.Program.cs) 入口点包含:

ProjectA.FodyWeavers.xml包含:

如果我在里面放了一个断点Class1.A(),并尝试单步执行( ),会弹出F11以下Source Not Available窗口:

来源不可用

有没有办法:

  • 防止调试器尝试进入编织器
  • 告诉调试器 weaver 的源代码在哪里

我试过了:

  • 仅启用我的代码
  • 将属性添加到Weaver.cs方法 ( [DebbugerNonUserCode], [DebbugerStepThrough], [DebbugerHidden]...)
  • 将 Fody 引用添加到ProjectB
  • 将项目的构建调试信息设置为Full

使用:

  • Visual Studio 2019 社区版
  • .NET 框架 4.7.2
  • 福迪 6.2.0
  • 方法装饰器.Fody 1.1.0