我们有一个生产Java 1.6 / Tomcat 7 / Spring 4应用程序。
我们将其移至Openjdk11。这意味着Spring 5和我认为它可能还包括Tomcat 9,因为我们正在更新其他所有内容。
问题是自我解释的声音:
错误org.springframework.web.context.ContextLoader-上下文初始化失败 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为'rootContextConfig'的bean时出错:通过字段'entityManagerFactory'表示的不满足的依赖关系;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建在com.xxxxx.config.RootContextConfig中定义的名称为'entityManagerFactory'的bean时出错:调用init方法失败;嵌套异常为java.lang.IllegalStateException:必须从Java代理开始才能使用InstrumentationLoadTimeWeaver。请参阅Spring文档。
一切顺利。唯一的问题是我们已经有了Spring Insturment Java代理
-javaagent:${CATALINA_HOME}/lib/spring-instrument-5.1.5.RELEASE.jar
就像我上面说的那样,这是我们正在更新的所有工作代码。
我有信心正在加载LTW,因为我们可以看到InstrumentationLoadTimeWeaver类产生的错误。
@Override
public void addTransformer(ClassFileTransformer transformer) {
Assert.notNull(transformer, "Transformer must not be null");
FilteringClassFileTransformer actualTransformer =
new FilteringClassFileTransformer(transformer, this.classLoader);
synchronized (this.transformers) {
Assert.state(this.instrumentation != null,
"Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation.");
this.instrumentation.addTransformer(actualTransformer);
this.transformers.add(actualTransformer);
}
}
我只是无法弄清楚如何使用空工具实例化它。显然我缺少了一些东西。可能是一些小而愚蠢的东西。但是现在我没主意了。
答案 0 :(得分:0)
似乎问题在于类加载
添加'-verbose:class'选项以查看是否已加载InstrumentationLoadTimeWeaver
尝试将此选项添加到您的tomcat contexct配置
<Context>
...
<Loader delegate="true"/>
...
</Context>
Tomcat 7.0.27中进行了一些更改,可以触发此问题
使Catalina.getParentClassLoader的实现与代码库中的类似方法保持一致,如果未设置父类加载器,则使它返回系统类加载器。 (市场)