问题标签 [load-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 投票
2 回答
25490 浏览

spring - 带有 AspectJ 的 Spring AOP:加载时间编织

如果我使用的是基于 AspectJ 的 Spring AOP,那么我是否必须将我的方面配置为使用加载时间编织?或者当使用基于 AspectJ 的方法时,Spring AOP 是否也支持运行时/编译时编织?

0 投票
1 回答
882 浏览

spring - Spring @Configurable 类没有自动装配其依赖项的问题

我正在尝试为我的 Spring Boot 应用程序配置加载时间编织,以正确地自动装配对@Configurablejava 类的依赖关系。

这是我的配置/主类:

这是我启动应用程序的方式(我的 gradle 构建重命名了 spring-instrument jar):

这是@Configurable没有自动装配其依赖关系的类:

这是类实例化的地方(使用new):

任何人都可以帮助弄清楚为什么StringToDayToTimeSlotConverter没有自动装配依赖项吗?

0 投票
1 回答
290 浏览

spring - TomcatLoadTimeWeaver 中断 Log4j 2

我有一个严重的问题,TomcatLoadTimerWeaverLog4j不知道如何解决它。

我正在使用以下内容:

  • 雄猫 8
  • Spring 框架 4.1.2
  • 日志4j 2.1
  • SLF4J 1.7.7
  • EclipseLink 2.5.2

所有日志都被路由到 SLF4J,我使用 Log4j 2.1 作为日志后端。web.xmlLog4j 被配置为从通过log4jConfigurationcontext-param指定的非标准位置获取其配置文件。在Log4jServletContainerInitializerwebapp 启动时正确配置 Log4j。一旦 Spring 配置了TomcatLoadTimeWeaver.

我想使用 EclipseLink 的加载时间编织,所以我将它添加到我的应用程序上下文中:

问题是这样的:一旦 SpringTomcatLoadTimeWeaver通过向 Tomcat's 添加转换器来注册 a WebappClassLoader,随后第一次尝试通过 SLF4J 记录某些内容会导致 Log4j 被隐式重新初始化:因为我的配置文件不在标准位置(=类路径)我得到错误:

找不到 log4j2 配置文件

从那一刻起,所有日志调用都不再正确处理(= 以我在 MY 中指定的方式log4j.xml),并且我为 Commons Logging 和 JUL 精心配置的 SLF4J+Log4j+bridges 完全被破坏了。

似乎添加类加载器转换器正在重置 Log4j 中的某些内容,因此它需要重新配置自身:我花了几个小时试图更好地理解这个问题,但如果没有对 Log4j 的深入了解,这并不容易内部结构。

将我log4j.xml移到log4j2.xml类路径根目录不是我可以轻易做到的事情(出于部署原因),并且无论如何我都不确定不受我控制的 Log4j 的隐式重新配置是否会是一件好事。

也许加载时间编织器的早期配置(在 Log4j 第一次配置自身之前)会成功,但我不确定如何做到这一点,因为 Log4j 通常应该在 Spring 本身之前设置。

任何建议表示赞赏。

更多详细信息

实际上,问题不会在Spring DefaultContextLoadTimeWeaver(带有由 EclipseLink(由 触发)实际创建的本机。因此,我的解决方法是注册一个拦截 的初始化并强制再次运行,从而使用我的 webapp 设置重新配置 Log4j。不过,我最终得到了一个可怕的 hack,因为那些 Log4j 类充满了默认和受保护的方法,我不得不使用反射并将我的 bean 后处理器放在包中以使其工作。TomcatLoadTimeWeaverLocalContainerEntityManagerFactoryBeanEntityManagerFactoryorg.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet()org.springframework.context.weaving.DefaultContextLoadTimeWeaver.addTransformer(ClassFileTransformer)EntityManagerFactoryorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory()BeanPostProcessorLocalContainerEntityManagerFactoryBeanorg.apache.logging.log4j.web.Log4jWebInitializerImpl.start()org.apache.logging.log4j.core

欢迎提出更智能的解决方案/建议/替代方法。

实际原因

我进一步调试了整个系统并找出了这个问题的原因。我为此打开了 LOG4J2-903。简而言之,Log4j 使用类加载器toString()值在映射中搜索当前日志上下文。由于 Tomcat 的WebappClassLoader.toString()方法在您注册转换器时发生更改,因此 Log4j 无法检索先前配置的上下文并在 EclipseLink+Spring 注册加载时间编织器转换器后立即创建一个新的上下文... :-(

0 投票
1 回答
830 浏览

aspectj - AspectJ 和 Springboot 不能一起工作

在我的项目中,我想将纯 aspectj 与 spring-boot 结合使用。在配置项目时,我们遇到了一些问题。

发现另一个类似的问题,但这对我们没有帮助。

这就是我们所做的:

  • 得到了springboot项目
  • 定义了2个方面,1个简单的spring主类
  • 将 aspectj 插件添加到 gradle build
  • 设置 applicationDefaultJvmArgs 为 aspectjweaver 使用 javaagent

这是我们在 github 上的 repo 的链接。https://github.com/svenhornberg/MDSD

这是 Travis-CI 构建日志https://travis-ci.org/svenhornberg/MDSD/builds

但它仍然无法正常工作。

我想我需要一些帮助。

0 投票
1 回答
79 浏览

java - Is it possible to weave code outside my own code with the help of annotations?

i have an idea and want to know, if it is possible or not and if yes, how. I´m working on a library for other users to simplify their life's.

I have two annotations.

Darwin:

DarwinVersion:

And one aspect.

DarwinAspect:

(This code will set a DarwinVersion automatically to every object after the constructor was called.)

The idea is to weave any classes of users, who declare their classes with the annotations. They only should add my library to their classpath. Like in this example:

This code is working, but only in my own project. In a testproject, which includes the Darwin-library and is annotating a testclass, the annotation is ignored and no code will be weaved. Is is it possible with load time weaving?

0 投票
1 回答
1103 浏览

java - Wildfly 8.2 在 vm 参数中的 javaagent 上启动失败

我是 wildfly8 的新手,也是 aspectJ 的新手。如果我在用于 LTW(加载时间编织)目的的 aspectjWeaver.jar 的 VM 参数中添加 javaagent 参数,Wildfly 8.2 启动将失败。

比我得到低于日志管理器错误:

现在,如果我添加以下两个 vm 参数以及如果我在 bootstarp 路径中添加 jboss-logmanager-1.3.1.Final.jar,则不会出现上述异常,但将出现以下日志格式化程序异常,并且不会再出现 Wildfly开始了。两个虚拟机参数:

错误堆栈跟踪:

任何人都可以建议在javaagent VM中使用aspectjWeaver.jar运行wildfly8.2以进行加载时间编织还需要什么。

0 投票
1 回答
1166 浏览

java - 找不到具体方面的父方面

我试图在wildfly8.2中基于简单的hello world normal Servlet示例测试加载时间编织

我有以下方面代码

以下运行时字段注释

测试小服务程序:

服务等级:

web-inf下的aop.xml:

和 POM.xml:

使用下面的链接来配置加载时间编织:http://wiki.eclipse.org/LTWJboss7

因此,如果我在上面启动 wildfly,它会显示在错误堆栈跟踪下方。

我在这里很困惑做错了什么。有人可以帮我运行我的测试程序。我正在用 wildfly 学习 AspectJ 和 LTW,这一切都是新手。谢谢,

0 投票
1 回答
540 浏览

spring - Spring - 外部 JAR 中的 @Configurable 类

我想为我的域类使用 spring 依赖注入,这些类可能不是在 spring 上下文中创建的。这就是为什么我用注释对这些类进行@Configurable注释,并尝试设置加载时间编织。我的弹簧配置是:

这可以正常工作,但前提是我的@Configurable类与我的主 Spring Boot 应用程序在同一个 JAR 中。但是,我希望@Configurable在 JAR 中添加我的域类,作为主应用程序的依赖项。

我试过这个,但看起来加载时间编织不适用于外部 JAR。你对如何解决这个问题有什么建议吗?

编辑
我已添加-verbose:class到我的 JVM 选项中,并且我发现外部 JAR 中的类在 LoadTimeWeaving 配置和初始化之前由类加载器加载。并且不在外部 JAR 中的类在需要时加载,即在 LoadTimeWeaving 初始化之后。

所以基本上我的问题是:
是否可以在加载外部 JAR 之前初始化 LTW?或者是否可以在配置 LTW 后重新加载(或进行 AspectJ 增强)类?

编辑 2
我发现了为什么在 LTW 初始化之前加载了来自外部 jar 的类的原因。这是因为这些类也带有@Entity注解。因此,它们是在 LTW 初始化之前发生的休眠初始化期间加载的。

所以最后一个问题是: :D
如何假设 LTW 在休眠(可能还有其他)初始化之前被初始化?

0 投票
0 回答
429 浏览

java - AspectJ 加载时间编织需要太多时间

我已经创建了我的可执行 jarscala应用程序的可执行 jar。我正在尝试使用AspectJ Load-Time-Weaving. aspectj 正在按预期工作,但是,在 LTW 之后启动 jar 文件需要花费大量时间。

我的 AOP.xml 如下:

当我运行 jar 文件时

jar 文件在 15 分钟后启动,有时甚至是 30 分钟。我试图通过使用include但不工作来减少aspectj编织。如果我不提供dump,则根本不会调用方面。

谁能帮我解决这个问题?

编辑: 我删除<dump>并使用了<include within ..>. 它正在工作,但仍然需要很多时间(5 分钟)

0 投票
1 回答
1604 浏览

spring-boot - Spring Boot 加载时间编织在嵌入式 tomcat 中不起作用

我无法让 LTW 在带有嵌入式 Tomcat 的 Spring Boot 1.2.2 中工作。

我的应用程序是 WAR 文件,而不是 .JAR 文件。当我在 DEBUG 中运行时,即使点击应该与切入点匹配的调用,它也永远不会在我的方面停止,所以这就是我认为它不起作用的方式......

我的运行脚本这样做:

在 Spring Boot 中,我将此 AOP 配置作为 ApplicationInitializer 加载,因此它立即位于父 ApplicationContext 中,此后我的嵌入式 tomcat Web 应用程序上下文的所有其余部分都应该存在。

我的方面看起来像这样:

我的嵌入式 WAR 的 META-INF/aop.xml 是这样的: