无法为AspectJ添加javaagent [英] Can't add javaagent for AspectJ

查看:75
本文介绍了无法为AspectJ添加javaagent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个旧的Java6应用程序,我试图添加一些自动和全局日志来跟踪每个方法中的每个调用.它运行在JBoss 4.2.3上.

I have an old Java6 Application, and I'm trying to add some automatic and global log for tracing every call in every method. It runs on a JBoss 4.2.3.

我遵循以下示例: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop-aj-ltw-first-example

我有我的简介课:

package com.al6.borneIntranet.business.log;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.util.StopWatch;
import org.springframework.core.annotation.Order;

@Aspect
public class ProfilingAspect {

    @Around("methodsToBeProfiled()")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch sw = new StopWatch(getClass().getSimpleName());
        try {
            sw.start(pjp.getSignature().getName());
            return pjp.proceed();
        } finally {
            sw.stop();
            System.out.println(sw.prettyPrint());
        }
    }

    @Pointcut("execution(public * com.al6.borneIntranet..*.*(..))")
    public void methodsToBeProfiled(){}
}

我创建一个META-INF/aop.xml文件:

I create a META-INF/aop.xml file :

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "https://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>

    <weaver>
        <!-- only weave classes in our application-specific packages -->
        <include within="com.al6.*"/>
    </weaver>

    <aspects>
        <!-- weave in just this aspect -->
        <aspect name="com.al6.borneIntranet.business.log.ProfilingAspect"/>
    </aspects>

</aspectj>

我将这一行添加到我的bean定义xml中:

I add this line in my bean definitions xml :

<context:load-time-weaver/>

我有这个依赖项:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.0.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.0.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.0.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.0.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.9</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.9</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-instrument</artifactId>
  <version>4.0.6.RELEASE</version>
</dependency>

几乎可以使用,但是使用该应用程序时在启动时出现此错误:

It almost works, but I have this error at startup when I use the application :

2021-04-29 18:41:46,960 ERROR [STDERR] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.weaving.AspectJWeavingEnabler#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [org.jboss.mx.loading.UnifiedClassLoader3] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar 

我从maven存储库下载spring-instrument-4.0.6.RELEASE.jar文件,然后在运行启动脚本中添加javaagent部分:

I download the spring-instrument-4.0.6.RELEASE.jar file from maven repository, then I add the javaagent part in the run startup script :

/opt/jdk/bin/java -Dprogram.name=run.sh -javaagent:/opt/jboss/lib/org.springframework.instrument.jar -server -Xms2048m -Xmx2048m -XX:MaxPermSize=256M ...

但是错误仍然出现,就像我什么都不做.

But the error still appear, like I'm doing nothing.

有没有一种方法可以在启动时不轻易添加此选项?为什么甚至当我添加它时也没有使用它?

Is there a way to not add this option at startup easily ? Why even when I add it it is not used ?

我尝试添加adspectj启动代理,也无法正常工作,同样的错误,看来该应用程序未检测到该选项:

I try to add the adspectj launch agent, didn't work either, same error, it looks like the option is not detected by the application :

/bin/sh /opt/jboss/bin/run.sh -c commandes -b 0.0.0.0 -Djboss.partition.name=jboss-commande-preprod1-partition 
admin    22263 47.6 76.7 4911056 4023536 pts/0 Sl   16:03   2:14 /opt/jdk/bin/java -Dprogram.name=run.sh -javaagent:/opt/jboss/lib/aspectjweaver-1.8.9.jar -javaagent:/opt/jboss/lib/org.springframework.instrument.jar -server -Xms3500m -Xmx
3500m -XX:MaxPermSize=512M -Dfile.encoding=UTF-8 -Djava.awt.headless=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dc
om.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:+UseG1GC -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Djava.net.prefer
IPv4Stack=true -Djava.endorsed.dirs=/opt/jboss/lib/endorsed -classpath /opt/jboss/bin/run.jar:/opt/jdk/lib/tools.jar org.jboss.Main -c commandes -b 0.0.0.0 -Djboss.partition.name=jboss-commande-preprod1-partition

尝试几件事:

  • 使用Jboss timeweaver:

  • Using Jboss timeweaver :

创建名称为"loadTimeWeaver"的Bean时出错:实例化Bean失败;嵌套的异常是org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.instrument.classloading.jboss.JBossLoadTimeWeaver]:构造方法抛出了异常.嵌套的异常是java.lang.IllegalStateException:无法初始化JBoss LoadTimeWeaver,因为JBoss 6 API类不可用

Error creating bean with name 'loadTimeWeaver': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.instrument.classloading.jboss.JBossLoadTimeWeaver]: Constructor threw exception; nested exception is java.lang.IllegalStateException: Could not initialize JBoss LoadTimeWeaver because the JBoss 6 API classes are not available

当然,我正在使用Jboss 4.3.2

Of course, I'm on Jboss 4.3.2

  • 添加"-verbose -showWeaveInfo -debug"在aop.xml中:

检测到该文件,因为我在启动时有以下几行:

The file is detected because I have this lines at startup :

2021-05-03 15:11:42,267 ERROR [STDERR] [UnifiedClassLoader3@341a736] info AspectJ Weaver Version 1.8.9 built on Monday Mar 14, 2016 at 21:18:16 GMT
2021-05-03 15:11:43,253 ERROR [STDERR] [UnifiedClassLoader3@341a736] info register classloader org.jboss.mx.loading.UnifiedClassLoader3@341a736
2021-05-03 15:11:43,253 ERROR [STDERR] [UnifiedClassLoader3@341a736] info using configuration file:/opt/jboss-4.2.3.GA/server/weldom_commandes/tmp/deploy/tmp6458410370486804467BorneIntranetServeurMetier.ear-contents/BorneIntranetServeurMetier.jar!/META-INF/aop.xml
2021-05-03 15:11:43,253 ERROR [STDERR] [UnifiedClassLoader3@341a736] info using configuration file:/opt/jboss-4.2.3.GA/server/weldom_commandes/tmp/deploy/tmp6458410370486804467BorneIntranetServeurMetier.ear-contents/spring-aspects-4.0.6.RELEASE.jar!/META-INF/aop.xml
2021-05-03 15:11:43,259 ERROR [STDERR] [UnifiedClassLoader3@341a736] info register aspect com.al6.borneIntranet.business.log.ProfilingAspect
2021-05-03 15:11:43,474 ERROR [STDERR] [UnifiedClassLoader3@341a736] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
2021-05-03 15:11:43,520 ERROR [STDERR] [UnifiedClassLoader3@341a736] info register aspect org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
2021-05-03 15:11:43,536 ERROR [STDERR] [UnifiedClassLoader3@341a736] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
2021-05-03 15:11:43,544 ERROR [STDERR] [UnifiedClassLoader3@341a736] info register aspect org.springframework.cache.aspectj.AnnotationCacheAspect
2021-05-03 15:11:43,559 ERROR [STDERR] [UnifiedClassLoader3@341a736] debug not weaving 'com.al6.borneIntranet.business.ServiceArchiveEntryPointBean'
...

  • 我放的时候:

    • When I put :

      <context:load-time-weaver
                weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
      

    • 我有一个略有不同的错误,但结果相同:

      I have a slightly different error, but same result :

      2021-05-03 15:15:03,475 ERROR [STDERR] java.lang.IllegalStateException: Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation.
      2021-05-03 15:15:03,476 ERROR [STDERR]  at org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver.addTransformer(InstrumentationLoadTimeWeaver.java:88)
      

      但是我已经添加了它:

      -javaagent:/opt/jboss/lib/org.springframework.instrument.jar
      
      ls -lrt /opt/jboss/lib : 
      -rwxrwxrwx 1 admin users 7244 2021-04-30 16:03 /opt/jboss/lib/org.springframework.instrument.jar*
      

      推荐答案

      找不到加载时编织为什么不起作用的原因.

      Can't find why load-time weaving don't work.

      所以,在我工作的人只是问我为什么要进行加载时编织,为什么不只是进行编译时编织".

      So, somebody at my work just ask me why I want to do loadtime weaving, why don't just do "compile time weaving".

      我只是将其添加到我的pom.xml中:

      I just add this in my pom.xml :

      <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>aspectj-maven-plugin</artifactId>
          <version>1.7</version>
          <configuration>
              <complianceLevel>1.6</complianceLevel>
              <source>1.6</source>
              <target>1.6</target>
              <showWeaveInfo>true</showWeaveInfo>
              <verbose>true</verbose>
              <Xlint>ignore</Xlint>
              <encoding>UTF-8 </encoding>
          </configuration>
          <executions>
              <execution>
                  <goals>
                      <!-- use this goal to weave all your main classes -->
                      <goal>compile</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
      

      我删除了javaagent的东西.

      I delete javaagent things.

      构建,运行并运行tada,它可以正常工作.

      Build, run, and tada, it's working.

      我不明白为什么几乎没有人谈论这种方法,该方法不需要在启动参数中添加任何内容,也不需要添加任何复杂的东西,并且它的工作要容易得多.

      I can't understand why almost nobody talk about this method, which does not require adding anything in startup arguments, anything complex, and it works much much easier.

      这有很大的不便之处吗?实际上,我想知道它是否还更好,因为它在编译时就编织了类,因此它将使用更少的系统资源?

      Is there a big inconvenient at this ? In fact, I wonder if it's not even better, because it weave classes at compile time, so it will be using less system ressource ?

      这篇关于无法为AspectJ添加javaagent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆