cómo configurar el tejido de tiempo de carga con Spring y Tomcat SIN usar -javaagent en la línea de comando

Estoy usando Spring 3.2.9, Tomcat 6.0.44

Estoy tratando de configurar el proveedor de instrumentación Spring de mi aplicación (por ejemplo, spring-instrumentation.jar) para el tejido de tiempo de carga, cuando se implementa en Tomcat.

Tengo el requisito de NO usar: "-javaagent: /path/path/spring-instrument.jar" en la línea de comando para hacer la configuración.

He leído que puedo configurar la instrumentación Spring modificando el elemento <Context> de la configuración de Tomcat de mi aplicación (ya sea en el server.xml de Tomcat o en el context.xml de mi aplicación web). Agregar el elemento <Context> apropiado al server.xml hace que mi aplicación se configure correctamente para ejecutarse con el proveedor de instrumentación de Spring. Agregarlo al context.xml (ver más abajo) NO da como resultado una configuración que funcione.

Tengo un archivo META-INF / aop.xml, se ve así:

    <aspectj>
        <weaver options="-verbose -showWeaveInfo -debug">
            <include within="com.mv.xx.services..*"/>
            <exclude within="com.mv.xx.aop..*"/>
        </weaver>
        <aspects>
            <aspect name="com.mv.xx.aop.MyAspect"/>
        </aspects>
    </aspectj>

También especifico que quiero usar el tejido de tiempo de carga agregando esto a mi configuración de contexto Spring:

 <context:load-time-weaver />

Y agrego este jar al classpath de mi aplicación: spring-instrument-tomcat.jar

Lo que he probado:

Al iniciar Tomcat, si identifico la ubicación de spring-instrument.jar en la línea de comando usando el parámetro -javaagent como este:

-javaagent:/path/path2/spring-instrument-3.2.9.RELEASE.jar

Todo funciona bien

A continuación, eliminé "-javaagent: /path/path2/spring-instrument-3.2.9.RELEASE.jar" de la línea de comandos. En el archivo server.xml de Tomcat (ubicado en $ CATALINE_HOME / conf), agregué un elemento <Context> al elemento <Host>, así:

<Context path="/myApp" docBase="myApp">
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>

Con esta configuración todo se comporta correctamente. Sin embargo, tengo el requisito de no modificar el server.xml de Tomcat, ya que no tengo control sobre el server.xml (DevOps sí, y es reacio a modificarlo).

Luego eliminé el elemento <Context> del servidor server.xml de Tomcat. De acuerdo con laDocumentos de primavera, Puedo agregar un /META-INF/context.xml a mi aplicación web y poner el elemento <Context> que solía estar en server.xml de Tomcat en context.xml, de esta manera:

        <Context>
            <Context path="/myApp" docBase="myApp">
                <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
            </Context>
        </Context>

Sin embargo, cuando reinicio Tomcat, recibo un mensaje de error en los registros que dice:

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    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.apache.catalina.loader.WebappClassLoader] 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

Después de cavar, leí algo que sugería que modificara el<context:load-time-weaver/> elemento en mi configuración de Spring, así:

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

Y agregue el jar que contiene InstrumentationLoadTimeWeaver.class a mi classpath.

Sin embargo, cuando hago eso, recibo este mensaje de error en los registros:

        SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
        java.lang.IllegalStateException: Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation.
    etc....

¿Alguien puede explicar cómo configurar el tejido de tiempo de carga con Spring y Tomcat SIN usar -javaagent en la línea de comandos y SIN modificar el server.xml?

Respuestas a la pregunta(3)

Su respuesta a la pregunta