как настроить ткачество во время загрузки с помощью Spring и Tomcat БЕЗ использования -javaagent в командной строке

Я использую Spring 3.2.9, Tomcat 6.0.44

Я пытаюсь настроить поставщик инструментов Spring моего приложения (например, spring-instrumentation.jar) для ткачества во время загрузки, когда оно развернуто на Tomcat.

У меня есть требование НЕ использовать: -javaagent: /path/path/spring-instrument.jar "в командной строке, чтобы выполнить настройку.

Я читал, что могу настроить инструментарий Spring, изменив элемент <Context> в конфигурации Tomcat моего приложения (либо в файле server.xml Tomcat, либо в context.xml моего веб-приложения). Добавление соответствующего элемента <Context> в server.xml приводит к тому, что мое приложение правильно настроено для работы с поставщиком инструментов Spring. Добавление его в context.xml (см. Ниже) НЕ приводит к рабочей настройке.

У меня есть файл META-INF / aop.xml, выглядит так:

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

Я также указываю, что хочу использовать ткачество во время загрузки, добавив это в мою конфигурацию контекста Spring:

 <context:load-time-weaver />

И я добавляю этот jar в classpath моего приложения: spring-instrument-tomcat.jar

ЧТО Я ПОПРОБОВАЛ

При запуске Tomcat, если я идентифицирую расположение spring-instrument.jar в командной строке, используя параметр -javaagent, например:

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

Все отлично работает

Затем я удалил «-javaagent: /path/path2/spring-instrument-3.2.9.RELEASE.jar» из командной строки. В файле Tomcat server.xml (расположенном в $ CATALINE_HOME / conf) я добавил элемент <Context> к элементу <Host>, например:

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

С такой конфигурацией все ведет себя правильно. Однако у меня есть требование не изменять Tomcat server.xml, так как у меня нет контроля над server.xml (DevOps делает, и неохотно изменяет его).

Затем я удалил элемент <Context> из servercat.xml Tomcat. СогласноВесенние документыЯ могу добавить /META-INF/context.xml в мое веб-приложение и поместить элемент <Context>, который раньше был в файле server.xml Tomcat, в context.xml, например, так:

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

Однако, когда я перезагружаю Tomcat, в журналах появляется сообщение об ошибке:

    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

Покопавшись, я прочитал что-то, что предложил мне изменить<context:load-time-weaver/> элемент в моей конфигурации Spring, как это:

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

И добавьте банку, содержащую InstrumentationLoadTimeWeaver.class, в мой путь к классам.

Однако, когда я делаю это, я получаю это сообщение об ошибке в журналах:

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

Может кто-нибудь объяснить, как настроить ткачество во время загрузки с помощью Spring и Tomcat БЕЗ использования -javaagent в командной строке и БЕЗ изменения server.xml?

Ответы на вопрос(2)

Ваш ответ на вопрос