问题标签 [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.
jpa - Java 9 上带有最终字段的 eclipselink 静态编织
我有一些像这样声明为 final 的 JPA 注释字段:
当实体插入数据库时,这些字段存储在数据库中。它们无法进一步更新。对于 Java 编程语言,这些字段可以被认为是最终的。
使用 EclipseLink 静态编织插件,由于一些字节码检测,可以延迟加载实体。
我不知道 JPA 中是否正式允许此类构造(最终字段),但我喜欢使用它们,因为它们在编译时强制要求这些字段不应该被更新。
在 Java 8 中,使用这种结构构建的程序运行良好。但在 Java 9 中,当涉及 EclipseLink 静态编织时,我得到以下运行时异常:
这样的错误似乎是由于以下 JVM 规范:
否则,如果该字段是final,则必须在当前类中声明,并且该指令必须出现在当前类的实例初始化方法()中。否则,抛出 IllegalAccessError。
因此,我觉得一些编织工具需要一些更新来满足这个 JVM 规范。EclipseLink 静态编织工具似乎就是其中之一。
问题:
- JPA 中是否允许诸如此处介绍的最终字段构造?
- 是否有 JDK 9 选项可以禁用对其他地方的最终字段分配的检查,而不仅仅是在类的实例初始化方法()中(作为临时解决方法)?
编辑:
根据 JPA 规范,JPA 中不允许使用最终字段:
实体类不能是最终的。实体类的任何方法或持久实例变量都不能是最终的。
c# - 尝试实施 Fody 加载项时出现投射错误
我正在尝试学习如何编写 Fody 模块,并且正在学习Pluralsight Fody 课程,其中包括一个演练。
示例加载项是向名称以“DTO”结尾的任何类添加接口。他使用了 Fody 源代码中的基本插件,并将 Execute() 方法更改如下...
但是,当我这样做时,我在最后一行代码中得到一个编译器错误......
参数 1:无法从 'Mono.Cecil.TypeDefinition' 转换为 'Mono.Cecil.InterfaceImplementation'
有人知道问题是什么吗?我对这方面的经验不够了解。
java - 在一个项目中使用 Aspectj 编译时编织和 Java 编译时注解处理
我进行了广泛搜索,但没有找到任何可以帮助我解决问题的方法。我正在尝试实现某个功能并且我正在创建一个 PoC 解决方案,但这是一个问题:
它涉及使用编译时编织的 AspectJ 和编译时注释处理器
而且我不知道如何使这两者同时工作。
到目前为止,我一直在 *.aj 文件中使用 aspectj-maven-plugin 中的 AspectJ 方面,它工作正常。但是,当我尝试使用 maven-compiler-plugin 添加注释处理时,一个问题变得明显:在编译阶段由 aspectj-maven-plugin 生成的目标目录中的编织类被 maven-compiler-plugin 覆盖通过它在编译阶段生成的类。
控制台输出说,首先 aspectj-maven-plugin 完成了它的工作并编织了所有类:
但随后 maven-compiler-plugin 开始工作并重新编译所有内容(并使用注释处理器生成类):
这是 pom.xml 的相关部分:
另外,方面和注释处理器都工作正常,所以它们特别不是问题,我认为问题是构建配置。
我猜要么我把插件中的执行/阶段搞砸了,要么我什至不需要同时使用它们,也许只有一个正确配置就足够了,但我不知道如何将编译与 ajc 结合并运行注释处理器(分两个阶段,首先使用 proc none 编译注释处理器本身,然后进行注释处理)。请帮忙!
c# - C#源代码转换
我们正在尝试将大型代码库从一个 UI 库迁移到另一个。这两个库在概念上非常相似,但在大多数情况下存在一些命名差异。我们希望尽可能多地自动化。
我们想要实现类似于 Unity 的 API 更新工具 ( https://docs.unity3d.com/Manual/APIUpdater.html ) 的东西,它会自动替换对过时 API 的调用。是否有 C# 的源代码编织工具/框架?我知道有 Fody ( https://github.com/Fody/Fody ),但它在 IL 级别运行,而不是在源代码级别。
java - 在 maven 项目中使用 AspectJ 注释:编织不起作用
我试图在不使用 Spring 的简单项目中使用 AspectJ,虽然我看到了类似的问题并且我的代码似乎是正确的,但我不明白为什么它不起作用。我使用的是Eclipse Oxygen 4.7.3(不使用AJDT工具)、JDK 7、maven 3.5.2,我的代码如下:
pom.xml
主应用程序.java
HelloWorld.java
TestAspect.java
运行 mvn clean install 成功,但输出只打印“Print Hello...”部分。我应该使用不同的方法吗?(也许改用 .aj 文件,或尝试加载时间编织)任何帮助表示赞赏。
maven - 自动生成“编织实体类”
我正在使用 Spring-Data-JPA 和 EclipseLink。
为了对我的实体类进行静态编织,我定义了我的 pom:
当我执行'maven install'时,我可以看到静态编织已经成功完成。
然后,当我修改我的 jpa 项目的任何实体时,编织实体类将被一个未编织的新实体类覆盖。所以我必须再次手动执行'maven install'才能生成新的编织实体类。
当我修改实体源时,是否有任何自动生成“编织实体类”而不执行“maven install”的方法?
谢谢
spring-boot - Spring boot aspectj gradle编译时编织问题
我有一个弹簧书应用程序,效果很好。如果我的应用程序抛出异常,我想向我发送电子邮件通知。我认为aspectj很合适。
首先,我尝试使用 Spring AOP 运行时编织,它适用于公共方法。但是,我也想收到有关私有方法的通知,并且我已经安排了任务。根据 Spring AOP 文档,运行时编织不适用于计划任务和私有方法。因此,我决定在我的引导应用程序中使用 aspectj 编译时间编织。
我在这里找到了官方的 aspectj gradle 插件:
https://plugins.gradle.org/plugin/at.jku.isse.gradient-gradle
我的启动应用程序有这个依赖:
如果我使用默认编译器,我的项目编译得很好。但是如果我使用 AspectJ 编译器,它总是会抱怨:
如果我删除该依赖项,aspectj 编译正常,我会得到 jar 文件。但是当我运行我的代码时,我得到了这个:
这是我的建议课:
我的 appconfig@EnableAspectJAutoProxy
添加了注释。
如果我在我的 Advice 类中替换@Configuration
为@Component
,我可以运行我的应用程序,但不会调用 afterthrowing 方法。如果我删除@Configuration
.
所以我的问题是:
- 为什么我在由 AspectJ 编译时得到
java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/JsonMarshaller
if 我作为依赖项?spring-boot-configuration-processor
- 在 Spring Boot 应用程序中使用 AspectJ 并使用 gradle 构建的正确方法是什么?(使用
@Configuration
or@Component
?为什么如果我使用@Component
or 不会调用我的后续处理,为什么如果我使用会出现异常@Configuration
?)
谢谢
c# - 装配级别的 Fody MethodDecorator
我正在尝试在装配级别上将 fody 与MethodDecorator一起使用。
我尝试使用示例代码提供的属性而不做任何更改:
如果我使用 all 装饰一个方法[Interceptor]
,则按预期工作。
但是我尝试拦截程序集中的每个方法。示例代码将此属性定位到AttributeTargets.Assembly
. 这向我表明这可能有效。
为了完成这项工作,我添加[assembly: InterceptorAttribute]
了AssemblyInfo.cs
我的项目。
代码仍然编译没有任何错误,但不会调用拦截器。
如果我使用[module: Interceptor]
.
我该怎么做才能让它工作?
有没有其他方法可以拦截程序集/模块中的每个方法?
更新
我发现MethodBoundaryAspect按预期工作。
cucumber - 将 aspectJ 与 Cucumber 一起使用
我正在尝试将 aspectJ 与 cucumber 项目一起使用来添加带有 cucumber 的条件语句(您可能会想为什么......但我是)。它拦截了我在当前项目中拥有的黄瓜步骤定义,但我也有想要编织的依赖 jar,我正在使用 aspectj-maven 插件编织它,但是我的代码无法在此依赖中使用胶水代码,我相信那是因为代码由于编织而被修改了。我应该怎么做呢?
这是 maven-aspectj 插件:
依赖:
我的项目中的胶水代码也使用了它。如果我删除 ,那么我可以将胶水代码和我项目中的任何其他内容与 aspectj 一起使用,但我不能使用此基本依赖项中的任何内容。我想用那个。
我的方面是这样的:
我想用黄瓜做什么是这样的:
我能够在属于我的项目的东西中解决它,但是当我尝试在依赖项中包含步骤定义或粘合代码时,它无法识别任何步骤定义。我尝试使用加载时间编织,但我不确定我是否完全了解如何完成这两件事。
spring - 当没有persistence.xml时如何使用EclipseLink静态编织JPA实体,因为实体由Spring管理
我有一个基于 Spring 的项目,因此实体管理器是通过编程方式设置的,不需要persistence.xml 文件来列出所有实体。
我目前正在使用加载时间编织,但正在尝试使用 Eclipselink 和 Gradle 进行静态编织。我想复制 maven eclipselink 插件执行的操作:
https://github.com/ethlo/eclipselink-maven-plugin
我设置了以下 gradle(请注意,它是 Kotlin DSL 而不是 groovy):
当我尝试运行该任务时,编织任务失败,因为它正在寻找一个不存在的 persistence.xml。
有什么方法可以在基于 Spring 的 JPA 项目中静态编织 JPA 实体?