como configurar a tecelagem de tempo de carregamento com Spring e Tomcat SEM usar o -javaagent na linha de comando

Estou usando o Spring 3.2.9, Tomcat 6.0.44

Estou tentando configurar o provedor de instrumentação Spring do meu aplicativo (por exemplo, spring-instrumentation.jar) para tecelagem em tempo de carregamento, quando ele é implantado no Tomcat.

Eu tenho um requisito para NÃO usar: "-javaagent: /path/path/spring-instrument.jar" na linha de comando para fazer a configuração.

Eu li que posso configurar a instrumentação Spring modificando o elemento <Context> da configuração do Tomcat do meu aplicativo (no server.xml do Tomcat ou no context.xml do meu aplicativo da web). Adicionar o elemento <Context> apropriado ao server.xml faz com que meu aplicativo seja configurado corretamente para ser executado com o provedor de instrumentação do Spring. Adicioná-lo ao context.xml (veja abaixo) NÃO resulta em uma configuração funcional.

Eu tenho um arquivo META-INF / aop.xml, fica assim:

    <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>

Também especifiquei que quero usar a tecelagem em tempo de carregamento adicionando isso à minha configuração de contexto do Spring:

 <context:load-time-weaver />

E adiciono este jar ao caminho de classe do meu aplicativo: spring-instrument-tomcat.jar

O QUE EU TENTEI:

Ao iniciar o Tomcat, se eu identificar o local do spring-instrument.jar na linha de comando usando o parâmetro -javaagent como este:

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

Tudo funciona bem.

Em seguida, removi "-javaagent: /path/path2/spring-instrument-3.2.9.RELEASE.jar" da linha de comando. No arquivo server.xml do Tomcat (localizado em $ CATALINE_HOME / conf), adicionei um elemento <Context> ao elemento <Host>, assim:

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

Com essa configuração, tudo se comporta corretamente. No entanto, tenho o requisito de não modificar o server.xml do Tomcat, pois não tenho controle sobre o server.xml (o DevOps possui e reluta em modificá-lo).

Em seguida, removi o elemento <Context> do server.xml do Tomcat. De acordo comDocumentos da primavera, Posso adicionar um /META-INF/context.xml ao meu aplicativo da web e colocar o elemento <Context> que costumava estar no server.xml do Tomcat no context.xml, da seguinte maneira:

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

No entanto, quando reinicio o Tomcat, recebo uma mensagem de erro nos logs dizendo:

    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

Depois de pesquisar, li algo que sugeria modificar o<context:load-time-weaver/> elemento na minha configuração do Spring, assim:

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

E adicione o jar que contém InstrumentationLoadTimeWeaver.class ao meu caminho de classe.

No entanto, quando faço isso, recebo esta mensagem de erro nos logs:

        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....

Alguém pode explicar como configurar a tecelagem em tempo de carregamento com o Spring e o Tomcat SEM usar o -javaagent na linha de comando e SEM modificar o server.xml?

questionAnswers(3)

yourAnswerToTheQuestion